最近学习《机器学习实战》这本书,感觉到自己的数学知识严重不足。对于梯度上升法,大家可能都接触过,本章利用Python的实现很精炼,仅用一行代码就复现了,但里面包含了很多的数学推导,经过查找各方资料,现在终于搞明白了,也希望能帮助到对此感到困惑的朋友。
一、首先介绍一下Logistic回归算法:
- 算法主要思想:根据已知的数据建立分类边界线(面)的回归方程,依次进行分类。
- 优缺点:
(1)优点:计算代价不高,易于理解和实现;
(2)缺点:容易欠拟合。 - 分类器—Logistic函数
截取书中的函数图像,如下图所示。很显然,当样本数量很大时,函数图像与单位阶跃函数很像。
函数表达式:
h(z)=11+e−z
对于一个数据样本x ,这里需要估计它的权重值w ,那么估计函数可表示为:
hw(x)=11+e−wTx (1)
分类规则:
resule={1 if hw(x)>0.50 if hw(x)<0.5 算法流程:
算法实现:
由算法流程可知,算法的关键就是寻求最优权重值w 。那么下面将逐步推导出w 的迭代公式。
对于样本x ,由(1)式可以得到它的概率分布:
P(y=1|x,w)=hw(x); P(y=0|x,w)=1−hw(x)
将上式合并后可得到:
P(y|x;w)=(hw(x))y(1−hw(x))(1−y),yϵ{0,1} (2)
根据式(2),对w 进行最大似然估计:
L(w)=P(Y|x:w)=∏iP(yi|xi;w)=∏i(hw(xi)yi)(1−hw(xi)(1−yi))
为了计算方便,对上式取对数,得到:
l(w)=log(L(w))=∑i=1m[yiloghw(xi)+log(1−hw(xi))(1−yi)] (3)
对上式,利用梯度上升法求解w: ,梯度上升法公式:
w=w+α∇wl(w)
接下来计算∇wl(w):
∂l(w)∂w=∑i=1m[yi1hw(xi)∂hw∂w−(1−yi)11−hw(xi)∂hw(xi)∂w]=∑i=1m[yi(1−hw(xi))−(1−yi)hw(xi)hw(xi)(1−hw(xi))]∂hw∂w=∑i=1myi−hw(xi)hw(xi)(1−hw(xi))xie−wTxi(1+e−wTxi)2 =∑i=1m(yi−hw(xi))xi
从而得到w 的迭代公式:
w=w+α(y−hw(x))x (4)
其中,α 为步长,y−hw(x) 为实际值与预测值之差,即书中所说的error ,而x 为数据样本。
基于以上分析,就可利用Python实现算法了。
二、Python实现
这里仅列出利用梯度上升法求最优权重值的Python程序:
'''梯度上升法寻找最优权重值'''
def Search(dataList,labeList):
dataMat=mat(dataList)
labeMat=mat(labeList).transpose()
alpha=0.001
maxIter=500
m,n=shape(dataMat)
weights=ones([n,1])
w1=zeros(maxIter);w2=zeros(maxIter);w3=zeros(maxIter)
for k in range(maxIter):
h=sigFunc(dataMat*weights)
error=labeMat-h
weights=weights+alpha*dataMat.transpose()*error
return weights
可以注意到,程序中求
其中
三、sklearn实现Logistic回归
def sklearn_Logistic():
'''导入必要的包'''
from sklearn import datasets
import numpy as np
from sklearn.model_selection import train_test_split
'''加载sklearn自带的iris数据集'''
iris=datasets.load_iris()
x=iris.data
y=iris.target
'''将数据集分割,分割比例为0.3'''
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)
'''数据标准化'''
from sklearn.preprocessing import StandardScaler
sc=StandardScaler()
sc.fit(x_train)
x_train_std=sc.transform(x_train)
x_test_std=sc.transform(x_test)
'''建立LR模型,并计算准确率'''
from sklearn.linear_model import LogisticRegression
lr=LogisticRegression(C=1000.0,random_state=0)
lr.fit(x_train_std,y_train)
print('模型准确率为: ', np.mean(lr.predict(x_test_std)==y_test))
输出:
模型准确率为: 0.977777777778
参考:
1、《Machine Learning in Action》 译名:《机器学习实战》 作者:Peter Harrington 译者:李锐 李鹏 曲亚东 王斌
出版社:人民邮电出版社
2、这篇文章介绍的很详细:http://blog.csdn.net/dongtingzhizi/article/details/15962797