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 plt


num_points = 1000

# 生成近似线性数据,使用MSE拟合广义线性模型的参数
x = np.random.randn(num_points, 1) + 10  # 均值为10的高斯分布随机点
y = 7.5 * x + 5 + np.random.randn(num_points, 1) * 2

plt.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, Y
        self.theta = self.fit()

    def fit(self):
        # self.X只包含初始观测值,由于拟合的是wx+b=[w, w0]^T.[x,1]=wx+w0
        shape = (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 tmp

    def 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 --

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值