1 原理说明
回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。
1.1 目标:
给 定 一 系 列 数 据 x ( i ) 和 y ( i ) , x 是 自 变 量 , y 是 因 变 量 , 用 公 式 y = a x + b 去 拟 合 , 求 出 参 数 a 和 b 。 给定一系列数据x^{(i)}和y^{(i)},x是自变量,y是因变量,用公式y = ax + b去拟合,求出参数a和b。 给定一系列数据x(i)和y(i),x是自变量,y是因变量,用公式y=ax+b去拟合,求出参数a和b。
1.2 解法:
假
设
有
m
组
数
据
{
x
(
1
)
,
x
(
2
)
,
.
.
.
,
x
(
m
)
}
,
{
y
(
1
)
,
y
(
2
)
,
.
.
.
,
y
(
m
)
}
,
则
:
假设有m组数据\{x^{(1)},x^{(2)},...,x^{(m)}\},\{y^{(1)},y^{(2)},...,y^{(m)}\},则:
假设有m组数据{x(1),x(2),...,x(m)},{y(1),y(2),...,y(m)},则:
x
ˉ
=
1
m
∑
i
=
1
m
x
(
i
)
y
ˉ
=
1
m
∑
i
=
1
m
y
(
i
)
\bar{x}=\frac{1}{m}\sum^{m}_{i=1}x^{(i)}\\ ~\\ \bar{y}=\frac{1}{m}\sum^{m}_{i=1}y^{(i)}
xˉ=m1i=1∑mx(i) yˉ=m1i=1∑my(i)
使
用
最
小
二
乘
法
公
式
计
算
系
数
a
、
b
:
使用最小二乘法公式计算系数a、b:
使用最小二乘法公式计算系数a、b:
a
=
∑
i
=
1
m
(
x
(
i
)
−
x
ˉ
)
(
y
(
i
)
−
y
ˉ
)
∑
i
=
1
m
(
x
(
i
)
−
x
ˉ
)
2
a=\frac{\sum_{i=1}^{m}{(x^{(i)}-\bar{x})(y^{(i)}-\bar{y})}}{\sum_{i=1}^{m}{(x^{(i)}-\bar{x})^2}}
a=∑i=1m(x(i)−xˉ)2∑i=1m(x(i)−xˉ)(y(i)−yˉ)
b
=
y
ˉ
−
a
x
ˉ
b=\bar{y}-a\bar{x}
b=yˉ−axˉ
得
到
预
测
值
:
得到预测值:
得到预测值:
y
ˉ
(
i
)
=
a
x
(
i
)
+
b
\bar{y}^{(i)}=ax^{(i)}+b
yˉ(i)=ax(i)+b
1.3 附推导过程:
均方损失函数:用来刻画真实的
y
y
y值和预测的
y
ˉ
\bar{y}
yˉ之间的差距,我们的目标是让这个差距尽可能的小。
J
=
∑
i
=
1
m
(
y
(
i
)
−
y
ˉ
(
i
)
)
2
J=\sum^{m}_{i=1}(y^{(i)}-\bar{y}^{(i)})^2
J=i=1∑m(y(i)−yˉ(i))2
2 代码实现
2.1 利用公式手动计算参数a、b
'''
1. 导入库,定义X,Y,并绘图展示
'''
import numpy as np
from matplotlib import pyplot as plt
x = np.array([1., 2., 3., 4., 5.])
y = np.array([1., 3., 2., 4., 5.])
plt.scatter(x, y)
plt.show()
'''
2. 最小二乘法
'''
# 计算均值
x_mean = np.mean(x)
y_mean = np.mean(y)
fenzi = 0.0
fenmu = 0.0
# 遍历训练集,计算a表达式的分子和分母
for x_i, y_i in zip(x, y):
fenzi += (x_i - x_mean) * (y_i - y_mean)
fenmu += (x_i - x_mean) ** 2
# 计算a,b
a = fenzi / fenmu
b = y_mean - a * x_mean
print(a, b)
# 0.9 0.2999999999999998
# 预测值
y_hat = a*x + b
plt.scatter(x, y)
plt.plot(x, y_hat)
plt.axis([0, 6, 0, 6])
plt.show()
封装一下:
import numpy as np
class SimpleLinerRegression():
def __init__(self):
self.a_ = None
self.b_ = None
self.X_train = None
self.Y_train = None
def fit(self, X_train, Y_train):
x_mean = np.mean(X_train)
y_mean = np.mean(Y_train)
(num, d) = (0.0, 0.0)
for x_i, y_i in zip(X_train, Y_train):
num += (x_i - x_mean) * (y_i - y_mean)
d += (x_i - x_mean) ** 2
self.a_ = num / d
self.b_ = y_mean - self.a_ * x_mean
return self
def predict(self, X_test):
return np.array([self._predict(x) for x in X_test])
def _predict(self, x):
return self.a_ * x + self.b_
def score(self, y_test, y_pre):
return 0.5 * ((y_pre -y_test) ** 2)
2.2 调用现成的LinearRegression模块
from sklearn.linear_model import LinearRegression # 线性回归
X_train = np.array([1., 2., 3., 4., 5.])
y_train = np.array([1., 3., 2., 4., 5.])
X_test = np.array([7., 8., 9.])
linearRegression = LinearRegression() # 实例化类
linearRegression = linearRegression.fit(X_train, y_train) # 填充训练集
y_predict = linearRegression.predict(X_test) # 预测测试集
~\\~
参考博客: