@@ -23,7 +23,53 @@ def computerCost(X,y,theta):
2323 return J
2424```
2525 - 注意这里的X是真实数据前加了一列1,因为有theta(0)
26+
2627### 2、梯度下降算法
27- - 代价函数对![ {{\theta _ j}}] ( http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7B%7B%5Ctheta%20_j%7D%7D ) 求偏导得到:![ \frac{{\partial J(\theta )}}{{\partial {\theta _ j}}} = \frac{1}{m}\sum\limits_ {i = 1}^m {[ ({h_ \theta }({x^{(i)}}) - {y^{(i)}})x_j^{(i)}] } ] ( http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%5Cfrac%7B%7B%5Cpartial%20J%28%5Ctheta%20%29%7D%7D%7B%7B%5Cpartial%20%7B%5Ctheta%20_j%7D%7D%7D%20%3D%20%5Cfrac%7B1%7D%7Bm%7D%5Csum%5Climits_%7Bi%20%3D%201%7D%5Em%20%7B%5B%28%7Bh_%5Ctheta%20%7D%28%7Bx%5E%7B%28i%29%7D%7D%29%20-%20%7By%5E%7B%28i%29%7D%7D%29x_j%5E%7B%28i%29%7D%5D%7D%20 )
28- - 所以对theta的更新可以写为:![ {\theta _ j} = {\theta _ j} - \alpha \frac{1}{m}\sum\limits_ {i = 1}^m {[ ({h_ \theta }({x^{(i)}}) - {y^{(i)}})x_j^{(i)}] } ] ( http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7B%5Ctheta%20_j%7D%20%3D%20%7B%5Ctheta%20_j%7D%20-%20%5Calpha%20%5Cfrac%7B1%7D%7Bm%7D%5Csum%5Climits_%7Bi%20%3D%201%7D%5Em%20%7B%5B%28%7Bh_%5Ctheta%20%7D%28%7Bx%5E%7B%28i%29%7D%7D%29%20-%20%7By%5E%7B%28i%29%7D%7D%29x_j%5E%7B%28i%29%7D%5D%7D%20 )
29- - 其中![ \alpha ] ( http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%5Calpha%20 ) 为学习速率,控制梯度下降的速度,一般取** 0.01,0.03,0.1,0.3.....**
28+ - 代价函数对![ {{\theta _ j}}] ( http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7B%7B%5Ctheta%20_j%7D%7D ) 求偏导得到:
29+ ![ \frac{{\partial J(\theta )}}{{\partial {\theta _ j}}} = \frac{1}{m}\sum\limits_ {i = 1}^m {[ ({h_ \theta }({x^{(i)}}) - {y^{(i)}})x_j^{(i)}] } ] ( http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%5Cfrac%7B%7B%5Cpartial%20J%28%5Ctheta%20%29%7D%7D%7B%7B%5Cpartial%20%7B%5Ctheta%20_j%7D%7D%7D%20%3D%20%5Cfrac%7B1%7D%7Bm%7D%5Csum%5Climits_%7Bi%20%3D%201%7D%5Em%20%7B%5B%28%7Bh_%5Ctheta%20%7D%28%7Bx%5E%7B%28i%29%7D%7D%29%20-%20%7By%5E%7B%28i%29%7D%7D%29x_j%5E%7B%28i%29%7D%5D%7D%20 )
30+ - 所以对theta的更新可以写为:
31+ ![ {\theta _ j} = {\theta _ j} - \alpha \frac{1}{m}\sum\limits_ {i = 1}^m {[ ({h_ \theta }({x^{(i)}}) - {y^{(i)}})x_j^{(i)}] } ] ( http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7B%5Ctheta%20_j%7D%20%3D%20%7B%5Ctheta%20_j%7D%20-%20%5Calpha%20%5Cfrac%7B1%7D%7Bm%7D%5Csum%5Climits_%7Bi%20%3D%201%7D%5Em%20%7B%5B%28%7Bh_%5Ctheta%20%7D%28%7Bx%5E%7B%28i%29%7D%7D%29%20-%20%7By%5E%7B%28i%29%7D%7D%29x_j%5E%7B%28i%29%7D%5D%7D%20 )
32+ - 其中![ \alpha ] ( http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%5Calpha%20 ) 为学习速率,控制梯度下降的速度,一般取** 0.01,0.03,0.1,0.3.....**
33+ - 实现代码
34+ ```
35+ # 梯度下降算法
36+ def gradientDescent(X,y,theta,alpha,num_iters):
37+ m = len(y)
38+ n = len(theta)
39+
40+ temp = np.matrix(np.zeros((n,num_iters))) # 暂存每次迭代计算的theta,转化为矩阵形式
41+
42+
43+ J_history = np.zeros((num_iters,1)) #记录每次迭代计算的代价值
44+
45+ for i in range(num_iters): # 遍历迭代次数
46+ h = np.dot(X,theta) # 计算内积,matrix可以直接乘
47+ temp[:,i] = theta - ((alpha/m)*(np.dot(np.transpose(X),h-y))) #梯度的计算
48+ theta = temp[:,i]
49+ J_history[i] = computerCost(X,y,theta) #调用计算代价函数
50+ print '.',
51+ return theta,J_history
52+ ```
53+
54+ ### 3、均值归一化
55+ - 目的是使数据都缩放到一个范围内,便于使用梯度下降算法
56+ - ![ {x_i} = \frac{{{x_i} - {\mu _ i}}}{{{s_i}}}] ( http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7Bx_i%7D%20%3D%20%5Cfrac%7B%7B%7Bx_i%7D%20-%20%7B%5Cmu%20_i%7D%7D%7D%7B%7B%7Bs_i%7D%7D%7D )
57+ - 其中 ![ {{\mu _ i}}] ( http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7B%7B%5Cmu%20_i%7D%7D ) 为所有此feture数据的平均值
58+ - ![ {{s_i}}] ( http://chart.apis.google.com/chart?cht=tx&chs=1x0&chf=bg,s,FFFFFF00&chco=000000&chl=%7B%7Bs_i%7D%7D ) 可以是** 最大值-最小值** ,也可以是这个feature对应的数据的** 标准差**
59+ - 实现代码:
60+ ```
61+ # 归一化feature
62+ def featureNormaliza(X):
63+ X_norm = np.array(X) #将X转化为numpy数组对象,才可以进行矩阵的运算
64+ #定义所需变量
65+ mu = np.zeros((1,X.shape[1]))
66+ sigma = np.zeros((1,X.shape[1]))
67+
68+ mu = np.mean(X_norm,0) # 求每一列的平均值(0指定为列,1代表行)
69+ sigma = np.std(X_norm,0) # 求每一列的标准差
70+ for i in range(X.shape[1]): # 遍历列
71+ X_norm[:,i] = (X_norm[:,i]-mu[i])/sigma[i] # 归一化
72+
73+ return X_norm,mu,sigma
74+ ```
75+ - 注意预测的时候也需要均值归一化数据
0 commit comments