4.线性回归算法
4.1简单线性回归
在前面介绍了一种解决分类问题的最基本算法kNN,本章会介绍解决回归问题的最基本算法—线性回归。
线性回归算法思想:寻找一条直线,最大程度的拟合样本特征和样本标签之间的关系。当样本只有一个特征时,称为简单线性回归;样本特征大于1时,称为多元线性回归。
4.1.1简单线性回归算法的实现
假设最佳拟合的直线方程为y = ax + b;对于每个样本x(i),根据直线方程得到的预测值为,其真实值为y(i)。
我们希望真实值和预测值之间的差距尽可能的小,因此用来表示两者之间的距离。由于需要求出a和b的数值,因此使用来表示真实值和预测值的距离。
当有m个样本时,真实值和预测值的距离可以表示为:
上述函数称为损失函数,通过求损失函数的最优化解(这里指最小值),得到a和b的数值,即获得机器学习的模型。
这是一个典型的最小二乘法问题,可以得到:
#程序4-1
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
#波士顿房价
boston = datasets.load_boston()
print(boston.keys())
#以每个住宅的平均房间数(RM)为特征
x = boston.data[:,5].copy()
y = boston.target.copy()
print(x.shape)
print(y.shape)
#画散点图
# plt.scatter(x,y,color='blue',marker='+',alpha=0.5)
# plt.show()
#取出y的边界值
x = x[y < np.max(y)]
y = y[y < np.max(y)]
print(x.shape)
print(y.shape)
x_mean = np.mean(x)
y_mean = np.mean(y)
#方法1:使用for循环遍历
# num = 0.0 #a的分子
# den = 0.0 #a的分母
# for x_i,y_i in zip(x,y):
# num += (x_i - x_mean)*(y_i - y_mean)
# den += (x_i - x_mean)**2
# a = num/den
# b = y_mean - a*x_mean
# print('a = ',a,' b = ',b)
#方法2:使用向量/矩阵的乘法
num = (x - x_mean).dot(y - y_mean)
den = (x - x_mean).dot(x - x_mean)
a = num/den
b = y_mean - a*x_mean
print('a = ',a,' b = ',b)
运行结果:
dict_keys(['data', 'target', 'feature_names', 'DESCR', 'filename'])
(506,)
(506,)
(490,)
(490,)
a = 8.268557322426979 b = -30.005120145375827
4.1.2如何评价回归问题
(1)均方误差MSE(me