多重线性回归
多重线性回归内容与代码实现
回归函数
多重线性回归函数: 建立多个自变量与一个因变量之间的线性关系。在多重线性回归中,我们假设因变量与多个自变量之间存在线性关系,并利用给定的样本数据来确定线性关系的系数,目标是找到一组最优的系数,使得预测值与真实值之间的误差最小化。
展开式为:
f
w
⃗
,
b
=
w
1
x
1
+
w
2
x
2
+
.
.
.
+
w
n
x
n
+
b
f_{\vec{w},b} = w_1x_1+w_2x_2+...+w_nx_n+b
fw,b=w1x1+w2x2+...+wnxn+b
简化为:
f
w
⃗
,
b
=
w
⃗
⋅
x
⃗
+
b
f_{\vec{w},b}=\vec{w}·\vec{x}+b
fw,b=w⋅x+b
代码实现:
def predict(x, w, b):
p = np.dot(x, w) + b
return p
损失函数
多重线性回归损失函数: 多重线性回归的损失函数通常使用均方误差。在多重线性回归中,我们的目标是找到一组最优的系数,使得预测值与真实值之间的误差最小化。因此,我们可以使用梯度下降法或其他优化算法来最小化损失函数,从而得到最优的系数。
公式为:
J
(
w
⃗
,
b
)
=
1
2
m
∑
i
=
0
m
−
1
(
f
w
⃗
,
b
(
x
⃗
(
i
)
)
−
y
(
i
)
)
2
J(\vec{w},b)=\frac 1 {2m} \sum _{i=0} ^{m-1} (f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)})^2
J(w,b)=2m1i=0∑m−1(fw,b(x(i))−y(i))2
代码实现:
def compute_cost(X, y, w, b):
m = X.shape[0]
cost = 0.0
for i in range(m):
f_wb_i = np.dot(X[i], w) + b
cost = cost + (f_wb_i - y[i])**2
cost = cost / (2 * m)
return cost
梯度下降
梯度下降函数: 多重线性回归函数的梯度下降算法用于求解最小化损失函数的系数,从而建立线性回归模型。
gradient descent 整体公式为:
w
j
=
w
j
−
α
∂
J
(
w
⃗
,
b
)
∂
w
j
b
j
=
b
j
−
α
∂
J
(
w
⃗
,
b
)
∂
b
w_j = w_j - \alpha \frac {\partial J(\vec {w}, b)} {\partial w_j} \\ b_j = b_j - \alpha \frac {\partial J(\vec {w}, b)} {\partial b}
wj=wj−α∂wj∂J(w,b)bj=bj−α∂b∂J(w,b)
gradient 部分公式为:
∂
J
(
w
⃗
,
b
)
∂
w
j
=
1
m
∑
i
=
0
m
−
1
(
f
w
⃗
,
b
(
x
⃗
(
i
)
)
−
y
(
i
)
)
x
j
(
i
)
∂
J
(
w
⃗
,
b
)
∂
b
=
1
m
∑
i
=
0
m
−
1
(
f
w
⃗
,
b
(
x
(
i
)
)
−
y
(
i
)
)
\frac {\partial J(\vec {w}, b)} {\partial w_j} =\frac 1 {m} \sum _{i=0} ^{m-1} (f_{\vec{w},b}(\vec{x}^{(i)})-y^{(i)})x^{(i)}_j \\ \frac {\partial J(\vec {w}, b)} {\partial b}=\frac 1 m \sum ^{m-1}_{i=0}(f_{\vec{w},b}(x^{(i)})-y^{(i)})
∂wj∂J(w,b)=m1i=0∑m−1(fw,b(x(i))−y(i))xj(i)∂b∂J(w,b)=m1i=0∑m−1(fw,b(x(i))−y(i))
代码实现:
def compute_gradient(X, y, w, b):
m,n = X.shape
dj_dw = np.zeros((n,))
dj_db = 0.
for i in range(m):
err = (np.dot(X[i], w) + b) - y[i]
for j in range(n):
dj_dw[j] = dj_dw[j] + err * X[i, j]
dj_db = dj_db + err
dj_dw = dj_dw / m
dj_db = dj_db / m
return dj_db, dj_dw
def gradient_descent(X, y, w_in, b_in, cost_function, compute_gradient, alpha, num_iters):
J_history = []
w = copy.deepcopy(w_in) #avoid modifying global w within function
b = b_in
for i in range(num_iters):
dj_db,dj_dw = compute_gradient(X, y, w, b)
w = w - alpha * dj_dw
b = b - alpha * dj_db
if i<100000:
J_history.append( cost_function(X, y, w, b))
if i% math.ceil(num_iters / 10) == 0:
print(f"Iteration {i:4d}: Cost {J_history[-1]:8.2f} ")
return w, b, J_history
Sklearn 实现线性回归
Scikit-learn(sklearn)库提供了用于线性回归模型的工具,可以通过最小化损失函数来拟合线性函数,并使用梯度下降算法调整模型参数。
具体来说,可以使用 sklearn.linear_model 模块中的 LinearRegression 类来拟合多重线性函数,我们可以创建一个 LinearRegression 类的实例,并使用 fit 方法对模型进行训练,直接得到拟合后的结果:
案例:对波士顿房价进行预测 案例:对波士顿房价进行预测 案例:对波士顿房价进行预测
from sklearn.linear_model import LinearRegression
from sklearn.datasets import load_boston
# 加载波士顿房价数据集
boston = load_boston()
X = boston.data
y = boston.target
# 创建一个线性回归模型
lr = LinearRegression()
# 使用训练集对模型进行训练
lr.fit(X, y)
# 训练完成
# 预测新数据的房价
y_pred = lr.predict(X)
此外,我们还可以使用 sklearn.metrics 模块中的 mean_squared_error 函数来计算损失函数的均方误差(MSE);sklearn.preprocessing 模块中的 StandardScaler 类来进行特征缩放,以帮助优化梯度下降算法的性能。
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.preprocessing import StandardScaler
import numpy as np
# 生成随机数据
np.random.seed(42)
X = np.random.rand(100, 3)
y = X.dot([1.5, -2, 0.5]) + 0.1 * np.random.randn(100)
# 特征缩放
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 创建线性回归模型
model = LinearRegression()
# 拟合模型
model.fit(X_scaled, y)
# 计算均方误差
y_pred = model.predict(X_scaled)
mse = mean_squared_error(y, y_pred)
print("均方误差:", mse)
# 输出模型系数
print("模型系数:", model.coef_)