線性迴歸實現
x,y 是向量,a,b是標量
梯度下降法:
cost :代價函數
實驗數據:
實現結果:
算法流程:
代碼實現:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# 線性迴歸實現 梯度下降方法
# y = ax + b
# a, b 是標量
# x, y 是向量
# 模型 y = ax + b, 需要訓練出 a 和 b 的值
def model(a, b, x):
# numpy的廣播特徵
# print(a, b, x)
ret = a*x+b
# print("ret : ", ret)
# ret = [a*i+b for i in x]
# print(ret)
return ret
# 代價|損失函數
def cost_function(a, b, x, y, n=5):
# 1/(2n) * sum( square(yi -yi`) )
return 0.5 / n * (np.square(y - a * x - b)).sum()
# 梯度下降方法 對a,b進行優化
def optimize(a, b, x, y, n=5):
# a = a-alpha*(損失函數對a求偏導)
alpha = 1e-1
y_hat = model(a, b, x)
da_t = y_hat - y
da = (1.0 / n) * ((y_hat - y) * x).sum()
db = (1.0 / n) * (y_hat - y).sum()
a = a - alpha * da
b = b - alpha * db
return a, b
# 使用x, y 向量訓練出 a, b兩個標量
def train(x, y, cost=10000):
# 初始化 a=b=0
a = b = 0.0
# 進入循環 直到到達循環結束條件
# 循環結束條件:損失函數最小值 #這兒我是用控制循環次數來結束循環
while True:
# 優化方法 使用梯度下降的算法,對a,b進行優化
a, b=optimize(a, b, x, y)
cost = cost - 1
if cost == 0:
break
return a, b
if __name__ == "__main__":
# 數據提取 使用pandas
# ds 的類型:<class 'pandas.core.frame.DataFrame'>
ds = pd.read_csv("LinearRegression.csv")
print(type(np.array(ds.iloc[:, [1]])),np.array(ds.iloc[:, [1]]))
# 將數據變成一維
# np.array(ds.iloc[:, [1]])
# 將 <class 'pandas.core.frame.DataFrame'> 轉換爲 <class 'numpy.ndarray'>
# narray.reshape(-1) 將 numpy.narray 的多維轉換爲一維
x = np.array(ds.iloc[:, [1]]).reshape(-1)
print(type(x), x)
y = np.array(ds.iloc[:, [2]]).reshape(-1)
# x = [float(i) for i in x]
# y = [float(i) for i in y]
# print(type(np.array(ds.iloc[:, [1]]).reshape(-1)),np.array(ds.iloc[:, [1]]).reshape(-1) )
# print(type(x), x)
# print(type(y), y)
# 使用 6 張圖片顯示
count = 1
for i in range(1, 7):
plt.subplot(3, 2, i)
a, b = train(x, y, count)
plt.plot(x, y, "bo")
plt.plot(x, model(a, b, x))
count = count * 3
plt.show()