# -------------------------- 导入依赖库 --------------------------
# 导入numpy库,命名为np,用于数值计算(数组、矩阵操作)
import numpy as np
# 从sklearn的线性模型模块导入LinearRegression类,用于实现线性回归
from sklearn.linear_model import LinearRegression
# 导入matplotlib的pyplot模块,命名为plt,用于绘图可视化
import matplotlib.pyplot as plt
# -------------------------- 生成双特征的模拟数据集 --------------------------
# 生成第一个特征X1:100个样本,1列,元素是[0,2)区间的均匀分布随机数
X1 = 2 * np.random.rand(100, 1)
# 生成第二个特征X2:同样100个样本,1列,[0,2)区间的均匀分布随机数
X2 = 2 * np.random.rand(100, 1)
# 将X1和X2按列拼接,得到双特征的特征矩阵X(形状:100行×2列,每行对应一个样本的两个特征)
X = np.c_[X1, X2]
# 生成标签y:模拟带噪声的真实线性关系
# 真实模型:y = 4(截距) + 3*X1(X1的系数) + 5*X2(X2的系数) + 噪声
# np.random.randn(100,1):生成100行1列的标准正态分布噪声(均值0、方差1)
y = 4 + 3 * X1 + 5 * X2 + np.random.randn(100, 1)
# -------------------------- 初始化并训练线性回归模型 --------------------------
# 初始化线性回归模型,fit_intercept=True表示要拟合截距项(对应真实模型的4)
reg = LinearRegression(fit_intercept=True)
# 用特征矩阵X和标签y训练模型(模型会学习截距和两个特征的系数)
reg.fit(X, y)
# 打印训练得到的参数:
# reg.intercept_:模型学到的截距(预期接近真实值4)
# reg.coef_:模型学到的特征系数(预期接近真实值[3,5],对应X1和X2)
print(reg.intercept_, reg.coef_)
# -------------------------- 用训练好的模型预测新样本 --------------------------
# 定义3个新的待预测样本,每个样本包含2个特征(X1, X2)
X_new = np.array([[0, 0], # 样本1:X1=0, X2=0
[2, 1], # 样本2:X1=2, X2=1
[2, 4]]) # 样本3:X1=2, X2=4
# 用训练好的模型预测新样本的标签
y_predict = reg.predict(X_new)
# -------------------------- 绘图展示(注意:双特征应3D可视化,这里是简化2D展示) --------------------------
# 绘制“新样本的X1特征”与“预测值y_predict”的关系(红色虚线)
plt.plot(X_new[:, 0], y_predict, 'r--')
# 绘制“原始数据的X1特征”与“真实标签y”的散点(蓝色点)
plt.plot(X1, y, 'b.')
# 设置坐标轴范围:x轴0~2,y轴0~25(匹配数据和预测值的范围)
plt.axis([0, 2, 0, 25])
# 显示绘图窗口
plt.show()
