機器學習基礎演算法三 線性回歸演算法實驗(梯度下降法)

2021-10-10 21:56:51 字數 4054 閱讀 7800

import numpy as np

import pandas as pd

from sklearn.datasets import load_boston

# 增加**的列數行數和每行的寬度以此讓資料集完整表示

pd.set_option(

'display.max_rows'

,1000

)pd.set_option(

'display.max_columns'

,1000

)pd.set_option(

'display.width'

,1000

)# 將sklearn資料集轉換為csv

if __name__ ==

'__main__'

: boston = load_boston(

) data = pd.dataframe(boston.data, columns=boston.feature_names)

data[

'medv'

]= boston[

'target'

] data.to_csv(

'./boston.csv'

, index=

none

)class

linearregression

:"""使用python語言實現線性回歸演算法。(梯度下降)"""

def__init__

(self, alpha, times)

:"""初始化方法。

:parameter

alpha:float

學習率。用來控制步長。(權重調整的幅度)

times :int

迴圈迭代的次數。

"""self.alpha = alpha

self.times = times

deffit(self, x, y)

:"""根據提供的訓練資料x,對模型進行訓練。

:parameter

x:類陣列型別。形狀:[樣本數量,特徵數量]

帶訓練的樣本特徵屬性。(特徵矩陣)

y:類陣列型別,形狀:[樣本數量]

目標值(標籤資訊)。

"""x = np.asarray(x)

y = np.asarray(y)

# 建立權重的向量,初始值為0(或任何其他的值),長度比特徵數量多1。(多出的乙個值就是截距)

self.w_ = np.zeros(

1+ x.shape[1]

)# 建立損失列表,用來儲存每次迭代後的損失值。損失值計算:(**值 - 真實值)的平方和除以2

self.loss_ =

# 進行迴圈,多次迭代在每次迭代過程中,不斷去調整全總值使得損失值不斷減小。

for i in

range

(self.times)

:# 計算**值

y_hat = np.dot(x, self.w_[1:

])+self.w_[0]

# 計算真實值與**值之間的差距。

error = y-y_hat

# 將損失值加入到損失列表當中

sum(error **2)

/2)# 根據差距調整權重w_,根據公式:調整為 權重(j)=權重(j)+ 學習率*sum((y-y_hat)*x(j))

self.w_[0]

+= self.alpha * np.

sum(error)

self.w_[1:

]+= self.alpha * np.dot(x.t, error)

defpredict

(self, x)

:"""根據引數傳遞的樣本,對樣本資料進行**。

:parameter

x:類陣列型別,形狀:[樣本數量,特徵數量]

待測試的樣本。

:returns

result:陣列型別。

**的結果。

"""x = np.asarray(x)

result = np.dot(x, self.w_[1:

])+self.w_[0]

return result

lr = linearregression(alpha=

0.001

, times=20)

t = data.sample(

len(data)

, random_state=0)

train_x = t.iloc[

:400,:

-1]train_y = t.iloc[

:400,-

1]test_x = t.iloc[

400:,:

-1]test_y = t.iloc[

400:,-

1]lr.fit(train_x,train_y)

result = lr.predict(test_x)

# print(np.mean((result - test_y) ** 2))

# print(lr.w_)

class

standardscaler

:"""該類對資料進行標準化處理。"""

deffit

(self, x)

:"""根據傳遞的樣本,計算每個特徵列的均值與標準差。

:parameter

x:類陣列型別

訓練資料,用來計算均值與標準差。

"""x = np.asarray(x)

self.std_ = np.std(x, axis=0)

self.mean_ = np.mean(x, axis=0)

deftransform

(self, x)

:"""對給定的資料x進行標準化處理。(將x的每一列都變成標準正態分佈的資料)

:parameter

x: 類陣列型別

待轉換的資料。

:returns

result:類陣列型別。

引數x轉換成標準正態分佈後的結果。

"""return

(x-self.mean_)

/self.std_

deffit_transform

(self, x)

:"""對資料進行訓練,並轉換,返回轉換之後的結果。

:parameter

x:類陣列型別

待轉換的資料

:returns

result:類陣列型別

引數x轉換成標準正態分佈後的結果。

"""self.fit(x)

return self.transform(x)

# 為了避免每個特徵數量級的不同,從而在梯度下降的過程中帶來影響。

# 我們現在對每個特徵進行標準化處理

lr = linearregression(alpha=

0.0005

,times=20)

t = data.sample(

len(data)

, random_state=0)

train_x = t.iloc[

:400,:

-1]train_y = t.iloc[

:400,-

1]test_x = t.iloc[

400:,:

-1]test_y = t.iloc[

400:,-

1]# 對資料進行標準化處理

s = standardscaler(

)train_x = s.fit_transform(train_x)

test_x = s.fit_transform(test_x)

s2 = standardscaler(

)train_y = s.fit_transform(train_y)

test_y = s.fit_transform(test_y)

lr.fit(train_x, train_y)

result = lr.predict(test_x)

print

(np.mean(

(result - test_y)**2

))

機器學習(三) 線性回歸

矩陣是二維陣列的另一種說法。矩陣的維數即行數 列數。aij指第i行,第j列的元素。向量是一種特殊的矩陣,是只有一列的矩陣。通常在書寫時,使用大寫字母表示矩陣,小寫字母表示向量。mn矩陣乘以no矩陣變成m o矩陣。通過構建兩個矩陣可以快速地把這三個假設函式應用到4個房子的尺寸中,得到12種基於3個假設...

機器學習基礎 線性回歸演算法

要明白什麼是線性回歸演算法,首先要明白什麼是線性,什麼是非線性 什麼是回歸。線性 指兩個變數之間的關係是一次函式的關係 即影象為直線非線性 兩個變數之間的關係不是一次函式關係的 圖象不是直線,叫做非線性。回歸 人們在測量事物的時候因為客觀條件所限,求得的都是測量值,而不是事物真實的值,為了能夠得到真...

機器學習 西瓜書 三 線性回歸 對數線性回歸

牆裂推薦閱讀 的衍生物 假設樣本x有d個屬性,線性模型 linear model 試圖學得乙個通過屬性的線性組合來進行 的函式,即f x w 1x1 w2x2 wdxd bf x w1 x1 w 2x2 w dxd b,向量形式 f x w tx b f x wt x b對離散屬性,若屬性值之間存在...