OLS、MLE辨析和python实现"/>
MSE、OLS、MLE辨析和python实现
统计机器学习是一种基于统计理论的机器学习方法,理解MLE、OLS、MSE对于基本功非常重要。
更多优质文章可以关注微信公众号【kelly学挖掘】,欢迎访问
1、MSE、OLS、MLE的定义
均方误差MSE
MSE是Mean Squared Error缩写,一般用于衡量预测值和真实值之间的差异,属于一种具体的计算函数。
普通最小二乘法OLS
Ordinary Least Squares的缩写,一般用于线性模型,通过最小化数据集各个样本预测值和真实值之间的均方误差之和,来预估线性模型的参数,属于一种数学优化技术。
极大似然估计MLE
MLE是Maximum likelihood estimation缩写,基于给定的统计模型分布和一批观测数据,通过最大化观测数据整体的概率(即似然值),估计统计模型的参数,属于一种数学优化技术。
说明:“似然”一词表示可能性,在统计学习中也就是样本出现的概率。
2、三者之间的关联
区别:MSE是一种具体的计算方法,计算两个数值之间的差异;MLE和OLS属于一种数学优化技术,用于估计最优模型的参数值。
联系:给定一批有标签数据、待预估模型为线性模型、待预估模型的误差服从正态分布时,这时OLS使用MSE衡量样本真实值和预测值之间的差异,而且OLS等价于MLE。
正态分布
函数形式:
μ为分布的均值,σ是分布的标准差。
函数图形:
OLS等价MLE的推导证明:
给定一批观测数据(x_i,y_i),i=1,...,N;观测数据服从线性模型,即y_i=θ^T×x_i+ε,这里θ和x_i都是M维列向量,M等于样本的特征数目,y_i是单个数值标量,ε是服从高斯分布的误差。
(1)已知真实值和预测值之间的MSE如下:
(2)已知ε~ N(0,σ^2),则有y_i ~ N(θ^T×x_i, σ^2)
P(Y|X;θ)表示给定观测数据和模型分布下,MLE如下:
第一个∑求和表达式是一个常量,而第二个∑求和的系数为常数项,对于常数项直接忽略,因此可以得到下面的公式:
即MLE等价于最小化MSE。
3、OLS的矩阵形式
将整个数据集的MSE改写成矩阵形式,对参数θ向量求导,然后令导数为0可得θ向量的计算表达式。
注:若推导过程有疑问,可以查阅后续的矩阵求导内容。
解释:
(1)X、θ、Y都是矩阵,Xθ-Y是一个n×1的矩阵,也可以看成一个列向量,每个元素代表一条样本的预测值和真正值之差的误差。
(2)矩阵n×1的转置((Xθ-Y)^T),与矩阵n×1((Xθ-Y))做乘法,结果矩阵为1×1,正好是一个标量,即全量数据的均方误差之和,全量数据的整体误差。
(3)J(θ)为一个标量,代表全部观测数据的预测值和真实值的平方误差之和,这里与标准MSE相比少了一个1/N,由于1/N是常数,所以这里省去。
矩阵对向量求导的一些常见公式如下,注意和“标量与标量求导”的差异。
4、具体案例和python实现
已知:有一批观测数据,包含观测特征值x_i和观测标签y_i,其中,样本特征x_i的维度为1。
任务:拟合一条回归直线,使得y_i=w*x_i+b。
方法:由于拟合直线存在偏置b,所以对原始特征宽表X新增等于常数1的新列,即修改为[X,1]。
矩阵表达为:Y=[X,1]×[w1,w0],新矩阵[X,1]的每一行为一条样本,每条样本与列向量[w0,w1]做点乘。
借助前面推导公式,w1为变量系数,w0为偏置。
N代表样本数目,M代表特征数目。
代码如下:
import time
import numpy as np
import matplotlib.pyplot as pltnum_points = 1000# 生成近似线性数据,使用MSE拟合广义线性模型的参数
x = np.random.randn(num_points, 1) + 10 # 均值为10的高斯分布随机点
y = 7.5 * x + 5 + np.random.randn(num_points, 1) * 2plt.plot(x, y, "bo", ms=2)
plt.xlabel("x")
plt.ylabel("y")
plt.show()class Example(object):def __init__(self, X: np.ndarray, Y: np.ndarray):self.X, self.Y = X, Yself.theta = self.fit()def fit(self):# self.X只包含初始观测值,由于拟合的是wx+b=[w, w0]^T.[x,1]=wx+w0shape = (self.X.shape[0], 1)X = np.hstack([self.X, np.ones(shape)])x_t_x = np.dot(np.transpose(X), X)tmp = np.linalg.inv(x_t_x)tmp = np.dot(tmp, X.T).dot(self.Y)return tmpdef predict(self, X: np.ndarray):shape = (X.shape[0], 1)X = np.hstack([X, np.ones(shape)])return X.dot(self.theta)# 假定y=wx+b,需要求解w和b
example = Example(x, y)
print(example.theta)x = np.array([[10]])
r = example.predict(x)
print(r)def main():pass
模拟生成的数据点的散点图:
求得的权重和偏置和设置参数一致,验证代码正确。
更多优质文章可以关注微信公众号【kelly学挖掘】,欢迎访问
-- over --
更多推荐
MSE、OLS、MLE辨析和python实现
发布评论