机器学习-线性回归-模型解析解-02

发布时间 2023-12-11 19:50:56作者: jack-chen666

1. 解析解

解析解的公式

import numpy as np
import matplotlib.pyplot as plt

# 有监督机器学习
# X y
X = 2 * np.random.rand(100, 1)
# np.random.rand
# 100行 1列的 [0, 1) 之间均匀分布 *2 之后则 变成 [0, 2)之间均匀分布

e = np.random.randn(100, 1)  # 误差 均值0 方差1 标准正态分布
y = 5 + 4 * X + e

# 特征值X 加上一列值为 1的 X0
X_b = np.c_[np.ones((100, 1)), X]
# c_[] 拼接 注意这里是[] 不是()
# np.ones() 传入的是一个元组shape

W = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print(W)

# 预测
X_new = np.array([[0],
                  [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new]
y_predict = X_new_b.dot(W)
print(y_predict)  # 理论值是 5, 13


plt.plot(X_new, y_predict, "r-")
plt.plot(X, y, "b.")

plt.axis([-0.5, 2.5, 2, 16])
plt.show()


2. sklearn封装实现

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression


X1 = 2*np.random.rand(100, 1)
X2 = 2*np.random.rand(100, 1)

X = np.c_[X1, X2]

y = 4+3*X1+5*X2+np.random.randn(100, 1)

line_reg = LinearRegression()
# fit_intercept=True截距默认拼接 计算输出的W 默认带有截距项
# fit_intercept=False截距默认拼接 计算输出的W截距项=0
# 本质 是用一条带有截距的直线去拟合样本 还是用一条穿过(0,0)的直线去拟合
# 穿过(0,0)的直线 截距为0 去拟合 误差会比较大

line_reg.fit(X, y)

intercept_ = line_reg.intercept_  # W 的截距
coef = line_reg.coef_  # W的系数
print(intercept_)
print(coef)

X_new = np.array([[0, 0],
                  [2, 2]])
# [0, 0]  --> 4
# [2, 1]  --> 4+3*2+1*5 = 15
# [2, 4]  --> 4+3*2+4*5 = 30
# 样本含有两个维度 X1 X2
y_predict = line_reg.predict(X_new)
print(y_predict)


# 绘图
# 样本
plt.plot(X1, y, "b.")
plt.axis([0, 3, 0, 30])

# 预测值
plt.plot(X_new[:, 0], y_predict, "r-")

plt.show()