线性回归原理及应用

目录

基础知识

几种常见函数的导数:

导数的四则运算:

矩阵转置

线性回归

最小二乘法

来源

代码推导

导包

导入波士顿房价数据

用线性回归求X与y之间的关系

用公式计算,​代表斜率。

推导:

对w求导:

等式两边都乘以X的逆矩阵:

因为X矩阵不一定可逆,所以乘以它的逆矩阵:

等式两边都乘以逆矩阵:

单位矩阵用I表示:

得到最后的公式:

算法训练

无截距

斜率

截距(fit_intercept=False,不考虑截距)

预测

原理

有截距

例子:2020年天猫双十一销量

导包:

年份数据

金钱单位 亿元

画图

数据处理,缩小年份数据

算法训练

级联

算法训练



基础知识

几种常见函数的导数:

① C'=0(C为常数); 
② (x^n)'=nx^(n-1) (n∈Q); 
③ (sinx)'=cosx; 
④ (cosx)'=-sinx; 
⑤ (e^x)'=e^x; 
⑥ (a^x)'=a^xIna (ln为自然对数) 
⑦ loga(x)'=(1/x)loga(e)

导数的四则运算:

①(u±v)'=u'±v' 
②(uv)'=u'v+uv' 
③(u/v)'=(u'v-uv')/ v^2 
④[u(v)]'=[u'(v)]*v' (u(v)为复合函数f[g(x)])

矩阵转置

线性回归

最小二乘法

最小二乘法(又称最小平方法)是一种数学优化技术。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。

来源

最小二乘法(Least Squares Method,简记为LSE)是一个比较古老的方法,源于天文学和测地学上的应用需要。在早期数理统计方法的发展中,这两门科学起了很大的作用。丹麦统计学家霍尔把它们称为“数理统计学的母亲”。此后近三百年来,它广泛应用于科学实验与工程技术中。美国统计史学家斯蒂格勒( S. M. Stigler)指出, 最小二乘方法是19世纪数理统计学的压倒一切的主题。1815年时,这方法已成为法国、意大利和普鲁士在天文和测地学中的标准工具,到1825年时已在英国普遍使用。追溯到1801年,意大利天文学家朱赛普·皮亚齐发现了第一颗小行星谷神星。经过40天的跟踪观测后,由于谷神星运行至太阳背后,使得皮亚齐失去了谷神星的位置。随后全世界的科学家利用皮亚齐的观测数据开始寻找谷神星,但是根据大多数人计算的结果来寻找谷神星都没有结果。时年24岁的高斯也计算了谷神星的轨道。奥地利天文学家海因里希·奥尔伯斯根据高斯计算出来的轨道重新发现了谷神星。高斯于其1809年的著作《关于绕日行星运动的理论》中。在此书中声称他自1799年以来就使用最小二乘方法,由此爆发了一场与勒让德的优先权之争。近代学者经过对原始文献的研究,认为两人可能是独立发明了这个方法,但首先见于书面形式的,以勒让德为早。然而,现今教科书和著作中,多把这个发明权归功于高斯。其原因,除了高斯有更大的名气外,主要可能是因为其正态误差理论对这个方法的重要意义。勒让德在其著作中,对最小二乘方法的优点有所阐述。然而,缺少误差分析。我们不知道,使用这个方法引起的误差如何,就需建立一种误差分析理论。高斯于1823年在误差e1 ,… , en独立同分布的假定下,证明了最小二乘方法的一个最优性质: 在所有无偏的线性估计类中,最小二乘方法是其中方差最小的!在德国10马克的钞票上有高斯像,并配了一条正态曲线。在高斯众多伟大的数学成就中挑选了这一条,亦可见这一成就对世界文明的影响。

机器学习本质:解方程

代码推导

导包

import numpy as np

from sklearn.linear_model import LinearRegression

import matplotlib.pyplot as plt
%matplotlib  inline

from sklearn import datasets

导入波士顿房价数据

# 波士顿房价
boston = datasets.load_boston()
X = np.linspace(0,10,50).reshape(-1,1)
X

y = np.random.randint(2,8,size = 1)*X
y

用线性回归求X与y之间的关系

lr = LinearRegression()

