目录
第一步:引入必要的库并且创建数据集(这里使用的例子是房价与面积的关系)
第三步 观察与测评求出的W,B值与数据集的拟合程度并且做出预测
前言 (基础知识的准备 最小二乘法在回归中的应用)
1. 简单线性回归中的最小二乘法公式
2. 多元线性回归中的最小二乘法公式
利用最小二乘法解决最简单的一元线性回归问题
第一步:引入必要的库并且创建数据集(这里使用的例子是房价与面积的关系)
这里用的是随机的数据(房价与房屋面积)
- 假设房屋价格与房屋面积呈近似线性关系
In [194]:
import numpy as np import math import matplotlib.pyplot as plt
In [195]:
def make_data(): np.random.seed(1) x = np.random.rand(50)*30+50 #随机数生成100个数据表示房屋面积 以数组形式 noise = np.random.rand(50)*50 #噪声 y = x*8-100+noise #表示房屋价格 数组形式 return x,y
利用图标展现房屋价格与房屋面积的关系
In [197]:
# 生成房屋价格与房屋面积的散点图 x,y=make_data() plt.xlabel('area') plt.ylabel('prize') plt.title('Area-Prize Table') plt.scatter(x, y, c='r', marker='.', alpha=0.6, label='prize', linewidths=3) plt.legend() plt.show()
很明显他呈现近似一元线性关系,因此我们可以用一些方法去最大程度上拟合这条直线
第二步 利用某些方法去用一条直线去拟合你的数据
-
采用最小二乘法解决一元线性回归 (它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。) 设拟合直线的公式为 y=wx+by=wx+b
In [199]:
def Ordinaryleastsquares(x,y): D = 0 D2 = 0 E = 0 head = 0 x_aver = int(sum(x)) / 50 y_aver = int(sum(y)) / 50 for i in range(0,50): # # print(i) D= abs(x[i]-x_aver) D2= abs(y[i]-y_aver) head = head + (D * D2) E=E + (D**2) K=head/E B = y_aver - K * x_aver print(f"w:{K}, b:{B}") return K,B
第三步 观察与测评求出的W,B值与数据集的拟合程度并且做出预测
对于线性回归我们可以使用以下几种来评定拟合效果的好坏:
- 均方误差(MSE - Mean Squared Error)
- 定义:均方误差是预测值与真实值之差的平方的平均值。假设我们有(n)(n)个样本,真实值为(yi)(yi)预测值为(^yi)(y^i),那么均方误差的计算公式为(MSE=1n∑ni=1(yi−^yi)2)(MSE=1n∑i=1n(yi−y^i)2)。
- 解释:它衡量的是预测值与真实值之间的平均平方差异。MSE的值越小,说明模型的拟合效果越好。例如,在一个房价预测的线性回归模型中,如果MSE很大,意味着预测的房价和实际房价之间的差距在平方后平均起来很大,模型可能没有很好地捕捉到数据中的规律。
- 均方根误差(RMSE - Root Mean Squared Error)
2.平均绝对误差(MAE - Mean Absolute Error)
- 3. 决定系数((R2)((R2) - Coefficient of Determination)
In [213]:
#图片生成(散点图,回归直线) plt.xlabel('area') plt.ylabel('prize') plt.title('house-area map') k,b=Ordinaryleastsquares(x,y) prize = k * x+ b #误差线 plt.errorbar(x, y, yerr=abs(y-prize), fmt='o', color='g',label='Data Points with Error Bars') plt.plot(x, prize, 'r', label='Fitted Line') plt.xlabel('x') plt.ylabel('y') plt.title('Data Points with Error Bars and Fitted Line') plt.legend() plt.show()
w:8.137163841113459, b:-83.47848583126137
让我们计算各个值与直线上的点的值的误差,即误差函数为多少
In [215]:
def compute_cost(x_train,y_train,w,b): m = x_train.shape[0] cost = 0 for i in range(m): jwb=w*x_train[i]+b-y_train[i] cost+=jwb**2 total_cost= (1/(2*m))*cost return total_cost
In [217]:
cost = compute_cost(x,y,k,b) print(f"cost : {cost}") plt.hist(y-prize, bins='auto') plt.xlabel('Residuals') plt.ylabel('Frequency') plt.title('Histogram of Residuals') plt.show()
cost : 98.50617138629528
- 从图上来看误差普遍分布在-20到20上
- 让我们计算相关系数 R2
- (R2)(R2)的值介于0和1之间,越接近1,表示模型的拟合效果越好
In [ ]:
def compute_R2(x,y,w,b): n = x.shape[0]#获取样本数量 sum_1=0 sum_2=0 for i in range(n): sum_2+=(y[i]-np.average(y))**2 sum_1+=(y[i]-w*x[i]-b)**2 R2 = 1- sum_1/sum_2 return R2
In [ ]:
R2 = compute_R2(x,y,k,b) print(f"R2 = {R2}")
R2 = 0.9657412767801896
- 好了,通过本次学习,我们掌握了如何使用最小二乘法解决一元线性回归问题,但是拟合效果不好。但是当我们遇到多个特征的变量时,该如何去拟合这些数据呢,或者这些数据点并不都是线性关系,我们该如何拟合呢
- 下节我们将了解梯度下降法解决多特征的问题以及如何用梯度下降法去很好的拟合我们的数据并且做出很好的预测
ipynb::笔记
链接: https://pan.baidu.com/s/1A84Wrks6taEFKlkoAETiaQ?pwd=6666 提取码: 6666