預期函式: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的梯度。在向量微積分中,標量場的梯度是乙個向量場。標量場中某一點上的梯度指向標量場增長最快的方向,梯度的長度是這個最大的變化率。更嚴格的說,從歐氏...