1.简单的线性回归
之前讲的KNN算法是分类,分类的目标变量是标称型数据,回归的目的是预测数值型的目标值。两者的区别是,回归用于预测连续型的数据,分类用于离散型数据。
一般说的回归都是线性回归,就是评估自变量X与因变量Y之间的一种线性关系。当只有一个自变量的时候,称为一元线性回归,即简单线性回归;当具有多个自变量的时候, 称为多元线性回归。一元线性回归就是输入的数据集:
能够找到一组参数a、b,使得:
简单线性回归算法目的就是找到a和b的值,使得预测值ŷi和真实值yi之间的绝对值最小,绝对值不好求导,因此变成求平方,即
将下面公式代入
使得预测值与真实值最小,即最佳拟合
要注意的是,a和b是未知数,而x,y是已知数,即我们要输入的一组数据,将数据集代入该函数,则能求出a和b的值。一般叫这个函数为损失函数,也有叫效用函数,损失函数越小越好,而效用函数则越大越好,即最优化这个函数,即我们的目标函数。
求a和b的值,即是最小二乘法的过程。
2.最小二乘法
最小二乘法就是指,找到a和b,使得
即为J(a,b),即求该式的极值,一般求极值,就是对该式进行求导,即对a,b进行求导,得:
由于b前面只有一个-1,因此先对b求导,即:
再对a求偏导,得到:
即得到:
3.基于Python实现
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
x=np.array([1.,2.,3.,4.,5.])
y=np.array([1.,3.,2.,3.,5.])
plt.scatter(x,y)
plt.axis([0,6,0,6])
#plt.show()
x_mean=np.mean(x)
y_mean=np.mean(y)
num=0.0
d=0.0
for x_i,y_i in zip(x,y):
num += (x_i-x_mean)*(y_i-y_mean)
d += (x_i-x_mean)**2
a = num/d
b = y_mean - a * x_mean
y_hat = a*x + b
plt.scatter(x,y)
plt.plot(x,y_hat,color='r')
plt.axis([0,6,0,6])
#plt.show()
x_predict=6
y_predict=a*x_predict+b
print('y_predict:',y_predict)