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()
标签:02,截距,plt,predict,np,线性,new,100,解析
From: https://www.cnblogs.com/cavalier-chen/p/17895424.html