目录
基础知识
几种常见函数的导数:
① 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))