自定義函式梯度下降求解w和b

2021-10-07 20:58:53 字數 2669 閱讀 6265

#首先匯入需要的庫

import numpy as np

import matplotlib.pyplot as plt

%matplotlib inline

#直接導庫得到的w和b

from sklearn.linear_model import linearregression

# 隨機產生w,b,定義x陣列,寫出x與y的表示式

x = np.linspace(-5

,10,20

)w = np.random.randint(-2

,10,size =1)

[0]b = np.random.randint(-7

,7,size =1)

[0]y = x*w + b + np.random.randn(20)

**2lr = linearregression(

)#要求二維資料,(-1,1)是行數未知,列數為1列的陣列

lr.fit(x.reshape(-1

,1),y)

lr.coef_

lr.intercept_

#自定義梯度下降的整個過程

class

linear_model

(object):

# 先給w和b隨機取乙個數值

def__init__

(self)

: self.w = np.random.randn(1)

[0] self.b = np.random.randn(1)

[0]print

("------初始的權重和偏差:"

,self.w,self.b)

#定義函式模型 f(x)= wx + b

defmodel

(self,x)

:return self.w * x +self.b

#定義線性模型,線性問題都是最小二乘法,x、y傳參到下面的每乙個方程,得到未知數g_w、g_b

defloss

(self,x,y)

: cost =

(y - self.model(x))**

2#對w、b求偏導,梯度就是求導

g_w =2*

(y - self.model(x))*

(-x)

g_b =2*

(y - self.model(x))*

(-1)

return g_w,g_b

#定義梯度下降,更新w,b ,g_w,g_b,step = 0.01 傳參到下面每乙個方程

defgradient_descent

(self,g_w,g_b,step =

0.01):

self.w -=g_w * step

self.b -=g_b * step

print

("--更新後的w,b:"

,self.w,self.b)

# 將定義後的每乙個數進行乙個訓練過程:

deffit

(self,x,y)

: w_last = self.w +

1 b_last = self.b +

1

precision =

0.0001

count =

0 max_count =

1000

g_w =

0 g_b =

0

size = x.shape[0]

while

true

:if np.

abs(self.w - w_last)

< precision and np.

abs(b_last - self.b)

< precision:

break

if max_count < count:

break

for xi,yi in

zip(x,y)

:#w、b分別是乙個定值,將所有的損失之後對應的w、b求和,除以總數,取平均值

self.w = self.loss(xi,yi)[0

]/size

#[0]代表定義loss裡的,返回的第乙個值,[1]代表返回的第二個值

self.b = self.loss(xi,yi)[1

]/size

self.gradient_descent(g_w,g_b)

count +=

1#直接導庫裡面自帶的引數coef_,對應的就是w,我們這裡需要自定義,直接返回可以更快的看到訓練之後的w數值

defcoef_

(self)

:return self.w

#直接導庫裡面自帶的引數intercept_,對應的就是b,我們這裡需要自定義,直接返回可以更快的看到訓練之後的b數值

defintercept_

(self)

:return self.b

#在jupyter notebook裡實現,得到最後訓練的w,b的值

lm = linear_model(

)lm.fit(x,y)

lm.coef_(

),lm.intercept_(

)

wmake 自定義編譯求解器和庫

在編譯求解器和庫之前,我們分析了介紹了幾種常見求解器的主程式 c檔案 一些相關的標頭檔案,以及make資料夾,以上部分決定了求解器檔案的基本架構 1.求解器的編譯 完成了以上部分 的編寫以後,就可以運用wmake指令編譯自定義求解器了。求解器的名稱及路徑資訊在files檔案中進行指定,以icofoa...

關於自定義函式和巨集定義

一 static 此定義型別有以下3種情況 1 當修飾乙個全域性變數時,這個變數的作用域被改變了,只能在當前檔案中呼叫 2 當修飾乙個區域性變數時,改變了變數的生命週期,直到程式結束才會被釋放。注 一般的呼叫函式中定義的區域性變數預設儲存在棧空間,而如果是被static修飾的區域性變數儲存在資料段內...

5 內建函式和自定義函式

1.python中有很多內建函式 1 abs 求乙個整數的絕對值 2 max min 求最大值,最小值 3 hex 將乙個整數轉化為十六進製制,0x 格式 4 型別轉化函式 int float str 2.定義函式 在python中,定義乙個函式要使用def語句,依次寫出函式名 括號 括號中的引數和...