一、Linear Regression學習小結

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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章