二維情況:y = theta0 + theta1*x
結果為:2.57549789814787, 0.613000580602551
**如下:
from sympy import *
import math
x = [1.5, 2, 1.5, 2, 3, 3, 3.5, 3.5, 4, 4, 5, 5]
y = [3, 3.2, 4, 4.5, 4, 5, 4.2, 4.5, 5, 5.5, 4.8, 6.5]
j = 0 # 損失函式
theta0, theta1 = symbols('theta0, theta1') # 定義theta引數
for i in range(len(x)): # 構造損失函式
j += (theta0 + x[i]*theta1 - y[i])**2
j *= 0.5
# print(j)
alpha = 0.01 # 學習步長
epsilon = 0.0000000000001 # 迭代閥值,當兩次迭代損失函式之差小於該閥值時停止迭代
dtheta0 = diff(j, theta0) # 對theta0求偏導
dtheta1 = diff(j, theta1) # 對theta0求偏導
print('dthedat0=', dtheta0)
print('dthedat1=', dtheta1)
theta0 = 0 # 初始化theta引數
theta1 = 0
while true:
last0 = theta0
last1 = theta1
theta0 -= alpha * dtheta0.subs()
theta1 -= alpha * dtheta1.subs()
a = j.subs()
b = j.subs()
print("{}, {}, {}, {}".format(theta0, theta1, a, b))
if math.fabs(j.subs() - j.subs()) < epsilon:
break
print("{}, {}".format(theta0, theta1))
多維情況:y[i] = theta0 + theta1*x[i][0] + theta2*x[i][1] + theta3*x[i][2]
結果為:50.3097802023958, 47.7942911922764, -13.0287743334236, 1.13282147172682
**如下:
from sympy import *
import math
x = [(1, 0., 3), (1, 1., 3), (1, 2., 3), (1, 3., 2), (1, 4., 4)]
y = [95.364, 97.217205, 75.195834, 60.105519, 49.342380]
j = 0 # 損失函式 和 theta引數
theta0, theta1, theta2, theta3 = symbols('theta0, theta1, theta2, theta3')
for i in range(len(x)): # 構造損失函式
j += (theta0 + x[i][0]*theta1 + x[i][1]*theta2 + x[i][2]*theta3 - y[i])**2
j *= 0.5
# print(j)
alpha = 0.01 # 學習步長
epsilon = 0.0000000000001 # 迭代閥值,當兩次迭代損失函式之差小於該閥值時停止迭代
dtheta0 = diff(j, theta0) # 對theta0求偏導
dtheta1 = diff(j, theta1) # 對theta1求偏導
dtheta2 = diff(j, theta2) # 對theta2偏導
dtheta3 = diff(j, theta3) # 對theta3求偏導
print('dthedat0=', dtheta0)
print('dthedat1=', dtheta1)
print('dthedat2=', dtheta2)
print('dthedat3=', dtheta3)
theta0 = 0 # 初始化theta引數
theta1 = 0
theta2 = 0
theta3 = 0
while true:
last0 = theta0
last1 = theta1
last2 = theta2
last3 = theta3
theta0 -= alpha * dtheta0.subs()
theta1 -= alpha * dtheta1.subs()
theta2 -= alpha * dtheta2.subs()
theta3 -= alpha * dtheta3.subs()
a = j.subs()
b = j.subs()
print("{}, {}, {}, {}, {}, {}".format(theta0, theta1, theta2, theta3, a, b))
if math.fabs(j.subs() -
j.subs()) < epsilon:
break
print("{}, {}, {}, {}".format(theta0, theta1, theta2, theta3))
線性回歸與梯度下降法
原文 最近在看斯坦福的 機器學習 的公開課,這個課程是2009年的,有點老了,不過講的還是很好的,廓清了一些我以前關於機器學習懵懂的地方。我的一位老師曾經說過 什麼叫理解?理解就是你能把同乙個事情用自己的語言表達出來,並且能讓別人聽得懂。本著這樣的原則,同時也為了證明自己是 理解 的,於是決定打算在...
20191008 線性回歸 梯度下降法
不斷的迭代,還是波士頓房價 獲取資料 資料清洗預處理 劃分資料集 特徵工程 預估器流程 coef intercept 模型評估 from sklearn.datasets import load boston from sklearn.model selection import train tes...
梯度下降法求解線性回歸
梯度下降法 英語 gradient descent 是乙個一階最優化演算法,通常也稱為最速下降法。要使用梯度下降法找到乙個函式的區域性極小值,必須向函式上當前點對應梯度 或者是近似梯度 的反方向的規定步長距離點進行迭代搜尋。如果相反地向梯度正方向迭代進行搜尋,則會接近函式的區域性極大值點 這個過程則...