#声明线性回归
lr.fit(X,y)
# coeficient 效率,斜率
# w ---->weight 权重,coef_和intercept_都是模型参数,即为w,coef_为w1到w4,intercept_为w0。
lr.coef_

用公式计算,代表斜率。

推导:

对w求导:

等式两边都乘以X的逆矩阵:

得:

整理:

因为X矩阵不一定可逆,所以乘以它的逆矩阵:

等式两边都乘以逆矩阵:

单位矩阵用I表示:

得到最后的公式:

算法训练

无截距

X = boston['data']
y = boston['target']
X.shape

#(506, 13)

from sklearn.model_selection import train_test_split

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size = 0.2)

lr = LinearRegression(fit_intercept=False)#fit_intercept代表截距,True为考虑截距,False为不考虑截距。

lr.fit(X_train,y_train)
# 斜率个数:属性的个数决定
display(lr.coef_,lr.intercept_)

斜率

截距(fit_intercept=False,不考虑截距)

预测

# 算法预测的结果  预测时是调用的线性回归函数
lr.predict(X_test).round(2)[:25]

其实线性回归预测的时候,调用的是线性回归方程:

原理

w = lr.coef_
X_test.dot(w).round(2)[:25]

由此可以看出与预测值相同。

 

有截距

lr.predict(X_test).round(2)[:15]

# 根据斜率和截距构造方程,进行求解的结果
(X_test.dot(lr.coef_) + lr.intercept_).round(2)[:15]

例子:2020年天猫双十一销量

认为天猫销量和年份之间存在函数关系 一元二次,一元三次

导包:

import numpy as np

import matplotlib.pyplot as plt
%matplotlib inline

年份数据

years = np.arange(2009,2020)
years

金钱单位 亿元

sales = np.array([0.5,9.36,52,191,352,571,912,1207,1682.69,2135,2684])

sales

画图

plt.scatter(years,sales,c = 'red',marker='*',s = 80)

数据处理,缩小年份数据

X = (years - 2008).reshape(-1,1)#对年份进行缩小
X

y = sales
y

算法训练

from sklearn.linear_model import LinearRegression

lr = LinearRegression(fit_intercept=True)#考虑截距

lr.fit(X,y)
# weight 权重 斜率
w = lr.coef_[0]
# bias 偏差
b = lr.intercept_ #截距
display(w,b)

plt.scatter(years -2008,sales,c = 'red',marker='*',s = 80)

x = np.linspace(1,12,50)

plt.plot(x,w*x + b,c = 'green')

上图可以看出 横坐标为1时,纵坐标为负数。显然是不正确的,图像没有很好的拟合。

改进方法:增加多元函数,及增加w

级联

X2 = np.concatenate([X**2,X],axis= 1)
X2

算法训练

# 假定函数是一元二次f(x) = w1*x**2 + w2*x + b

lr = LinearRegression(fit_intercept=True)

X2 = np.concatenate([X**2,X],axis= 1)#级联

lr.fit(X2,y)
# weight 权重
w1,w2 = lr.coef_
# bias 偏差
b = lr.intercept_
display(w1,w2,b)

plt.scatter(years -2008,sales,c = 'red',marker='*',s = 80)

x = np.linspace(1,12,50)

f = lambda x :w1*x**2 + w2*x + b

plt.plot(x,f(x),c = 'green')

# 2009 -----1
# 2010 -----2
# 2020 -----12
print('2020年天猫双十一销量预测:',np.round(f(12),1))

上图可以看出,图像能更好的拟合了。

另外还可以用三元的函数

# 假定函数是一元二次f(x) = w1*x**3 + w2*x**2 + w3*x+b

lr = LinearRegression(fit_intercept=True)

X3 = np.concatenate([X**3,X**2,X],axis= 1)

lr.fit(X3,y)
# weight 权重
w1,w2,w3 = lr.coef_
# bias 偏差
b = lr.intercept_

plt.scatter(years -2008,sales,c = 'red',marker='*',s = 80)

x = np.linspace(1,12,50)

f = lambda x :w1*x**3 + w2*x**2 + w3*x + b

plt.plot(x,f(x),c = 'green')

# 2009 -----1
# 2010 -----2
# 2020 -----12
print('2020年天猫双十一销量预测:',np.round(f(12),1))

 

 

 

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值