赞
踩
前几天使用后sklearn实现了逻辑回归,这里用纯python实现逻辑回归.
首先,我们定义一个sigmoid函数
def sigmoid(inX): #sigmoid函数
return 1.0/(1+exp(-inX))
这里使用梯度上升进行逻辑回归
#梯度上升求最优参数
def gradAscent(dataMat, labelMat):
dataMatrix=mat(dataMat) #将读取的数据转换为矩阵
classLabels=mat(labelMat).transpose() #将读取的数据转换为矩阵
m,n = shape(dataMatrix)
alpha = 0.001 #设置梯度的阀值,该值越大梯度上升幅度越大
maxCycles = 500 #设置迭代的次数,一般看实际数据进行设定,有些可能200次就够了
weights = ones((n,1)) #设置初始的参数,并都赋默认值为1。注意这里权重以矩阵形式表示三个参数。
for k in range(maxCycles):
h = sigmoid(dataMatrix * weights)
error = (classLabels - h) #求导后差值
weights = weights + alpha * dataMatrix.transpose()* error #迭代更新权重
return weights
代码里的error与weights已经再上面的公式中可以体现。
考虑到当数据量比较大时,如果每次迭代都选择全量数据进行计算,计算量会非常大。所以采用每次迭代中一次只选择其中的一行数据进行更新权重。
def stocGradAscent0(dataMat, labelMat):
dataMatrix=mat(dataMat)
classLabels=labelMat
m,n=shape(dataMatrix)
alpha=0.01
maxCycles = 500
weights=ones((n,1))
for k in range(maxCycles):
for i in range(m): #遍历计算每一行
h = sigmoid(sum(dataMatrix[i] * weights))
error = classLabels[i] - h
weights = weights + alpha * error * dataMatrix[i].transpose()
return weights
对方法进一步进行改进,在每次迭代中随机选择样本来更新权重,并且随迭代次数增加,权重变化越小。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。