python 矩陣乘法梯度下降 梯度下降與矩陣分解

2021-10-17 02:32:45 字數 3633 閱讀 6897

1.梯度下降

梯度下降屬於迭代法的一種,所謂迭代法就是不斷用變數的舊值得到新值的方法。在求解損失函式最小值的時候,可以通過梯度下降法來一步步迭代求出最小化的損失函式和模型引數值。

梯度:對於一元函式來說,梯度就是該函式的導數。即▽f(x)=f'(x)

對於多元函式來說,梯度就是對多元函式的引數求偏導數,把求得的各個引數的偏導數以向量的形式寫出來。比如函式f(x,y),分別對x,y求偏導數,得到的的梯度就是(∂f/∂x, ∂f/∂y)t,簡稱grad f(x,y)或者▽f(x,y)。

在求極小值的時候,要向負梯度方向求最小值,以下圖為例:

在a點求最小值時要向梯度反方向,在b點求最小值時也是如此,梯度是在該點的導數。

求解過程:

1.設出兩個較小的正數s,b       s代表步長,b代表非常小的常數閾值;

2.求當前位置的偏導數:

▽f(x)=f'(x);▽f(x,y)=(∂f/∂x, ∂f/∂y)t          (x=0....n)

3.修改函式的引數值:

x1=x-s*▽

引數值為函式的梯度與步長的乘積的絕對值。

4.如果修改後的引數值小於b,則此時的引數值就是求得最小值;否則回到步驟2,此時x=x-x0。

一般情況下,梯度向量為0的時候就是乙個極值點,此時梯度的幅值也為0。梯度下降演算法迭代結束的條件是幅值接近0,故剛開始可以設定乙個較小的閾值。

例:出發點設為-4利用梯度下降法求函式y=x*x-x的極小值

def f(x):

return 2*x-1

x=-4

s=0.9

b=0.01

while true:

x1=f(x)*s

if x1<0:

x1=-x1

x=x+x1

else:

x=x-x1

if x1

break

print(x)

print("函式最小值",x*x-x)

執行結果:

4.1-2.38

2.8040000000000003

-1.3432000000000004

1.9745600000000003

-0.6796480000000003

1.4437184000000003

-0.2549747200000003

1.1039797760000003

0.01681617919999967

0.8865470566400003

0.19076235468799974

0.7473901162496003

0.3020879070003198

0.6583296743997442

0.37333626048020463

0.6013309916158363

0.418935206707331

0.5648518346341352

0.44811853229269183

0.5415051741658465

0.46679586066732276

0.5265633114661418

0.4787493508270866

0.5170005193383307

0.48639958452933546

0.5108803323765316

0.4912957340987747

0.5069634127209802

0.49442926982321583

0.5044565841414274

函式最小值 -0.24998728886898583

2.矩陣分解:

矩陣分解就是把乙個矩陣近似變成若干個小矩陣相乘的形式。個人感覺矩陣分解就是**一些矩陣中沒有的元素。

應用矩陣分解思想解決評分矩陣中沒有打分的元素,這種思想可以看做是有監督的機器學習。

矩陣r可以近似表示為p與q的乘積:r(m,n)≈ p(m,k)*q(k,n)

,為什麼要說是近似表示呢,因為矩陣r中並不是所有的元素都有值,而分解後的矩陣p和q是都有元素值的。k值是通過交叉驗證法獲得的最佳的值。

,為了得到近似的r(m,n),必須求出矩陣p和q,如何求出這兩個矩陣是關鍵問題。

隨機生成矩陣p和q

然後使用原始的評分矩陣

與重新構建的評分矩陣

之間的誤差的平方作為損失函式,即:

如果r(i,j)已知,則r(i,j)的誤差平方和為:

最終,需要求解所有的非「-」項的損失之和的最小值:

之後使用梯度下降法獲得修正的p和q分量:

求解損失函式的負梯度:

根據負梯度的方向更新變數:

最後不停迭代直到演算法最終收斂(直到sum(e^2) <=閾值)

import matplotlib.pyplot as plt

from math import pow

import numpy

def matrix_factorization(r,p,q,k,steps=5000,alpha=0.0002,beta=0.02):

q=q.t # .t操作表示矩陣的轉置

result=

for step in range(steps):

for i in range(len(r)):

for j in range(len(r[i])):

if r[i][j]>0:

eij=r[i][j]-numpy.dot(p[i,:],q[:,j]) # .dot(p,q) 表示矩陣內積

for k in range(k):

p[i][k]=p[i][k]+alpha*(2*eij*q[k][j]-beta*p[i][k])

q[k][j]=q[k][j]+alpha*(2*eij*p[i][k]-beta*q[k][j])

er=numpy.dot(p,q)

e=0for i in range(len(r)):

for j in range(len(r[i])):

if r[i][j]>0:

e=e+pow(r[i][j]-numpy.dot(p[i,:],q[:,j]),2)

for k in range(k):

e=e+(beta/2)*(pow(p[i][k],2)+pow(q[k][j],2))

if e<0.001:

break

return p,q.t,result

if __name__ == '__main__':

r=[[5,3,0,2],

[4,0,0,1],

[1,1,0,5],

[1,0,1,4],

[0,1,5,4]

r=numpy.array(r)

n=len(r)

m=len(r[0])

k=2p=numpy.random.rand(n,k) #隨機生成乙個 n行 k列的矩陣

q=numpy.random.rand(m,k) #隨機生成乙個 m行 k列的矩陣

np,nq,result=matrix_factorization(r,p,q,k)

print("原始的評分矩陣r為:\n",r)

r_mf=numpy.dot(np,nq.t)

print("經過mf演算法填充0處評分值後的評分矩陣r_mf為:\n",r_mf)

090001 梯度下降

本講ng大牛講解了梯度下降 gradient descent 方法 首先以波特蘭奧勒岡的房屋面積和售價關係為例,講解了監督學習的一般模式,通過乙個訓練集,利用學習演算法,得到乙個假設 歷史原因造成的叫法,就是乙個 模型 當輸入值x進入,通過假設,得到乙個 值y,如圖所示 當只有乙個變數即面積時,其關...

二 梯度下降

第二講正式開始介紹機器學習中的監督學習,首先宣告了以下約定 對於m組訓練樣本,x表示其輸入 input feature y表示其輸出 target variable m是乙個正整數 表示個數的嘛 x和y可是是向量也可以是標量,不過入門而言一般y為標量,x i y i 表示訓練樣本,表示訓練集 我們的...

17 梯度下降

import numpy as np import matplotlib.pyplot as plt 構造一元二次方程 x np.linspace 1,6,141 y x 2.5 2 1 繪圖 目標函式 def j theta try return theta 2.5 2 1 except retu...