需求
对给定的先验数据集,使用logistic回归算法对新数据分类
代码实现
1.定义sigmoid函数
def loadDataSet():
dataMat = []; labelMat = []
fr = open('d:/testSet.txt')
for line in fr.readlines():
lineArr = line.strip().split()
dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
labelMat.append(int(lineArr[2]))
return dataMat,labelMat
def sigmoid(inX):
return 1.0/(1+exp(-inX))
2.返回回归系数
对应于每个特征值,for循环实现了递归梯度上升算法。
def gradAscent(dataMatIn, classLabels):
dataMatrix = mat(dataMatIn) #将先验数据集转换为NumPy 矩阵
labelMat = mat(classLabels).transpose() #将先验数据的类标签转换为NumPy 矩阵
m,n = shape(dataMatrix)
alpha = 0.001 #设置逼近步长调整系数
maxCycles = 500 #设置最大迭代次数为500
weights = ones((n,1)) #weights即为需要迭代求解的参数向量
for k in range(maxCycles): #heavy on matrix operations
h = sigmoid(dataMatrix*weights) #代入样本向量求得“样本y”sigmoid转换值
error = (labelMat - h) #求差
weights = weights + alpha * dataMatrix.transpose()* error #根据差值调整参数向量
return weights
我们的数据集有两个特征值分别是x1,x2。在代码中又增设了x0变量。
结果,返回了特征值的回归系数:
[[ 4.12414349]
[ 0.48007329]
[-0.6168482 ]]
我们得出x1和x2的关系(设x0=1),0=4.12414349+0.48007329x1-0.6168482x2
3.线性拟合线
画出x1与x2的关系图——线性拟合线