#首先匯入需要的庫
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語句,依次寫出函式名 括號 括號中的引數和...