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