损失函数的概率验证及性质
从http://www.cnblogs.com/mikewolf2002/p/7560748.html这篇文章中,我们知道损失函数为下面的形式:
J(θ0,θ1...,θn)=12mm∑i=0(hθ(x(i)0,x(i)1,...,x(i)n)−y(i))2
或者
J(θ)=12(Xθ−Y)T(Xθ−Y)
为什么选这个函数为损失函数呢?也就是说为什么选择最小二乘作为指标来计算回归方程参数?这个可以用概率论的方法进行证明。
首先我们提供一组假设,依据这些假设,来证明选择最小二乘是合理的。
(1) 假设1:
假设输入与输出为线性函数关系,表示为:y(i)=θTx(i)+ϵ(i)
其中ϵ(i)为误差项,这个参数可以理解为对未建模效应的捕获,如果还有其他特征,这个误差项表示了一种我们没有捕获的特征,或者看成一种随机的噪声。
假设ϵ(i)服从高斯分布(正态分布)ϵ(i)∼N(0,σ2),表示一个均值是0,方差是σ2的高斯分布,且每个误差项彼此之间是独立的,并且他们服从均值和方差相同的高斯分布(IID independently and identically distributed,独立同分布)。
那么高斯分布的概率密度函数:
p(ϵ(i))=1√2πσexp(−(ϵ(i))22σ2)
根据上述两式可得:
p(y(i)|x(i);θ)=1√2πσexp(−(y(i)−θTx(i))22σ2)
注意: θ并不是一个随机变量,而是一个尝试估计的值,就是说它本身是一个常量,只不过我们不知道它的值,所以上式中用分号表示。分号应读作“以…作为参数”,上式读作“给定x(i)以θ为参数的y(i)的概率服从高斯分布”。
即在给定了特征与参数之后,输出是一个服从高斯分布的随机变量,可描述为:y(i)|x(i);θ∼N(θTx(i),σ2),
为什么选取高斯分布?
1) 便于数学处理。
2) 对绝大多数问题,如果使用了线性回归模型,然后测量误差分布,通常会发现误差是高斯分布的。
3) 中心极限定律:若干独立的随机变量之和趋向于服从高斯分布。若误差有多个因素导致,这些因素造成的效应的总和接近服从高斯分布。
(2) 假设2:
给定X(特征矩阵,包含所有的x(i))和θ,如何描述y(i)的概率呢?首先我们可以把y(i)的概率写成p(→y|X;θ)。这个概率可以把θ看成为固定值,→y或X的函数。我们称这个函数为θ的似然函数。
L(θ)=L(θ;X,→y)=p(→y|X;θ)
由于ϵ(i)是独立同分布,所以给定x(i)情况下y(i)也是独立同分布,则上式可写成所有分布的乘积:
L(θ)=m∏i=1p(y(i)|x(i);θ)=m∏i=11√2πσexp(−(y(i)−θTx(i))22σ2)
(3) 假设3:
极大似然估计:选取θ使似然性L(θ)最大化(数据出现的可能性尽可能大)
定义L(θ)对数似然函数为 :
l(θ)=logL(θ)=logm∏i=11√2πσexp(−(y(i)−θTx(i))22σ2)=m∑i=1log1√2πσexp(−(y(i)−θTx(i))22σ2)=mlog1√2πσ−1σ2∗12m∑i=1(y(i)−θTx(i))2
上式两个加项,前一项为常数。所以,使似然函数最大,就是使后一项最小,即:12m∑i=1(y(i)−θTx(i))2
这一项就是之前的J(θ),由此得证,之前的最小二乘法计算参数,实际上是假设了误差项满足高斯分布,且独立同分布的情况,使θ似然最大化来计算参数。
注意:高斯分布的方差对最终结果没有影响,由于方差一定为正数,所以无论取什么值,最后结果都相同。
假设hθ(x)=θ0+θ1x,下面在matlib中画出损失函数J(θ)。
样本文件下载:ex2Data.zip
代码如下:

clear all; close all; clc; J_vals = zeros(100, 100); % 初始化损失函数参数矩阵,假设只有theta_0, theta_1 theta0_vals = linspace(-3, 3, 100); %范围-3,3,100个值 theta1_vals = linspace(-1, 1, 100); %范围-1,1,100个值 x = load('ex2x.dat'); y = load('ex2y.dat'); m = length(x); x = [ones(m, 1) x]; %循环theta0,theta1 for i = 1:length(theta0_vals) for j = 1:length(theta1_vals) t = [theta0_vals(i); theta1_vals(j)]; J_vals(i,j) = 0; for k = 1:m J_vals(i,j) = J_vals(i,j)+(x(k,:)*t-y(k))^2; end J_vals(i,j) = J_vals(i,j)/(2*m); end end % 用surf函数来画损失函数 J_vals = J_vals' figure; surf(theta0_vals, theta1_vals, J_vals) xlabel('\theta_0'); ylabel('\theta_1') figure; % 画损失函数的轮廓,注意范围是0.01 - 100,总共15个轮廓 contour(theta0_vals, theta1_vals, J_vals, logspace(-2, 2, 15)) xlabel('\theta_0'); ylabel('\theta_1')
你可以旋转图,从不同视角观察这个图形。右边的轮廓图θ范围是0.01 - 100,总共15个轮廓。
我们可以看到取我们用梯度下降法中求得的θ值时,损失函数取得最小值,并且损失函数具有全局最小值,并没有局部极小值,它是一个凸函数。
这是我们用批量梯度下降法求得的θ值。 http://www.cnblogs.com/mikewolf2002/p/7634571.html
theta =
0.7502
0.0639
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程