梯度下降實踐

2021-10-24 12:48:05 字數 3556 閱讀 5624

預期函式:y = 5+3*x

函式模型:y = a +b*x,訓練求參:a,b值

資料集:第一列是x值,第二列是y值

梯度下降演算法:原理請看吳恩達機器學習課程「單變數線性回歸」

# 資料獲取函式

def filein(filename):

data = [,]

fr = open(filename,'r',encoding='utf-8')

# 讀出檔案所有內容

arraylines = fr.readlines()

# 針對有bom的utf-8文字,應該去掉bom,否則後面會引發錯誤。

arraylines[0] = arraylines[0].lstrip('\ufeff')

for line in arraylines:

# s.strip(rm),當rm空時,預設刪除空白符(包括'\n','\r','\t',' ')

line = line.strip()

line = line.split(' ') # line = [***,***,***,***] 列表

return data # [[0.0,0.1,0.2,0.3,...x],[5.0,5.3,5.6,5.9,...y]]

# 梯度下降核心計算機引數值 ,inialarg表示a,b初始化引數值,stepl表示梯度下降時學習速率

# 假設函式:f(x)=a+bx

# 代價函式:j = 1/(2len(data[0]))sum((a+bx-y)^2)

# 代價函式對引數a求偏導:deva=suma/len(data[0]),len(data[0])表示資料的數量

# 代價函式對引數b求偏導:deva=sumb/len(data[0]),

# a = a - stepl*deva

# b = b - stepl*devb

def calarg(data,inialarg,stepl):

a,b = inialarg[0],inialarg[1]

while 1:

dev1 = 0 # 引數a的偏導

dev2 = 0 # 引數b的偏導

suma = 0 # 引數a的偏導值求和

sumb = 0 # 引數b的偏導值求和

for i in range(len(data[0])):

tempy1 = a+b*data[0][i]-data[1][i] # (a+b*xi) - yi x=xi時,引數a的偏導值

tempy2 = (a+b*data[0][i]-data[1][i])*data[0][i] # [(a+b*xi) - yi]*xi x=xi時,引數b的偏導值

suma += tempy1

sumb += tempy2

dev1 = suma/len(data[0])

dev2 = sumb/len(data[0])

tempa = a - stepl*(dev1)

tempb = b - stepl*(dev2)

a = tempa

b = tempb

print(dev1,dev2) # 每次引數a,b相應的偏導數值

if abs(dev1-0)<0.00001 and abs(dev2-0)<0.00001: # 當偏導都趨近於0時,代表已經達到最優點了,訓練完成,凸面的最小值導數等於0

break

return a,b

def alg(stepl):

data = filein("data.txt")

a,b=0,0 # 初始化(a,b)引數值為0,0

a,b=calarg(data,[a,b],stepl)

print(a,b)

if __name__ == '__main__':

alg(0.0001) # 設定引數修改步長為0.0001

梯度下降效果:前面的數值是引數a,b在相應變化值的偏導數值,最後一行是最終得到的引數值

向量化:numpy陣列操作比迴圈高效

原公式:3x+5y-13 = z

import numpy as np

import math

# n為乙個樣本中,屬性的數量

# m為樣本的數量

# x=[x1,x2,x3] (n,m)

# xlist = np.array([[0,1],[0,2],[0,3],[0,0],[1,0],[1,1],[1,2],[1,3],[2,0],[2,1],[2,2],[2,3],[3,0],[3,1],[3,2],[3,3]])

# 第一行表示x,第二行表示y

xlist = np.array([[0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3],[1,2,3,0,0,1,2,3,0,1,2,3,0,1,2,3]])

# 原始正確的z值

zlist = np.array([-7,-2,3,-12,-9,-3,3,8,-6,-1,6,9,-3,2,7,12]) # >12表示1,小於12表示0

# 原始z值經過啟用函式後的y

yval = 1/(1+np.exp(-1*zlist)) # >12表示1

yval = np.round(yval,3) # 保留3位小數,四捨五入

zlist.resize(16,1)

# 定義w,dw,b

w1,w2 = 0,0

dw = np.zeros((2,1)) # dw = np.zeros((n,1))

w=np.array([[w1],[w2]])

b=np.zeros((1,16))

a = 0.03

i=0while(i<1000000):

zhat=np.dot(w.t,xlist)+b # 求z=[z1,z2,...,zm] = w.t*x +b

yhat = 1/(1+np.exp(-1*zhat)) # 求a

梯度下降 隨機梯度下降 批梯度下降

下面的h x 是要擬合的函式,j 損失函式,theta是引數,要迭代求解的值,theta求解出來了那最終要擬合的函式h 就出來了。其中m是訓練集的記錄條數,j是引數的個數。梯度下降法流程 1 先對 隨機賦值,可以是乙個全零的向量。2 改變 的值,使j 按梯度下降的方向減少。以上式為例 1 對於我們的...

梯度下降 隨機梯度下降和批量梯度下降

對比梯度下降和隨機梯度下降和批量梯度下降 之前看的知識比較零散,沒有乙個系統的解釋說明,看了一些網上的博主的分析,總結了一下自己的理解。例子這裡我參照其他博主的例子做了一些修改,首先是梯度下降 coding utf 8 import random this is a sample to simula...

stanford 梯度 梯度下降,隨機梯度下降

一 梯度gradient 在標量場f中的一點處存在乙個向量g,該向量方向為f在該點處變化率最大的方向,其模也等於這個最大變化率的數值,則向量g稱為標量場f的梯度。在向量微積分中,標量場的梯度是乙個向量場。標量場中某一點上的梯度指向標量場增長最快的方向,梯度的長度是這個最大的變化率。更嚴格的說,從歐氏...