逻辑回归也被称为广义线性回归模型,它与线性回归模型的形式基本相同,最大的区别是它们的因变量不同,如果是连续的,就是多重线性回归,如果是二项分布,就是 Logistic回归。
Logistic回归虽然名字里带“回归”,但它实际上是一种分类方法,主要用于二分类问题。逻辑回归就是这样的一个过程:面对一个回归或者分类问题,建立相应的函数,然后通过优化方法迭代求解出最优的模型参数,然后测试验证这个求解的模型的好坏。
构造预测函数
构造损失函数
梯度下降法求解最小值
数据操作
from numpy import *
import pandas as pd
from pandas import DataFrame
filename='./data.txt' #文件目录
def loadDataSet(): #读取数据(这里只有两个特征)
df=pd.read_csv(filename)
dataMat = []
labelMat = []
fr = open(filename)
for line in fr.readlines():
lineArr = line.strip().split()
dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) #前面的1,表示方程的常量。比如两个特征X1,X2,共需要三个参数,W1+W2*X1+W3*X2
labelMat.append(int(lineArr[2]))
return dataMat,labelMat
def sigmoid(inX): #sigmoid函数
return 1.0/(1+exp(-inX))
def GradAscent(dataMat, labelMat): #改进版随机梯度上升,在每次迭代中随机选择样本来更新权重,并且随迭代次数增加,权重变化越小。
dataMatrix=mat(dataMat)
classLabels=labelMat
m,n=shape(dataMatrix)
weights=ones((n,1))
maxCycles=500
for j in range(maxCycles): #迭代
dataIndex=[i for i in range(m)]
for i in range(m): #随机遍历每一行
alpha=4/(1+j+i)+0.0001 #随迭代次数增加,权重变化越小。
randIndex=int(random.uniform(0,len(dataIndex))) #随机抽样
h=sigmoid(sum(dataMatrix[randIndex]*weights))
error=classLabels[randIndex]-h
weights=weights+alpha*error*dataMatrix[randIndex].transpose()
del(dataIndex[randIndex]) #去除已经抽取的样本
return weights
def plotBestFit(weights): #画出最终分类的图
import matplotlib.pyplot as plt
dataMat,labelMat=loadDataSet()
dataArr = array(dataMat)
n = shape(dataArr)[0]
xcord1 = []; ycord1 = []
xcord2 = []; ycord2 = []
for i in range(n):
if int(labelMat[i])== 1:
xcord1.append(dataArr[i,1])
ycord1.append(dataArr[i,2])
else:
xcord2.append(dataArr[i,1])
ycord2.append(dataArr[i,2])
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')
ax.scatter(xcord2, ycord2, s=30, c='green')
x = arange(-3.0, 3.0, 0.1)
y = (-weights[0]-weights[1]*x)/weights[2]
ax.plot(x, y)
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()
plt.savefig('logExample.png', format='png')
def main():
datamat,labelmat=loadDataSet()
weights= GradAscent(datamat, labelmat).getA()
plotBestFit(weights)
if __name__=='__main__':
main()