机器学习实战 第五章 logistic回归
二值型输出分类器。
5.1 基于logistic回归和sigmoid函数的分类
一个很有意思的阶跃函数叫做海维赛德阶跃函数,英文是heaviside step function,我原本以为这会是个人名——海维赛德,结果一看英文heaviside,这个意思难道不是一边重?因为一边重,所以一边就被压成了0,另一边就是1.
sigmoid:
def sigmoid(inX):
return 1.0/(1+exp(-inX));
5.2 基于最优化方法的最佳回归系数确定
sigmoid函数的输入相对来说简单,就是一个数值,然后对其进行计算。之所以将原来的大量计算进行简化,成为了一个数,我认为其中原因如下:1.label是二值,所以其最后进行判断相对简单,通过sigmoid函数。2.对于其进行参数的调整,主要是为了能够进行区分性的度量,参数可以看作是对于每一个维度上的大小的度量。所以经过参数放缩之后,第一个作用就是能够对于原来的数据进行放缩,第二个就是选取出主要的影响因素。
5.2.1 梯度上升法
这其中有个梗,怎么就突然从梯度变成了对于参数的处理了呢。
梯度实际上就是在每个变量上面的变化量的大小。变化大的就多来点儿,变化小的就少来点儿。这样一种类似于贪心的策略能够保证尽快的达到最大或者最小值点。
而用梯度来对于原始的参数w进行更改我认为是这样的原因,求偏导实际上就是对于w进行一个判断,到底哪个w变化最大,那么这最后的偏导启示就是输入,输入的数值越大,那么偏导也就越大,这意味着影响也就越大。
梯度上升算法是w+偏导,而下降时w-偏导。感觉这个梗得理解一下。因为虽然说是这么计算,似乎是因为符号上能够说通。
5.2.2 训练算法:使用梯度上升找到最佳参数
def loadDataSet():
dataMat = [];labelMat = [];
fr = open('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;