机器学习小白手推一元线性回归[附代码]

手推一元线性回归(附代码)

引言

由于经常做运维和编程工作,线性代数知识已经多年没有用了,基本已还给老师,线性回归的思路也是机器学习的基本思路,所以打算复习一下。顺便做个一元线性笔记,忘记的时候可以拿出来回顾一下。

本文主要以手推为主,程序作为辅助,程序语言选用python。

线性回归

提出问题

根据下表内容,预测指定年龄的儿童体重。例如:预测表中没有的,19岁儿童的标准体重。
在这里插入图片描述

用例说明

为方便手工推算计算,我取表中标准体重的前5个数据:[10.05,12.54,14.65,16.64,18.98],分别对应1岁到5岁年龄。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression

#体重
weights=[10.05,12.54,14.65,16.64,18.98]
#年龄
ages=[1,2,3,4,5]
df=pd.DataFrame()
df['age']=ages
df['weight']=weights
# 散点图
df.plot(kind='scatter', x='age', y='weight', c=None, s=15) # s:点的大小  c:点的颜色 c =np.squeeze(colors)
plt.title(u'儿童年龄体重对照', fontsize=15,fontdict=dict(family='KaiTi')) #楷体
plt.show()

分布图如下,看上去像是某种线性关系:在这里插入图片描述

如果要预测儿童6岁时的体重,我们可以根据中学的知识,把这线散点拟合成直线方程:

y = ax + b

然后把6代入方程就可以预测出6岁时的体重。这就是线性回归。

一元线性回归就是找一条直线,并且让图中的散点尽可能靠近这条直线

我们先随手画直线:
在这里插入图片描述

这又面临另一个问题:到底是红色直线更能拟合图中的散点?还是黄色直线?又或是其他直线呢?
解决这个问题就需要引入最小二乘法

假设我们的拟合直线为: f ( x ) = 2.25 x + 7.73 f(x)=2.25x+7.73 f(x)=2.25x+7.73

根据上面的例子,把5个样本(即1岁到5岁标准体重)分别代入上述方程可以得出5个预测结果:
y 1 ^ = f ( x 1 ) = 2.25 × 1 + 7.73 = 9.98 \hat{y_1}=f(x_1)=2.25\times1+7.73=9.98 y1^=f(x1)=2.25×1+7.73=9.98
y 2 ^ = f ( x 2 ) = 2.25 × 2 + 7.73 = 12.23 \hat{y_2}=f(x_2)=2.25\times2+7.73=12.23 y2^=f(x2)=2.25×2+7.73=12.23
y 3 ^ = f ( x 3 ) = 2.25 × 3 + 7.73 = 14.48 \hat{y_3}=f(x_3)=2.25\times3+7.73=14.48 y3^=f(x3)=2.25×3+7.73=14.48
y 4 ^ = f ( x 4 ) = 2.25 × 4 + 7.73 = 16.73 \hat{y_4}=f(x_4)=2.25\times4+7.73=16.73 y4^=f(x4)=2.25×4+7.73=16.73
y 5 ^ = f ( x 5 ) = 2.25 × 5 + 7.73 = 18.98 \hat{y_5}=f(x_5)=2.25\times5+7.73=18.98 y5^=f(x5)=2.25×5+7.73=18.98

数学中的估计值一般用上面带尖的符号表示,如: θ ^ \hat{\theta} θ^, 读作theta hat。

##使用程序计算

上面为手算结果,很慢,且累。这才用了5个数据样本,现实中的数据远比这个多得多,所以需要程序辅助。
接上面的程序

y_head5_predict=([2.25*x+7.73 for x in df['age']]) #拟合结果

y_head5_predict的计算结果,即方程: f ( x ) = 2.25 x + 7.73 f(x)=2.25x+7.73 f(x)=2.25x+7.73 的预测结果

[9.98, 12.23, 14.48, 16.73, 18.98]

与真实结果做个对比

[ 9.98, 12.23, 14.48, 16.73, 18.98]
[10.05, 12.54, 14.65, 16.64, 18.98]

最小二乘法

损失函数

可以发现上面的预测结果与真实数据存在误差,毕竟预测结果是方程算出的嘛,和真实值当然会不一样了。那么如何来恒量这个误差呢?

残差公式

e = f ( x i ) − y i e=f(x_i)-y_i e=f(xi)yi

把预测值与真实值相减便得出了这个误差。也可以写成这样:
y i ^ − y i = ϵ \hat{y_i}-y_i=\epsilon yi^yi=ϵ
但是这种算的结果有时是负数,计算起来不方便,于是就把它作平方处理。

损失函数原型
和方差(SSE)

S S E = ∑ i = 1 m ( y i − y i ^ ) 2 SSE=\sum_{i=1}^{m}(y_i-\hat{y_i})^2 SSE=i=1m(yiyi^)2

均方误差(MSE)

M S E = S S E N = 1 N ∑ i = 1 m ( y i − y i ^ ) 2 MSE=\frac{SSE}{N}=\frac{1}{N}\sum_{i=1}^{m}(y_i-\hat{y_i})^2 MSE=NSSE=N1i=1m(yiyi^)2

均方根(RMSE)

R M S E = M S E = 1 N ∑ i = 1 m ( y i − y i ^ ) 2 \Large RMSE=\sqrt{MSE}=\sqrt{\frac{1}{N}\sum_{i=1}^{m}(y_i-\hat{y_i})^2} RMSE=MSE =N1i=1m(yiyi^)2


总之,这些公式的值最越小,说明损失越小,线性方程就能更好地拟合样本数据。

参数估计——最小二乘法

以上面例子的方程:
f ( x ) = a x + b f(x)=ax+b f(x)=ax+b
找出最合适的参数a和b,就是展开后:
f ( a , b ) = ∑ i = 1 m ( y i − y i ^ ) 2 = ∑ i = 1 m ( y i − ( a x i + b ) ) 2 f(a,b)=\sum_{i=1}^{m}(y_i-\hat{y_i})^2=\sum_{i=1}^{m}(y_i-(ax_i+b))^2 f(a,b)=i=1m(yiyi^)2=

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值