线性回归模型
常常遇到这样的问题, 我们要进行线性回归的自变量 不是一个单独的值, 而是一个 的向量. 这种情况即是多元线性回归.
我们的目的就不再是寻找单独的值
和
来满足一次方程, 而是寻找到在
的向量
和标量
使得:
其中
’即是回归方程的预测值. 那么, 要求出回归方程的向量参数, 就可以尝试使得预测值和实际值之间的差值最小. 这种手段就被称为均方误差(MSE).
要使得MSE最小, 我们自然选择求导. 但在此之前, 注意到要求两个参数比较繁琐, 可以通过构造 使得: 来合并为一个. 这样一来, 我们就需要对数据也进行一些变换. 在由m个样本点n个特征堆叠成的m*n矩阵X中, 添加一列全为 1 的列. 这样就能保证新的数据矩阵X只与一个向量 相乘便可以得到输出.
之后对MSE求导求出我们所需的
:
代码实现
这里的数据源选取了中国知网上的中国环境年鉴, 做了散点图之后决定选择工业污染和总污染这两个在可视化上线性关系表现较强的量来做线性回归.
考虑到便于呈现的缘故, 这里做了一维的线性回归, 方便在散点图上直接看出回归拟合的效果.
import xlrd
import numpy as np
import matplotlib.pyplot as plt
PATH = "F:/Politic_Py/政府治理投资与工业污染的关系_final.xlsx"
excel_file = xlrd.open_workbook(PATH)
sheet0 = excel_file.sheet_by_index(0)
# 从文件中读入所需要的数据
total_all_pollution_array = np.array(sheet0.col_values(ord('N') - ord('A'))[2::])
total_ton_array = np.array(sheet0.col_values(ord('O') - ord('A'))[2::])
# 将原始数据堆成的矩阵添加一列全为 1 的列
X = []
for i in total_ton_array:
X.append([i, 1.0])
Y = total_all_pollution_array
inverse = np.linalg.inv(np.matmul(np.transpose(X), X))
# 这里求出了我们的参数向量w'=(w;b), 这个向量的最后一个值其实就是截距b
w = np.matmul(inverse, np.matmul(np.transpose(X), Y))
# 这里用我们得到的回归方程进行预测
Y_predict = np.matmul(X, w)
# 中文适配
plt.rcParams['font.sans-serif'] = ['SimHei']
# 做出散点图, 便于比照出回归的效果
plt.scatter(total_ton_array, total_all_pollution_array, c='blue', alpha=0.7)
# 画出回归方程对应的直线
plt.plot(total_ton_array, np.transpose(Y_predict), marker='', linewidth=2, alpha=0.9, color='green')
plt.xlabel("工业污染")
plt.ylabel("总污染")
plt.title("工业污染与总污染线性回归分析图", loc='left', fontsize=14, fontweight=0, color='blue')
plt.savefig('pollution.png', dpi=1000)
plt.show()
拟合的效果可见下图:
参考文献
- 周志华, 机器学习
- Ian Goodfellow等, DEEP LEARNING
- 中国环境年鉴