总概
本次笔记主要在一元线性回归模型的基础上,将其拓展为多元线性回归模型,进而利用Python语言将一元线性回归模型和多元线性回归模型进行复现。 因此,本次笔记可分成以下几个部分:
模型A.2-多元线性回归模型推导 一元线性回归模型代码复现1 一元线性回归模型代码复现2 多元线性回归模型代码复现
模型A.2-多元线性回归模型推导
一般情况下,一个特征很难表征一个输入和输出之间的映射关系,所以常常需要引入多个特征来实现。
模型A.2的表达式
多个变量的线性回归模型可用矩阵来进行表示,具体表达式见式(1)。其中,表示样本个数编号,表示特征量编号。
进一步,将模型参数
模型A.2的损失函数
类似地,按照一元线性回归模型的套路,在数据集
多元线性回归模型的损失函数,如式(3)所示。对式(3)进行矩阵向量化可得式(4)。
对式(4)进行化简,可以得式(5),化简过程见式(6),其中,关键点为
模型A.2的算法求解
与一元线性回归模型类似,也是利用凸优化理论,那么就需要证明式(5)所示的损失函数为凸函数。那么就是证明其对应的海森矩阵是半正定的,基于式(5),先求
如式(7)所示。
然后,根据矩阵微分公式,如式(8)所示,可将式(7)进一步化简为式(9)。
接着,基于矩阵微分公式,如式(10),可以求
如式(11)所示。
一般情况下假定
有了凸函数后,那么就可以求得最优的
一元线性回归模型代码复现1
一元线性回归模型代码复现1主要是根据标量形式来实现,主要根据式(13)和式(14),也即一元线性回归模型的推导结果。
import numpy as np
import matplotlib.pyplot as plt
# 定义一个一元线性函数
def true_fun(X):
return 1.5 * X + 0.2
# 设定随机数种子,以便每次结果都一致
np.random.seed(0)
# 数据集样本数
n_samples = 50
# 产生数据集输入
X = np.sort(np.random.rand(n_samples)*10)
# 产生数据集输出
y = (true_fun(X) + np.random.randn(n_samples) * 0.5)
# 模型参数求解
w = (np.dot(y, X) - np.mean(X) * np.sum(y)) (np.dot(X, X)-(np.sum(X) * np.sum(X))/50)
b = np.mean(y) - w * np.mean(X)
# 预测输出
y_pre = w * X + b
# 结果展示
plt.scatter(X, y, label="Actual")
plt.plot(X, y_pre, 'r--', label="Prediction")
plt.xlabel("Input")
plt.ylabel("Output")
plt.legend()
plt.show()
print("权重", w, "偏置", b)
输出结果如下: 权重 1.540705527641048 偏置 -0.10523606015538967

一元线性回归模型代码复现2
一元线性回归模型代码复现2主要是根据矩阵向量形式来实现,主要根据式(12)。
import numpy as np
import matplotlib.pyplot as plt
# 定义一个一元线性函数
def true_fun(X):
return 1.5 * X + 0.2
# 设定随机数种子,以便每次结果都一致
np.random.seed(0)
# 数据集样本数
n_samples = 50
# 产生数据集输入
X = np.sort(np.random.rand(n_samples)*1).reshape(-1,1)
# 这里的reshape不能少,不然出来不是矩阵形式,很关键。
# 小白我刚开始在这里停好久,以为前面np.sort出来的就是ndarray矩阵了呢。
# 产生数据集输出
y = true_fun(X) + (np.random.randn(n_samples) * 0.05).reshape(-1,1) # 同上
# 构建增广矩阵
ones = np.ones(X.shape[0]).reshape(-1,1)
A = np.hstack((X, ones))
# 利用矩阵思路求解模型
w_ = np.dot(np.dot(np.linalg.inv(np.dot(A.T, A)), A.T), y)
b = w_[-1]
w = w_[:-1]
# 预测输出
y_pred = np.dot(X, w) + b
# 结果展示
plt.scatter(X, y, label="Actual")
plt.plot(X, y_pred, 'r--', label="Prediction")
plt.xlabel("Input")
plt.ylabel("Output")
plt.legend()
plt.show()
print("权重", w, "偏置", b)
输出结果如下:
权重 [[1.54070553]] 偏置 [0.16947639]

多元线性回归模型代码复现
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 定义一个一元线性函数
def true_fun(x1, x2):
return 1.5 * x1 + 3 * x2 + 0.2
# 设定随机数种子,以便每次结果都一致
np.random.seed(0)
# 数据集样本数
n_samples = 100
# 产生数据集输入
x1 = np.random.uniform(-10, 10, size=n_samples) # 输入特征1
x2 = np.random.uniform(-10, 10, size=n_samples) # 输入特征2
# 产生数据集输出
y = true_fun(x1, x2) + np.random.normal(-1, 1, size=n_samples)
# 构建增广矩阵
A = np.ones((n_samples, 3)) # 另外一种增广矩阵构建方式
A[:, 0] = x1
A[:, 1] = x2
# 利用矩阵思路求解模型
w_ = np.dot(np.dot(np.linalg.inv(np.dot(A.T, A)), A.T), y)
# 预测输出
y_pre = w_[0] * x1 + w_[1] * x2 + w_[2]
# 结果展示
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x1, x2, y, c='r', label="Actual")
ax.scatter(x1, x2, y_pre, c='b', label="Prediction")
ax.set_xlabel("Input_1")
ax.set_ylabel("Input_2")
ax.set_zlabel("Output")
plt.legend()
plt.show()
print("权重", w_)
输出结果如下: 权重 [ 1.47241772 2.98705766 -0.89794085]

代码知识点小结
函数定义、随机数产生、数据排序、求和、求均值、求平方、求商、矩阵转换、矩阵拼接、矩阵乘法、矩阵求逆、二维画图、三维画图图例标注、坐标轴定义。
理论部分参考资料
周志华.机器学习[M].北京:清华大学出版社. http://product.dangdang.com/29158396.html
谢文睿. 机器学习公式详解(南瓜书)[M].北京:人民邮电出版社. http://product.dangdang.com/29206216.html




