线性回归
一、原理
1.1 定义
寻找一条直线,最大程度“拟合”样本特征(X_data)和样本输出标记(Label)之间的关系。
1.2 解决的问题
分类问题和回归问题
二、简单线性回归(Sample Linear Regression Model)
2.1 公式推导
- 假设最佳拟合的直线方程为y=wx+b y=wx+b y = w x + b ,则有每一个样本点x(i) x(i) x ( i ) 就存在一个真实值y(i) y(i) y ( i ) 与其对应;
- 根据我们预测的直线方程ˆy(i)=wx(i)+b y^(i)=wx(i)+b y ^ ( i ) = w x ( i ) + b ,我们希望y(i) y(i) y ( i ) 和ˆy(i) y^(i) y ^ ( i ) 的差距尽量小;
- 那么我可以构造一个损失函数loss=∑ni=1(y(i)−ˆy(i))2 loss=∑ni=1(y(i)−y^(i))2 l o s s = ∑ i = 1 n ( y ( i ) − y ^ ( i ) ) 2 ,我的目标就是让损失函数尽可能的小;
- 将我们的预测函数ˆy(i)=wx(i)+b
y^(i)=wx(i)+b
y
^
(
i
)
=
w
x
(
i
)
+
b
带入损失函数中,得到
loss=n∑i=1(y(i)−wx(i)−b)2l o s s = ∑ i = 1 n ( y ( i ) − w x ( i ) − b ) 2
其中x(i) x ( i ) 与y(i) y ( i ) 均为已知量,我们需要找到w和b是loss的值尽可能小,这里需要使用最小二乘法; - 通过最小二乘法求得:
w=∑ni=1(x(i)−ˉx)(y(i)−ˉy)∑ni=1(x(i)−ˉx)2b=ˉy−wˉxw = ∑ i = 1 n ( x ( i ) − x ¯ ) ( y ( i ) − y ¯ ) ∑ i = 1 n ( x ( i ) − x ¯ ) 2 b = y ¯ − w x ¯
2.2 流程图
2.3 代码实现
x_train =np.array([1.,2.,3.,4.,5.])
y_train =np.array([1.,3.,2.,3.,5.])
x_mean=np.mean(x_train)#x平均值
y_mean=np.mean(y_train)#y平均值
fraction_up=0.0#w的分子
fraction_down=0.0#w的分母
for x_i,y_i in zip(x_train,y_train):
fraction_up+=(x_i-x_mean)*(y_i-y_mean)#分子加和
fraction_down+=(x_i-x_mean)**2#分母加和
w=fraction_up/fraction_down#计算w
b=y_mean-w*x_mean#计算b
y_hat=w*x_train+b#构造预测函数
2.4、向量化处理
x_train =np.array([1.,2.,3.,4.,5.])
y_train =np.array([1.,3.,2.,3.,5.])
x_mean=np.mean(x_train)#x平均值
y_mean=np.mean(y_train)#y平均值
fraction_up=(x_train-x_mean).dot(y_train-y_mean)#w的分子(修改此处)
fraction_down=(x_train-x_mean).dot(x_train-x_mean)#w的分母(修改此处)
w=fraction_up/fraction_down#计算w
b=y_mean-w*x_mean#计算b
y_hat=w*x_train+b#构造预测函数
三、多元线性回归(Multivariable Linear Regression Model)
3.1 公式推导
对于一般的数据集D
D
(D={(xi,yi)}ni=1),样本存在d个特征,则线性回归公式为
y=wTX+b
y
=
w
T
X
+
b
令 b=w0X0(X0≡1) b = w 0 X 0 ( X 0 ≡ 1 ) ,则 y=θX
y
=
θ
X
其中
θ=(w0,w1,w2,w3,…,wn)TX=[1X(1)1X(1)2⋯X(1)n1X(2)1X(2)2⋯X(2)n⋮⋮⋮⋱⋮1X(d)1X(d)2⋯X(d)n]y=(y0,y1,y2,y3,…,yn)T
θ
=
(
w
0
,
w
1
,
w
2
,
w
3
,
…
,
w
n
)
T
X
=
[
1
X
1
(
1
)
X
2
(
1
)
⋯
X
n
(
1
)
1
X
1
(
2
)
X
2
(
2
)
⋯
X
n
(
2
)
⋮
⋮
⋮
⋱
⋮
1
X
1
(
d
)
X
2
(
d
)
⋯
X
n
(
d
)
]
y
=
(
y
0
,
y
1
,
y
2
,
y
3
,
…
,
y
n
)
T
同样2.1一样构造损失函数,然后使用最小二乘法,求得正规方程解 θ θ (Normal Equation)
θ=(XTX)−1XTy
θ
=
(
X
T
X
)
−
1
X
T
y
3.2 优缺点
缺点:时间复杂度高,约n³的复杂度。
优点:θ
θ
的结果是依赖矩阵运算得来,不依赖空间距离(不受特征量纲影响),所以数据集不需要做归一化处理。
3.3代码实现
在实现代码前,先明确sklearn中定义的两个参数名称截距(intercept)和系数(coefficients):
θ=( θ0→截距intercept_ θ1θ2θ3⋮θn}系数coef_ )
θ
=
(
θ
0
→
截距intercept_
θ
1
θ
2
θ
3
⋮
θ
n
}
系数coef_
)
'''这里只列出核心计算代码'''
X=np.hstack([np.ones((len(X_train),1)),X_train])#对原X数据集增加一列常数项1
theta=np.linalg.inv(X.T.dot(X)).dot(X.T).dot(y_train)#np.linalg.inv矩阵求逆
intercept=theta[0]#截距
coef=theta[1:]#系数
###############预测y###############
X_t=np.hstack([np.ones((len(X_test),1)),X_test])#对原X数据集增加一列常数项1
y_hat=X_t.dot(theta)#构造预测函数,计算y_hat
'''之后可用R²对y_hat和y_test进行比较评分'''
四、sklearn实现多元线性回归
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
boston=datasets.load_boston()#加载数据集
X=boston.data#分离X
y=boston.target#分离y
X=X[y<50.0]#去掉房价中高于50的样本点,该样本点定义房价大于50的部分恒为50,该值影响预测准确性
y=y[y<50.0]
X_train,X_test,y_train,y_test=train_test_split(X,y,random_state=666)#切分训练集和测试集
lin_reg=LinearRegression()#实例化线性回归模型
lin_reg.fit(X_train,y_train)#训练样本
y_hat=lin_reg.predict(X_test)#预测y
lin_reg.score(X_test,y_test)#获取得分R²
print("该模型截距为:",lin_reg.intercept_)#输出截距
print("该模型系数为:",lin_reg.coef_)#输出系数