您的位置:首页 > 其它

Stanford机器学习 -- 对Linear Regression 的补充

2015-06-30 19:28 267 查看

Linear Regression的步骤

初始化 parameters θi (i = 0 ,1,……,n)

选择α(学校速率,可以尝试不同的值找到最合适的)

1.设计Cost Function



2.对代价函数求导数



循环(最终循环结束的条件):

For循环(对每个参数进行更新):



循环结束的条件:指定一个最小更新误差,每次循环完成后计算误差函数J更新后和更新前的误差,如果小于最小更新误差停止循环。也可以自己设置一个足够大的值。

vertorization(向量化)





这是按照Andrew Ng的思路写成的,只是为了编写程序方便,具体用了什么数学知识,也不太懂。

实现代码

.1 python

1.第一种实现用梯度下降法:

from numpy import *
import matplotlib.pyplot as plt
import numpy as np

def Gd_algorithm( alpha ):

dataMat =  array([[1,2],[1,4],[1,5],[1,1],[1,6]])
labelMat = array([2.1,3.5,5.3,0.9,6.1])
weights = ones((shape(dataMat)[1] , 1))

err_inf = inf
flag = True

while  flag :
flag = False
error = dot(dataMat , weights).T[0] - labelMat.T
#print error

err_sum_new = sum(error ** 2)
if err_sum_new < err_inf:
err_inf = err_sum_new
flag = True
else:
break

for i in range(shape(weights)[0]):
weights[i] = weights[i] - alpha * (1.0/shape(dataMat)[0]) * dot(error , dataMat.T[i])

print weights

plt.scatter(dataMat.T[1] , labelMat)
x = dataMat.T[1]
y = weights[0] + weights[1]* x
plt.plot(x,y)
plt.show()






2用向量化代码编写

from numpy import *
import matplotlib.pyplot as plt
import numpy as np

def Gd_algorithm( alpha ):

dataMat =  array([[1,2],[1,4],[1,5],[1,1],[1,6]])
labelMat = array([[2.1],[3.5],[5.3],[0.9],[6.1]])
weights = ones((shape(dataMat)[1] , 1))

err_inf = inf
flag = True

while  flag :
flag = False
error = dot(dataMat , weights) - labelMat

err_sum_new = sum(array(error) ** 2)
if err_sum_new < err_inf:
err_inf = err_sum_new
flag = True
else:
break

weights = weights - alpha * (1.0/shape(dataMat)[0]) * dot(dataMat.T , error)

print weights

plt.scatter(dataMat.T[1] , labelMat)
x = dataMat.T[1]
y = weights.tolist()[0][0] + weights.tolist()[1][0]* x
plt.plot(x,y)
plt.show()


运行结果:





可以试一下不同的alpha用的时间不太一样。

3用公式计算权重

from numpy import *
import matplotlib.pyplot as plt
import numpy as np

def algorithm():

dataMat =  array([[1,2],[1,4],[1,5],[1,1],[1,6]])
labelMat = array([[2.1],[3.5],[5.3],[0.9],[6.1]])
weights = ones((shape(dataMat)[1] , 1))

weights = dot(dot(linalg.inv(dot(dataMat.T , dataMat)) , dataMat.T) , labelMat)

print weights

plt.scatter(dataMat.T[1] , labelMat)
x = dataMat.T[1]
y = weights.tolist()[0][0] + weights.tolist()[1][0]* x
plt.plot(x,y)
plt.show()


优点:简单,一行代码搞定

缺点:当数据集样本很大时,计算会变慢,而且,有时候linalg.inv(dataMat.T,dataMat) 不一定能求出来。

这个运行的结果和上面差不多。

关于梯度下降和梯度上升的说明

下面是在有些书中用到的梯度上升法求导数的最优解。



这是在Andrew Ng用的梯度下降法求最优解。



可以看到这两中方法其实是一个公式的两种不同叫法,他们背后的数学含其实是一样的。在使用时注意就OK了,数学含义以后明白了再补。

代码写的很烂,请各位大神不吝赐教!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: