最近偶觸python,感ctrl c和ctrl v無比順暢,故越發膨脹。怒拾起python資料分析一pdf讀之,不到百頁,內心惶恐,嘆:臥槽,這都tm是啥,甚是迷茫。遂感基礎知識薄弱,隨意搜了機器學習教程,小看一翻。此文給出課件中幾個演算法,自己都不知道對不對,感覺還可以吧。
本文以線性回歸為例,在給出若干(x, y)下,找到方程y=b+ax中b和a,從而給出線性方程。具體理論實在理解尚淺,只給出求解公式。下面**放在乙個python檔案中即可。**部分用到矩陣和向量乘法,作為求和,有乙個numpy符號*、dot、multipy區別寫在末尾。
具體公式如下(課件抄的),已知樣本符合如下線性方程: h(
x)=∑
i=0n
θixi
=θtx
,(x0
=1)
求解下面cost function最小值時,
θ 的值,i是樣本編號,m是樣本總數 j(
θ)=1
2∑i=
1m(h
θ(x(
i))−
y(i)
)2轉換為梯度下降法求解如下公式: θj
=θj−
α∂∂θ
jj(θ
) ∂∂
θjj(
θ)=(
hθ(x
)−y)
xj(1)批量梯度下降演算法(batch gradient descent)
偽**如下
repeat until convergence
import numpy as np
# y=theta*x
defh
(theta, example_x):
return theta * example_x.t
defbatch_gradient_descent
(x, y, theta0, alpha, iterator):
example_x = np.matrix(x)
label_y = np.matrix(y)
theta = np.matrix(theta0, dtype=float)
for i in range(iterator):
error = (label_y - h(theta, example_x))
sum_gradient = error * example_x
theta = theta + alpha * sum_gradient
return theta
(2)隨機梯度下降演算法(stochastic gradient descent)
偽**如下
loop
} **如下
def
stochastic_gradient_descent
(x, y, theta0, alpha, iterator):
example_x = np.matrix(x)
label_y = np.matrix(y)
theta = np.matrix(theta0, dtype=float)
m, n = np.shape(example_x)
for i in range(iterator):
for j in range(m):
gradient = (label_y[0, j] - h(theta, example_x[j])) * example_x[j]
theta = theta + alpha * gradient
return theta
(3)locally weighted linear regression algorithm
這個也不知道怎麼翻譯,就是帶權重的線性回歸,求解方法也就叫權重梯度下降法吧。這個自己不知道對不對,課件沒給出具體步驟,也沒搜到具體內容。感覺和上兩個演算法也不該放一起比較,場景不太一致。這就放一起吧。
求解公式,按照下面公式在(2)上加了個w,演算法步驟與(2)一樣 fi
tθto
mini
mize
∑iw(
i)(y
(i)−
θtx(
i))2
w(i)=ex
p(−(
x(i)
−x)2
2τ2)
上公式中x看做所有樣本x每列的平均值,暫時這樣處理吧。
**如下:
def
w(xi, ex, t):
return np.exp(-np.multiply((xi - ex), (xi - ex))/2*t*t)
# locally weighted linear regression algorithm
deflocally_gradient_descent
(x, y, theta0, alpha, iterator, t):
example_x = np.matrix(x)
label_y = np.matrix(y)
theta = np.matrix(theta0, dtype=float)
m, n = np.shape(example_x)
ex = np.mean(example_x, axis=0)
for i in range(iterator):
for j in range(m):
wj = w(example_x[j], ex, t)
gradient = np.multiply(wj, (label_y[0, j] - h(theta, example_x[j])) * example_x[j])
theta = theta + alpha * gradient
return theta
注意:numpy的matrix,負號*與dot是一樣的,都表示矩陣乘法,行列對應一致。multiply是矩陣各對應位置相乘。例:[1,2]*[[1],[2]]=numpy.dot([1,2],[[1],[2]])=[5],numpy.multiply([1,2], [[1],[2]])=[[1,2],[2,4]]
資料明顯給出y=1+2x
x = [[1, 1], [1, 2], [1, 3]]
y = [3, 5, 7]
theta0 = [2, 3]
print(batch_gradient_descent(x=x, y=y, theta0=theta0, alpha=0.1, iterator=50))
print(stochastic_gradient_descent(x=x, y=y, theta0=theta0, alpha=0.1, iterator=50))
print(locally_gradient_descent(x=x, y=y, theta0=theta0, alpha=0.1, iterator=50, t=2))
求解結果如下(θ0
和θ1 ),是不是很像1,2
[[ 1.0748101 1.96709091]]
[[ 1.04498802 1.98500399]]
[[ 0.99706172 2.0013277 ]]
最優化演算法(一) 梯度下降法
梯度下降法的目標是 此時輸入 目標函式f x 梯度函式g x 精度e 輸出 f x 的極小點 1 取初始值 2 計算 3 計算梯度值更新,k k 1。注意 一般當目標函式為凸函式時,梯度下降法為全域性最優解,對於複雜函式並不一定。對於梯度下降有兩種實現方法 批量梯度下降 每次遍歷所有的樣本取最小化所...
機器學習(三) 梯度下降法
本部落格大部分參考了這篇博文 在微積分裡面,對多元函式的引數求 偏導數,把求得的各個引數的偏導數以向量的形式寫出來,就是梯度。比如函式f x,y 分別對x,y求偏導數,求得的梯度向量就是 f x f y 簡稱gr adf x,y 或者 f x,y 如果是3個引數的向量梯度,就是 f x f y,f ...
機器學習(二) 梯度下降法
前言 在上篇博文機器學習 一 中,最後我們提到,通過計算代價函式j 是否收斂於最小值來確定假設函式的引數 進而訓練出機器學習中的線性回歸演算法,那麼如何來找到使得j 最小話的引數 呢,本篇博文將介紹一種常用的方法,梯度下降法來確定引數 值。一 對於單特徵線性回歸,梯度下降法的演算法如下 repeat...