【课程笔记】机器学习课程笔记 XJTU-AUTO300527 notes
求解线性回归模型(p173-178)
训练数据为𝑁个输入数据
及对应函数值
模型为线性回归模型
因此平方和误差函数
求导得
合并可得
即
即
令其为0可得
逻辑回归
吉布斯分布(p269-p270)
- 能量函数:
- 配分函数:
- 温度:
- 定义在团c上的吉布斯势函数:
任意单位点s是一个团;元素数目大于1的子集
,若C中任意两个不同位点都相邻,则C是一个团。所有团的集合用
表示
吉布斯与马尔可夫的等价
参考 The Hammersley-Clifford Theorem and its Impact on Modern Statistics Helge Langseth
Hammersley-Clifford’s theorem的结论为
一个无向图模型的概率可以表示为定义在图上所有最大团上的势函数的乘积
The following are equivalent (given the positivity condition):
- Local Markov property :
- Factorization property : The probability factorizes according to the cliques of the graph
- Global Markov property :
whenever xA and xB are separated by xS in G
具体证明可以看原文或者yizt-Hammersley-Clifford定理证明
隐马尔可夫模型三个基本问题
HMM由五个要素决定:状态空间S,输出集Y,状态转移矩阵P,输出概率矩阵Q,初始状态分布π
- 模型结构:S、Y
- 模型参数:
问题一 评估问题:计算给定模型生成某观测输出序列的概率
给定模型参数λ和观测序列y,计算给定模型生成某观测输出序列的概率,通过对比各个模型输出概率,概率最大的模型为识别结果。
解决:加法原理
问题二 解码问题
给定模型λ和观测序列y,寻找最有可能产生观察序列的状态序列s,可以最好地解释观测序列。
问题三 学习问题
给定多个观测序列y,找出最优模型参数集λ。
重要采样(p519-523)
基于假设:无法直接从p(z)中采样,但对于任一给定的z值,可以很容易地计算p(z)的值。仿照拒绝采样的思路,可以利用提议分布;与拒绝采样不同的是:提议分布要使用最优的采样函数,不用一定全部覆盖原分布函数;并且所有生成的样本都会被保留。
如果直接从p(z)中采样,如果有服从p(z)的L个独立样本,就可以从
过渡到
因此我们可以从q(z)中采样,乘一个系数,将q(z)当作p(z)的作用,从
过渡到
乘上的这个系数是重要性权重
此外采样得到的需要归一化,因此引入
这样期望就变成了
Metropolis-Hasting方法(p525-526)
在基本Metropolis算法中,假设提议分布(转移核函数)是对称的,但Metropolis-Hastings算法无此限制
算法流程:
初始化:最大迭代次数T,需要样本数目n,初始化样本
循环迭代:
-
从提议分布q中采样得到样本值
-
从均匀分布中采样
-
如果
, 则接受
,即
; 否则
被舍弃,且
;
-
如果未达到最大迭代次数,循环上述过程;否则停止
输出:根据需要截取尾部n个样本
如果只是基本Metropolis算法,由于q是对称的,所以
此处参考了Persist_Zhang的博客内容
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as stats
# 我们想要采样的目标分布p,以双峰高斯混合分布为例
def p(x):
return 0.3 * stats.norm.pdf(x, loc=2, scale=0.5) + 0.8 * stats.norm.pdf(x, loc=6, scale=0.5)
# 转移核函数,即提议分布q,以非对称的对称随机游走为例
def q(x):
if np.random.rand() < 0.5:
return stats.norm.rvs(loc=x + 0.5, scale=2) # 向右移动
else:
return stats.norm.rvs(loc=x - 0.5, scale=3) # 向左移动
# Metropolis-Hastings算法
def metropolis_hastings(target_dist, trans_kernel, n_samples):
samples = []
# 初始状态
current_state = 0
for _ in range(n_samples):
# 从条件概率分布q中采样得到新的样本值
candidate_state = trans_kernel(current_state)
# 计算接受概率
acceptance_prob = min(1, target_dist(candidate_state) / target_dist(current_state))
# 从均匀分布中采样,决定是否接受候选状态
if np.random.rand() < acceptance_prob:
# 若接受,则转移采样点
current_state = candidate_state
samples.append(current_state)
return samples
# 采样过程
samples = metropolis_hastings(p, q, n_samples=5000)
# 绘制样本分布图像
plt.figure(figsize=(10, 6))
x = np.linspace(0, 10, 1000)
plt.plot(x, p(x), label='p Distribution', color='blue')
plt.hist(samples, bins=50, density=True, label='M-H Distribution', color='skyblue', alpha=0.7)
plt.xlabel('x')
plt.ylabel('Density')
plt.legend()
plt.show()