ng-梯度下降
ng-机器学习week1
监督学习
通过展示数据和正确输出来训练的学习方法,
监督学习算法:回归,分类(预测结果0/1)
无监督学习
聚类算法:坐标图上数据并不知道类别,但是明显有分类–寻找集群
数据集中第i对数据记作
(x(i), y(i))
用线性函数f(x)拟合y
x关系
f(x) = wx + b
代价函数
引入这样一个函数 $$J(w,b)=\frac{1}{2m}
\sum_{i=1}^{m} (\hat{y^{(i)} }-y^{(i)} )^{2 } $$
其中1/2是为了计算方便引入的,该式又可以写为 $$ J(w,b)=\frac{1}{2m} \sum_{i=1}^{m}
(f_{w,x}(x^{(i)} )-y^{(i)} )^{2 }$$
线性回归的目的就是寻找合适的w b使得J最小
梯度下降
我们希望通过不停地更新w, b找到J的局部最小值,方法是让J沿着梯度方向按照一定速度下降,也即
$$w =w -\alpha \frac{\partial }{\partial
w}J(w,b) $$
$$ b =b -\alpha \frac{\partial }{\partial
b}J(w,b) $$ 其中α称作学习率,一般是0到1之间的一个数,用于控制学习的速度。总之,我们希望在不停地更新和迭代中达到算法收敛,需要注意的是,w, b必须同时更新,算法语言中体现为这样
$$ tempw =w -\alpha \frac{\partial }{\partial
w}J(w,b)$$ $$ tempb =b -\alpha
\frac{\partial }{\partial b}J(w,b)$$ w = tempw, b = tempb
事实上,越是接近最小值点,偏导数越小,w
b每次更新幅度也越小,直到收敛。
线性回归下的梯度下降
对线性回归下的平方残差和函数J(w, b)求偏导数,容易得到 $$\frac{\partial }{\partial w} J(w,b)=\frac{1}{m} \sum_{i=1}^{m} (f_{w,b}(x^{(i)} )-y^{(i)} )x^{(i)} $$ $$\frac{\partial }{\partial w} J(w,b)=\frac{1}{m} \sum_{i=1}^{m} (f_{w,b}(x^{(i)} )-y^{(i)} ) $$
作业实现
给定一个txt文档,里面存有训练用数据集,现在用Python程序线性回归。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
# 读取txt文件中的数据 需要把txt文件放到py脚本同一目录下
data_path = 'data/ex1data1.txt'
data = pd.read_csv(data_path, header=None)
X = data.iloc[:, 0].values.reshape(-1, 1) # 特征值
y = data.iloc[:, 1].values.reshape(-1, 1) # 目标值
# 为了简单起见,我们使用scikit-learn的LinearRegression类,
# 它内部实现了最小二乘法,而不是手动实现梯度下降。
# 使用scikit-learn的LinearRegression
reg = LinearRegression()
reg.fit(X, y)
# 输出模型的系数
print('Coefficients: \n', reg.coef_)
print('Intercept: \n', reg.intercept_)
# 绘制拟合的直线和原始数据点
plt.scatter(X, y, color='blue')
plt.plot(X, reg.predict(X), color='red', linewidth=2)
plt.xlabel('Feature')
plt.ylabel('Target')
plt.show() 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 读取txt文件中的数据 需要把txt文件放到py脚本同一目录下
data_path = 'data/ex1data1.txt'
data = pd.read_csv(data_path, header=None)
x = data.iloc[:, 0].values.reshape(-1, 1) # 特征值
y = data.iloc[:, 1].values.reshape(-1, 1) # 目标值
# 为了简单起见,我们使用scikit-learn的LinearRegression类,
# 它内部实现了最小二乘法,而不是手动实现梯度下降。
# 手动实现随机梯度下降法
def grad_down(x,y,w,b,num,alpha):
cost_history = []
for i in range(num):
predict_x = w * x + b
error = predict_x - y
dw = 1 / len(x) * np.sum(error*x)
db = 1 / len(x) * np.sum(error)
w = w - dw * alpha
b = b - db * alpha
cost = (1 / 2 * len(x)) * np.sum(error ** 2)
cost_history.append(cost)
return w,b,cost_history
init_b=0
init_w=0;
final_w,final_b,cost_history=grad_down(x,y,init_w,init_b,10000,0.01)
predict_x=final_w*x+final_b
# 输出模型的系数
print('Coefficients: \n', final_w)
print('Intercept: \n', final_b)
# 绘制拟合的直线和原始数据点
plt.scatter(x, y, color='blue')
plt.plot(x, predict_x, color='red', linewidth=2)
plt.xlabel('Feature')
plt.ylabel('Target')
plt.show()
## 绘制收敛情况
plt.plot(cost_history)
plt.xlabel('training_num')
plt.ylabel('cost')
plt.title('cost-training_times')
plt.show()