1、线性回归的原理
线性回归类似拟合出一条广义直线最佳匹配训练集中的所有数据,一般用最小二乘法求解。它指的是拟合出的广义直线代表的真实值和观测到的数据的误差的平方和最小的一条直线。最小二乘法将最优问题转化为函数求极值问题。
数学形式:
y
=
θ
0
+
θ
1
x
1
+
θ
2
x
2
+
.
.
.
+
θ
n
x
n
,
y
⊂
R
y= \theta_0+\theta_1x_1+\theta_2x_2+...+\theta_n x_n,y\subset R
y=θ0+θ1x1+θ2x2+...+θnxn,y⊂R
矩阵形式:
Y
=
X
θ
,
Y
⊂
R
k
Y=X\theta ,Y \subset R^k
Y=Xθ,Y⊂Rk
其中X矩阵是k行n+1列的,每一行是一个样本点,每一列是样本的某一个特征。
X
=
(
1
x
1
1
x
1
2
.
.
.
x
1
n
1
x
2
1
x
2
2
.
.
.
x
2
n
.
.
.
.
.
.
1
x
k
1
x
k
2
.
.
.
x
k
n
)
θ
=
(
θ
0
θ
1
θ
2
.
.
.
θ
n
)
X=\begin{pmatrix} 1&x_1^1&x_1^2&...&x_1^n\\ 1&x_2^1&x_2^2&...&x_2^n\\...\\...\\1&x_k^1&x_k^2&...&x_k^n\end{pmatrix} \theta=\begin{pmatrix} \theta_0\\\theta_1 \\\theta_2\\...\\\theta_n\end{pmatrix}
X=⎝⎜⎜⎜⎜⎛11......1x11x21xk1x12x22xk2.........x1nx2nxkn⎠⎟⎟⎟⎟⎞θ=⎝⎜⎜⎜⎜⎛θ0θ1θ2...θn⎠⎟⎟⎟⎟⎞
线性回归可以理解为争取让所有的样本点都落在直线上,即所有样本点和直线的距离很近,因此代价函数为:
m
i
n
f
(
x
)
=
∣
∣
X
θ
−
Y
∣
∣
2
minf(x)=||X\theta-Y||^2
minf(x)=∣∣Xθ−Y∣∣2
利用最小二乘法可以获得代价函数的解析表达式:
θ
=
(
X
T
X
)
−
1
X
T
Y
\theta=(X^TX)^{-1}X^TY
θ=(XTX)−1XTY
线性回归优点:实现简单,计算简单;
线性回归缺点:不能拟合非线性数据;
2、线性回归代码实现:
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn import datasets, linear_model
X_parameters=[[1],[2],[3],[4],[5]]
Y_parameters=[[4],[5],[6],[7],[8]]
predict_value=6
regr = linear_model.LinearRegression() # 线性模型的使用
regr.fit(X_parameters, Y_parameters) # 对参数进行拟合
predict_outcome = regr.predict(predict_value) # 产生预测值
theta0=regr.intercept_ # Intercept value:偏差值
theta1=regr.coef_ # coefficient value:权重值
plt.scatter(X_parameters,Y_parameters,color='blue')
plt.plot(X_parameters,regr.predict(X_parameters),color='red',linewidth=4)
>>plt.show()
3、多项式回归代码实现
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
from sklearn import datasets, linear_model
from scipy.optimize import leastsq
#样本数据(Xi,Yi),需要转换成数组(列表)形式
Xi=np.array([1,2,3,4,5,6])
Yi=np.array([9.1,18.3,32,47,69.5,94.8])
'''
1设定拟合函数和偏差函数
2函数的形状确定过程:先画样本图像,再根据样本图像大致形状确定函数形式(直线、抛物线、正弦余弦等)
'''
#需要拟合的函数func:指定函数的形状,可以为二次函数,三次函数......多次函数,次数越高系数越多
def func(p,x):
a,b,c=p
return a*x*x+b*x+c
#偏差函数:x,y都是列表:这里的x,y更上面的Xi,Yi中是一一对应的
def error(p,x,y):
return func(p,x)-y
'''
1.leastsq函数的返回值tuple,第一个元素是求解结果,第二个是求解的代价值(个人理解)
2.官网的原话(第二个值):Value of the cost function at the solution
3.实例:Para=>(array([ 0.61349535, 1.79409255]), 3)
4.返回值元组中第一个值的数量跟需要求解的参数的数量一致
'''
#k,b的初始值,可以任意设定,经过几次试验,发现p0的值会影响cost的值:Para[1]
p0=[10,10,10]
#把error函数中除了p0以外的参数打包到args中(使用要求)
Para=leastsq(error,p0,args=(Xi,Yi))
#读取结果
a,b,c=Para[0]
print("a=",a,"b=",b,"c=",c)
print("cost:"+str(Para[1]))
print("求解的拟合直线为:")
print("y="+str(round(a,2))+"x*x+"+str(round(b,2))+"x+"+str(c))
plt.scatter(Xi,Yi,color="green",linewidth=2)
x=np.linspace(0,12,100) ##在0-15直接画100个连续点
y=a*x*x+b*x+c ##函数式
plt.plot(x,y,color="red",linewidth=2)
plt.show()