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對離散屬性,若屬性值之間存在...