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()