目录
一、什么是一元线性回归
回归分析(Regression Analysis),是确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。在回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。
二、使用Excel完成一元线性回归
(1)选取20组数据进行回归
(2)选取200组数据进行回归
(3)选取2000组数据进行回归
(4)选择20000组数据进行回归
三、自定义最小二乘法实现一元线性回归
1、自定义回归函数
#定义拟合函数
def fit(data):
n = len(data.loc[:,"Height"])
x_aver = np.mean(data.loc[:,"Height"]) #求x平均值
y_aver = np.mean(data.loc[:,"Weight"]) #求y平均值
sum_yx = 0
sum_x2 = 0
# 求xy的和,以及x^2的和
for i in range(n):
x = data.loc[i,"Height"]
y = data.loc[i,"Weight"]
sum_yx += y*x
sum_x2 += x**2
#根据公式计算w,b
w = (sum_yx - n*x_aver*y_aver) / (sum_x2-n*(x_aver**2))
b = y_aver - w*x_aver
return w,b #返回参数 y = wx +b
2、选取20组数据进行回归
#使用20个点进行拟合
w,b = fit(data.iloc[:20])
y_pred = w*x[:20] + b
plt.xlabel("Height")
plt.ylabel("Weight")
plt.scatter(x[:20],y[:20],c = 'b',alpha = 0.6)
plt.plot(x[:20], y_pred,color = 'r')
print("拟合函数R2为: r2 = ",r2_score(y[:20],y_pred))
拟合函数R2为: r2 = 0.3254230249366241
3、选取200组数据进行回归
#使用200个点进行拟合
w,b = fit(data.iloc[:200])
y_pred = w*x[:200] + b
plt.xlabel("Height")
plt.ylabel("Weight")
plt.scatter(x[:200],y[:200],c = 'b',alpha = 0.6)
plt.plot(x[:200], y_pred,color = 'r')
plt.savefig("自定义200.png")
plt.show()
print("拟合函数R2为: r2 = ",r2_score(y[:200],y_pred))
拟合函数R2为: r2 = 0.3099955343309223
4、选取2000组数据进行回归
#使用2000个点进行拟合
w,b = fit(data.iloc[:2000])
y_pred = w*x[:2000] + b
plt.xlabel("Height")
plt.ylabel("Weight")
plt.scatter(x[:2000],y[:2000],c = 'b',alpha = 0.6)
plt.plot(x[:2000], y_pred,color = 'r')
plt.savefig("自定义2000.png")
plt.show()
print("拟合函数R2为: r2 = ",r2_score(y[:2000],y_pred))
拟合函数R2为: r2 = 0.24830120336384298
三、使用Sklearn库实现一元线性回归
以200组数据进行回归
#导入库
from sklearn import datasets #导入数据模块
from sklearn.model_selection import train_test_split #导入切分训练集、测试集模块
from sklearn.linear_model import LinearRegression
from matplotlib import pyplot as plt
import pandas as pd
from sklearn.metrics import r2_score
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
#读取数据
data = pd.read_csv("weights_heights.csv",encoding = 'gb2312')
x = data[["Height"]]
y = data[["Weight"]]
x_train, x_test, y_train, y_test = train_test_split(x[:200], y[:200],test_size = 0.2)
model = LinearRegression() #实例化模型
model.fit(x_train, y_train) #用训练数据训练
plt.scatter(x[:200],y[:200],c = 'b',alpha = 0.6)
plt.plot(x_test, model.predict(x_test), color='r')
plt.xlabel("Height")
plt.ylabel("Weight")
plt.savefig("一元线性回归.png")
plt.show()
print("拟合函数R2为: r2 = ",r2_score(y_test,model.predict(x_test)))
拟合函数R2为: r2 = 0.2304650098515707
四、总结
最小二乘法是试图找到一条直线,使得所有样本点到直线的欧氏距离之和最小,即最小化均方误差。