svm由于篇幅较大,暂时延迟一下,先更新一个logistic回归。
logistic回归是一种最优化算法,基本思想是根据现有数据对分类边界线建立回归公式,以此进行分类。训练分类器的做法是寻找最佳拟合参数,是一种二值型分类算法,当然二值型分类可以推广到n类型分类,对每一种分类需求分别建立模型即可。
(1)加载数据
我们在二维坐标系上建立模型,以往对应的xy轴分别设为X1,X2,回归方程的常量b看成1.0*b,加载的数据格式为多行,每一行前两个数字分别为X1,X2,最后一个数字为label,以此加载数据生成列表的代码如下:
def loadDataSet():
dataMat=[]
labelMat=[]
with open('testSet.txt') as fr:
data=fr.readline()
for line in data:
lineArr=line.strip().split()
dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])
labelMat.append(int(lineArr[2]))
return dataMat,labelMat
(2)sigmoid函数
为了实现logistic分类器,我们可以在每个特征上乘以一个回归系数,相加后带入sigmoid函数,进而得到一个范围在0~1之间的任意数值。大于0.5的分到1类,小于0.5分到0类。所以logistic回归也被看成是一种概率估计。
sigmoid函数的形式是:
from numpy import exp
'''
code
'''
def sigmoid(inX):
return 1.0/(1+exp(-inX))
(3)梯度上升算法
def gradAscent(dataMatIn,classLabels):
dataMatrix=mat(dataMatIn)
labelMat=mat(classLabels)
m,n=shape(dataMatrix)
alpha=0.01
maxCycles=1000
weights=ones((n,1))
for k in range(maxCycles):
h=sigmoid(dataMatrix*weights)
error=(labelMat-h)
weights=weights+alpha*dataMatrix.transpose()*error
return weights
其中利用numpy的mat函数转化成numpy矩阵便于计算,下面给出一个简单的IDLE测试矩阵乘法的例子:
>>> weights
array([[2.],
[1.],
[1.]])
>>> datas
matrix([[1, 2, 3],
[2, 3, 4],
[3, 4, 5]])
>>> datas*weights
matrix([[ 7.],
[11.],
[15.]])
>>>
这段代码的数学推导weights=weights+alpha*dataMatrix.transpose()*error 简单来说就是看误差方向
方法的核心是,只要沿着函数的梯度方向搜寻,就可以找到函数的最佳参数。但该方法在每次更新回归系数时都需要遍历整个数据集,对于大数据效果还不理想。所以还需要一个“随机梯度上升算法”对其进行改进。该方法一次仅用一个样本点来更新回归系数,所以效率要高得多。