Linear Regression小結:
1.sklearn的linear_model
#pandas這裏用來讀取txt文本中的內容
import pandas as pd
#linear_model用來進行線性規劃
from sklearn import linear_model#matplotlib用來作圖
import matplotlib.pyplot as plt #讀取數據
#read_fwf讀取固定長度的table或者格式化的行 到dataframe中
dataframe = pd.read_fwf('brain_body.txt')#x_values是用來預測的數據,即根據x_values預測y 格式爲[],不能是1維 必須是二維
x_values = dataframe[['Brain']]
#y_values是給定的被預測值,維度和x_values一致
y_values = dataframe[['Body']] #訓練模型#body_reg作爲LinearRegression的實例化對象進行後續的fit和predict
body_reg = linear_model.LinearRegression()
#這一步即給定x和y,進行擬合,得到最優解
body_reg.fit(x_values, y_values)#進行作圖 #先把原來的x和y打成散點圖
plt.scatter(x_values, y_values)
#將x和預測後的y做成直線,predict方法必須先進行擬合,得到的是y的組
plt.plot(x_values, body_reg.predict(x_values)) plt.show()2.自己編寫梯度下降的函數並用它進行線性迴歸
import numpy as np class LinearRegressor:
#構造函數 傳入四個參數
def __init__(self, num_iteration, learning_rate, initial_m, initial_b): self.num_iteration = num_iteration self.learning_rate = learning_rate self.m = initial_m self.b = initial_b#梯度下降第一步計算
#m和b的取值爲:m = m - 1/n * Σ 2 * x * (mx + b - y)
b = b - 1/n * Σ 2 * (mx + b - y)
def compute_gradient(self, data):
#第一步 先計算Σ後面的total
total_gradient_m = 0 total_gradient_b = 0 for i in range(len(data)): x, y = data[i]#mx + b根據定義 就是predict_y
predict_y = self.predict(x) gradient_m = 2 * x * (predict_y- y) gradient_b = 2 * (predict_y- y) total_gradient_m += gradient_m total_gradient_b += gradient_b#計算平均的m和b 即減號後面的部分
average_gradient_m = total_gradient_m / float(len(data)) average_gradient_b = total_gradient_b / float(len(data)) return average_gradient_m, average_gradient_b#梯度下降第二部 迭代 #不停迭代 向下逼近最優解
def train(self, data):
#迭代次數爲循環次數
for i in range(self.num_iteration): #傳入計算的average_gradient m和b
#average gradient m和b也隨着每一次迭代發生着變化,因爲predict_y發生變化
gradient_m, gradient_b = self.compute_gradient(data)
self.m -= gradient_m * self.learning_rate
self.b -= gradient_b * self.learning_rate
#根據m和b計算預測y值
def predict(self, x): return self.m * x +self.b#計算MSE,MSE是均方誤差,代表擬合程度,MSE越小,則擬合程度越好
#MSE是y-(mx + b)^2的集合
def computeMSE(self, data):
#總的誤差設爲0
total_error = 0#對data裏的每一個數據進行遍歷
for i in range(len(data)):
#把x和y提取出來
x, y = data[i]#計算預測後的y值,當沒有訓練時,y就是原本的x
predict_y = self.predict(x)
#計算單個y和x對的方差
error = (y - predict_y) **2#進行累加
total_error += error
#計算平均方差 MSE
average_error = total_error / float(len(data)) return average_error def run(): data = np.genfromtxt('data.csv', delimiter = ',')#超參數,迭代次數,學習參數。還有斜率截距的初始值在這裏定義。 #define Hyper Parameter
num_iteration = 1000 learning_rate = 0.0002 initial_m = 0 initial_b = 0#傳參
model = LinearRegressor(num_iteration, learning_rate, initial_m, initial_b)#訓練之前的MSE計算
print("before train:{0}" + format(model.computeMSE(data)))#進行訓練
model.train(data)
#訓練之後的MSE計算
print("after train:{1}" + format(model.computeMSE(data)))#訓練之後的m和b
print(model.m) print(model.b) run()