机器学习笔记-多元线性回归
作者:星河滚烫兮 @TOC
线性回归作为机器学习入门算法,数学原理清晰透彻,展现了机器学习的重要思想,线性回归虽然简单,但也能够解决很多问题。下面讲解线性回归的数学原理与代码实现。
如上图所示,我们有一些零散数据,我们希望用某个函数曲线拟合这些数据点,从而揭示数据分布的特征,预测未知样本。图中拟合出的是一条直线,但其实通过构造数据,多元线性回归可以拟合出任意曲线。
代价函数对于机器学习来说是核心问题。代价函数就是表征我们的人造曲线与实际标签之间的差值情况,又叫做损失函数。我们通过使代价函数收敛到全局(大多数是局部)最小值,从而得到最终理想模型。线性回归的代价函数使用平方损失函数,如下图所示:
我们想要使这个代价函数值最小,很简单的数学原理,当二次函数导数为零时达到极值。但由于我们事先并不知道所有的参数值θ,所以我们通过梯度下降算法θ=θ−α∂J(θ)∂θ,可以不断地逼近最小值,α为学习率,学习率越大,下降的幅度越大,但过度会导致震荡产生;学习率越小,下降幅度越小,收敛较慢。 对于机器学习问题,我们需要训练集与测试集,学习深入后还会用到交叉验证。一般来说,将数据集的70%划分为训练集,30%划分为测试集。本文没有使用到大规模数据集,仅仅用的自己编造的数据,所以未使用测试集。大家根据实际问题选择。 另外说一下数据标准化,对于多个特征的样本数据,特征之间可能会存在较大数量级的差距,这样会过分强调高数量级的特征,而忽略掉小数量级的特征,为了避免此类情况,我们通常进行数据预处理,包括多种标准化方法,比如z-score标准化,将各个特征缩小至同一范围。
假设样本有n个特征,分别为x1,x2,x3,…,xn,对应的权重参数为θ1,θ2,θ3,… θn,偏置系数为θ0,为了简化表达,我们加入偏置项x0=1。该样本标签为y。设预测函数为h(x)=θ0x0+θ1x1+θ2x2+…+θnxn,整体代价函数为J(θ)=12m∑mi=1[y(i)−h(x(i))]2,其中,m为样本数,i表示第i个样本。 根据以上条件,我们进行向量化公式推导(默认所有向量为列向量)。 将输入特征与参数向量化有: x(i)=(x0x1x2⋮xn),θ=(θ0θ1θ2⋮θn),x=(x(1)0⋯x(m)0⋮⋱⋮x(1)n⋯x(m)n),代入单样本预测函数h(x)有: h(x(i))=θT⋅x(i)
h(x)=xT⋅θ (1)
class Mult_Linear_Regression:
"""
多元线性回归模型: y = a0x0 + b1x1 + b2x2 + ... + bnxn 其中,x0=1
x:二维矩阵(m,n)(单样本特征排列成行向量),需进行转置为(n,m)
y:二维矩阵(m,1)
"""
def __init__(self, x, y):
# 定义机器学习设置参数
self.EPOCH = 500 # 迭代次数
self.learning_rate = 0.1 # 学习率α
# 数据集
self.x = np.insert(x.T, 0, 1, axis=0) # 处理后的二维特征输入,每个样本为列向量,同时加入偏置项x0=1
self.y = y
# 参数a0,a1,a2,...,an
self.m = self.x.shape[1] # 样本数m
self.n = self.x.shape[0] # 样本特征数为n
self.a = np.zeros((self.n, 1)) # 参数向量a
def h(self):
# 整体预测函数,x为二维所有样本特征向量(列向量)
return self.x.T @ self.a # 以列向量形式返回行向量点乘列向量
def predict(self, xi):
# 对某个样本进行预测
xi = np.insert(xi, 0, 1)
return self.a.T @ xi
def J(self, h):
# 代价函数:j(β1,β2)
return 1/(2*self.m) * np.sum((self.y-h)**2) # 返回一个实数
def p(self, h):
# 梯度下降算法
gradient = -(1 / self.m) * (self.x.dot(self.y-h)) # 矩阵运算的形式
self.a = self.a - self.learning_rate * gradient # 更新梯度
def train(self):
for i in range(self.EPOCH):
h = self.h()
self.p(h)
print(f"第{i+1}轮损失值为:{self.J(h)}")
import numpy as np
import matplotlib.pyplot as plt
x = np.array([[0], [1], [3], [5], [6]])
y = np.array([0, 1.1, 3.1, 4.95, 6.05])
y = y.reshape((len(y), 1))
C = Mult_Linear_Regression(x, y)
C.train()
new_x = np.arange(-1, 7, 0.01)
plt.plot(new_x, new_x*C.a[1]+C.a[0], c='r')
plt.scatter(x, y)
plt.show()
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。