九、线性回归
1、概念
假设存在多个点,需要使用一条线来保障尽量拟合这些点,寻找这条线就叫回归。
机器学习中一种有监督学习的算法,回归问题主要关注的是因变量(需要预测的值)和一个或多个数值型的自变量(预测变量)之间的关系。
2、损失函数
存在数据:[[4.2, 3.8],[4.2, 2.7],[2.7, 2.4],[0.8, 1.0],[3.7, 2.8],[1.7, 0.9],[3.2, 2.9]]
假设 这个最优的方程是:y=wx+b
使用一种方法(均方差):通过预测点位的y值与实际y值的插值平方之和来衡量寻找的直线是否最优,这些值便成为均方差;也就是均方差越小,那么该线约优。
通过不断对直线的求解,得到很多的系数(w)值,这些值的关系函数便是损失函数。(函数最低点就是最优系数)
loss=1/n * ,直接表述为 loss=1/n *
目标为在纵坐标最小值的横坐标,也就是,不需要得到具体纵坐标值,所以变形为:
loss=1/2 *
3、最小二乘法MSE
3.1、原理
loss=1/2 *
loss' =
3.2、API
from sklearn.linear_model import LinearRegression
参数:fit_intercept 布尔值,是否计算偏置(纵轴截距)
属性:coef_ 解后的回归系数
intercept_ 解后的偏置
from sklearn.linear_model import LinearRegression
import numpy as np
data=np.array([[0,14,8,0,5,-2,9,-3,399],
[-4,10,6,4,-14,-2,-14,8,-144],
[-1,-6,5,-12,3,-3,2,-2,30],
[5,-2,3,10,5,11,4,-8,126],
[-15,-15,-8,-15,7,-4,-12,2,-395],
[11,-10,-2,4,3,-9,-6,7,-87],
[-14,0,4,-3,5,10,13,7,422],
[-3,-7,-2,-8,0,-6,-5,-9,-309]])
# 1、处理x值和y值
# x 数据为第一列到第八列所有行
x=data[:,0:8]
# y 数据为第九列所有行
y=data[:,8:]
# 2、创建算法对象
# fit_intercept 偏置
estimator=LinearRegression(fit_intercept=False)
# 传入x和y 训练
estimator.fit(x,y)
print("权重系数为:\n", estimator.coef_) #权重系数与特征数一定是同样的个数。
print("偏置为:\n", estimator.intercept_)
# 3、使用新数据进行预测结果
x_new=[[11,14,8,10,5,10,8,1]]
y_predict=estimator.predict(x_new)
print("预测结果:\n",y_predict)
4、梯度下降
4.1、原理:
= - a * '
学习率 a:控制每次前进距离
第一个点随机取值,找到该点的导数,判断往左走还是往右走一个距离,通过多次前进,向最优系数靠近。
前进的方式为判断该点导数的正负,判断向左还是向右移动,前进的距离大小由该点导数值与学习率控制。
4.2、代码实现
import numpy as np
import matplotlib.pyplot as plt
# 损失函数、损失函数导数、第一次的w值、学习率
# 损失函数
def loss(w):
return 10*w**2 - 15.9*w +6
# 损失函数导数
def dloss(w):
return 20*w-15.9
w = np.linspace(-50, 50,30)
plt.plot(w, loss(w))
# 数据点位的列表
x = []
y = []
# 随机产生第一次点位的w值
np.random.seed(666)
w = np.random.randint(-50,50)
x.append(w)
y.append(loss(w))
# 学习率
learning_rate = 0.01
# 开始进行多次学习
for i in range(1,13):
w = w-learning_rate*dloss(w)
learning_rate -= learning_rate*0.00005
x.append(w)
y.append(loss(w))
plt.scatter(x,y)
plt.show()