您的位置:首页 > 编程语言 > Python开发

史上最直白的logistic regression教程 之 二

2015-11-17 15:02 701 查看

实现线性拟合

我们用python2.7实现上一篇的推导结果。请先安装python matplotlib包和numpy包。

具体代码如下:

#!/usr/bin/env python
#! -*- coding:utf-8 -*-

import matplotlib.pyplot as plt
from numpy import *

#创建数据集
def load_dataset():
n = 100
X = [[1, 0.005*xi] for xi in range(1, 100)]
Y = [2*xi[1]  for xi in X]
return X, Y

#梯度下降法求解线性回归
def grad_descent(X, Y):
X = mat(X)
Y = mat(Y)
row, col = shape(X)
alpha = 0.001
maxIter = 5000
W = ones((1, col))
for k in range(maxIter):
W = W + alpha * (Y - W*X.transpose())*X
return W

def main():
X, Y = load_dataset()
W = grad_descent(X, Y)
print "W = ", W

#绘图
x = [xi[1] for xi in X]
y = Y
plt.plot(x, y, marker="*")
xM = mat(X)
y2 = W*xM.transpose()
y22 = [y2[0,i] for i in range(y2.shape[1]) ]
plt.plot(x, y22, marker="o")
plt.show()

if __name__ == "__main__":
main()


代码超级简单,load_dataset函数创建了一个y=2x的数据集,grad_descent函数求解优化问题。

在grad_descent里多了两个小东西,alpha是学习速率,一般取0.001~0.01,太大可能会导致震荡,求解不稳定。maxIter是最大迭代次数,它决定结果的精确度,通常是越大越好,但越大越耗时,所以通常需要试算以下,也可以另外写一个判定标准,比如当Y−WXT小于多少的时候就不再迭代。

我们来看一下效果:

当maxIter=5时,拟合结果是这样的:



如果maxIter=50,拟合结果是这样的:



如果maxIter=500,拟合结果是这样的:



如果maxIter=1000,拟合结果是这样的:



如果maxIter=5000,拟合结果是这样的:



5000次的结果几乎完美,两条曲线图形重合。就酱。

本篇到此结束,下一篇,我们开始把logistic函数加进来,推导logistic regression。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python logistic