這次我選的python版本是2.7,因為我之前用python3試了幾次,發現在畫3d圖的時候會報錯,我暫時還沒找到解決辦法,所以改用了2.7。
資料集我選了乙個包含兩個變數,三個引數的資料集,這樣可以畫出3d圖形對結果進行驗證。
symbols()函式:首先要安裝sympy庫才可以使用。用法:
>>
> x1 = symbols(
'x2'
)>>
> x1 +
1x2 +
1
在這個例子中,x1和x2是不一樣的,x2代表的是乙個函式的變數,而x1代表的是python中的乙個變數,它可以表示函式的變數,也可以表示其他的任何量,它替代x2進行函式的計算。實際使用的時候我們可以將x1,x2都命名為x,但是我們要知道他們倆的區別。
再看看這個例子:
>>
> x = symbols(
'x')
>>
> expr = x +
1>>
> x =
2>>
>
print
(expr)
x +1
作為python變數的x被2這個數值覆蓋了,所以它現在不再表示函式變數x,而expr依然是函式變數x+1的別名,所以結果依然是x+1。
subs()函式:既然普通的方法無法為函式變數賦值,那就肯定有函式來實現這個功能,用法:
>>
>(1
+ x*y)
.subs(x, pi)
#乙個引數時的用法
pi*y +
1>>
>(1
+ x*y)
.subs(
)#多個引數時的用法1+
2*pi
diff()函式:求偏導數,用法:result=diff(fun,x),這個就是求fun函式對x變數的偏導數,結果result也是乙個變數,需要賦值才能得到準確結果。
from __future__ import division
from sympy import symbols, diff, expand
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
data =
#初始化資料集
theta0, theta1, theta2 = symbols(
'theta0 theta1 theta2'
, real=
true
)# y=theta0+theta1*x1+theta2*x2,定義引數
costfuc =
0* theta0
for i in
range(10
):costfuc +=
(theta0 + theta1 * data[
'x1'
][i]
+ theta2 * data[
'x2'
][i]
- data[
'y']
[i])**2
costfuc /=
20#初始化代價函式
dtheta0 = diff(costfuc, theta0)
dtheta1 = diff(costfuc, theta1)
dtheta2 = diff(costfuc, theta2)
rtheta0 =
1rtheta1 =
1rtheta2 =
1#為引數賦初始值
costvalue = costfuc.subs(
)newcostvalue =
0#用cost的值的變化程度來判斷是否已經到最小值了
count =
0alpha =
0.0001
#設定學習率,一定要設定的比較小,否則無法到達最小值
while
(costvalue - newcostvalue >
0.00001
or newcostvalue - costvalue >
0.00001
)and count <
1000
: count +=
1 costvalue = newcostvalue
rtheta0 = rtheta0 - alpha * dtheta0.subs(
) rtheta1 = rtheta1 - alpha * dtheta1.subs(
) rtheta2 = rtheta2 - alpha * dtheta2.subs(
) newcostvalue = costfuc.subs(
)rtheta0 =
round
(rtheta0,4)
rtheta1 =
round
(rtheta1,4)
rtheta2 =
round
(rtheta2,4)
#給結果保留4位小數,防止數值溢位
print
(rtheta0, rtheta1, rtheta2)
fig = plt.figure(
)ax = axes3d(fig)
ax.scatter(data[
'x1'
], data[
'x2'
], data[
'y']
)# 繪製散點圖
xx = np.arange(20,
100,1)
yy = np.arange(1,
5,0.05
)x, y = np.meshgrid(xx, yy)
z = x * rtheta1 + y * rtheta2 + rtheta0
ax.plot_su***ce(x, y, z, rstride=
1, cstride=
1, cmap=plt.get_cmap(
'rainbow'))
plt.show(
)#繪製3d圖進行驗證
側面圖可以看得比較清楚,擬合效果還算不錯。
用Python實現梯度下降演算法
梯度下降實際就是導數值下降 梯度下降演算法是乙個方法,是幫助我們找極值點的方法cost 接下來用python實現最土的梯度下降演算法,首先引入numpy模組和圖形介面模組 import matplotlib.pyplot as plt import numpy as np 定義三個函式 乙個數目標函...
梯度下降演算法 梯度下降演算法為何叫梯度下降?
首先,我們知道乙個演算法的名字可以很好地去解釋乙個演算法,那麼梯度下降演算法是什麼呢?很明顯的,就是用梯度這個工具來解決問題的一種演算法。解決什麼問題呢?如何在乙個函式曲面的某一點,找到乙個函式值變化最大的方向。比如 我們站在山上的某一點,我們想要以最快的速度上山,但是我們的步子大小是一定的,那麼最...
梯度下降演算法 梯度下降演算法公式推導
場景假設 梯度下降法的基本思想可以模擬為乙個下山的過程。假設這樣乙個場景 乙個人被困在山上,需要從山上下來 找到山的最低點 但此時山上的濃霧很大,導致可視度很低 因此,下山的路徑就無法確定,必須利用自己周圍的資訊一步一步地找到下山的路。這個時候,便可利用梯度下降演算法來幫助自己下山。怎麼做呢,首先以...