所谓回归,就是根据一组特征数据和结果,预测新的特征数据的结果。这个结果,在一定范围内。
比如去银行贷款,银行问了你的工资和年龄(2个特征),他会用这两个做参考,最终给你贷多少钱。
而现在有5个样本,就是知道这些人的特征和贷款额度,预测银行给你的贷款额度。
工资(x1) | 年龄(x2) | 额度(y) |
4000 | 25 | 20000 |
8000 | 30 | 70000 |
5000 | 28 | 35000 |
7500 | 33 | 50000 |
12000 | 40 | 85000 |
思路:工资和年龄都会影响最终银行贷款的额度,那么它们各自有多大的影响?这就是要求解的参数
(工资,年龄)就是两个特征,记为,银行最终会贷多少,记为。
找到最合适的一个面来拟合这些数据点。就是找到最合适的参数,这样这个问题就解决了。
假设:是年龄的参数, 是工资的参数
拟合的平面: (是偏置项)(没有组合,产生的影响小)
整合为:,这里引入一个=1,额外增加一列,方便矩阵计算
误差:既为预测,真实值和预测值之间肯定是存在差异的(用来表示误差)。
对于每个样本:(为真实值,为预测值)
所以,有多少个样本,就有多少个误差。
这些误差是独立并且具有相同的分布,且服从均值为0方程为的高斯分布
独立:张三和李四来贷款,他俩没关系。(银行贷给张三的额度和贷给李四的额度互不影响)
同分布:他俩都来我们假定的这家银行。(讨论的问题是同一个银行,不能把A银行和B银行的数据放在一起讨论)
高斯分布:银行可能会多给,可能会少给,但是绝大多数情况下这个浮动不会太大,极小情况下浮动会比较大,符合正常情况。
预测值与误差: (1)
由于误差服从高斯分布: (2)
把(1)式带人(2)式,可得:
接下来,引入似然函数
似然函数:
也就是什么样的参数跟我们的数据组合后恰好是真实值。似然函数就是预测值成为真实值的可能性。
不知道是什么分布,自己去观测出一批样本,估计出这个参数。
对数似然:
累乘难解,引入对数,把累乘转换成累加
展开化简:
=
前面项为常数,故后面项越小越好
目标:让似然函数(对数变换后也一样)越大越好
的值越小越好
所以
求偏导:
=
=
偏导等于0的时候取最小值,可解得
求出参数,怎么样知道这个模型好不好,是否可以用来预测目标值?
评估方法:
最常用的评估项
分子为残差平方和,分母类似方差项
的取值越接近于1,我们认为模型拟合的越好
用python实现简单线性回归
import numpy as np
from matplotlib import pylab as pl
# 定义训练数据
x = np.array([1,3,2,1,3])
y = np.array([14,24,18,17,27])
# 回归方程求取函数
def fit(x,y):
if len(x) != len(y):
return
numerator = 0.0
denominator = 0.0
x_mean = np.mean(x)
y_mean = np.mean(y)
for i in range(len(x)):
numerator += (x[i]-x_mean)*(y[i]-y_mean)
denominator += np.square((x[i]-x_mean))
print('numerator:',numerator,'denominator:',denominator)
b0 = numerator/denominator
b1 = y_mean - b0*x_mean
return b0,b1
# 定义预测函数
def predit(x,b0,b1):
return b0*x + b1
# 求取回归方程
b0,b1 = fit(x,y)
print('Line is:y = %2.0fx + %2.0f'%(b0,b1))
# 预测
x_test = np.array([0.5,1.5,2.5,3,4])
y_test = np.zeros((1,len(x_test)))
for i in range(len(x_test)):
y_test[0][i] = predit(x_test[i],b0,b1)
# 绘制图像
xx = np.linspace(0, 5)
yy = b0*xx + b1
pl.plot(xx,yy,'k-')
pl.scatter(x,y,cmap=pl.cm.Paired)
pl.scatter(x_test,y_test[0],cmap=pl.cm.Paired)
pl.show()
拟合后的方程是: y = 5x + 10,拟合效果如下