第十七周:机器学习

目录

摘要

Abstract

一、MCMC

1、马尔科夫链采样

 step1 状态设定

step2 转移矩阵

step3 马尔科夫链的生成

step4 概率分布的估计

2、蒙特卡洛方法

step1 由一个分布产生随机变量

step2 用这些随机变量做实验

3、MCMC算法 

4、参考文章

二、flow-based GAN 

1、引入 

2、数学基础回顾 

总结 


摘要

本周主要学习了MCMC算法,其中包含马尔科夫链采样和蒙特卡洛方法。通过视频资料的学习,对以上提到的两种方法进行规律总结以及简单的代码实践。还回顾了flow-based GAN理论的简单数学基础。

Abstract

This week is focused on MCMC algorithm which contains Markov chain sampling and Monte Carlo method. The video material was used to summarize the laws of the two methods mentioned above as well as simple code practice. The simple mathematical foundations of flow-based GAN theory are also reviewed. 

一、MCMC

1、马尔科夫链采样

 Markov Chains马尔科夫链:未来的状态只取决于前一个状态,而不依赖于更往前的状态。并且所有状态出箭头的概率之和都为1。

随机漫步random walk 

问题:行走着无规则的向着四面八方行走,最终形成的各个方向的概率是否收敛于一定值?

解决:稳态分布(平衡状态) 

稳态分布:与初始概率分布无关,马尔科夫链在有限次状态转移之后到达的平稳状态分布即为稳态分布。

\pi (j)=\sum_{i=0}^{\infty }\pi (i)P_{ij} 

\pi (j)所得到的向量值代表了某个时刻(第j个时刻)的概率分布值\pi (i)则代表i个状态的概率分布。由于每个状态的输出之和都为1,所以有\sum_{i=0}^{\infty }\pi (i)=1


 step1 状态设定

一家快餐店售卖三种食物:pizza、buger、hotdog。将每种食物设定为不同状态分别为1、2、3

#定义3种状态
state = {0 : "Burger",1 : "Pizza",2 : "Hotdog"
}
state

step2 转移矩阵

每个数值代表着对应行列的权重,如果两个节点之间用箭头连线连接,那么该数值也叫转移概率

#定义过渡矩阵
A = np.array([[0.2, 0.6, 0.2], [0.3, 0.0, 0.7], [0.5, 0.0, 0.5]])

step3 马尔科夫链的生成

#随机生成马尔科夫链——random walk的过程
n = 15
start_state = 0
curr_state = start_state
print(state[curr_state], "--->", end=" ")while n-1:curr_state = np.random.choice([0, 1, 2], p=A[curr_state])print(state[curr_state], "--->", end=" ")n-=1
print("stop")

随机选定一个初始状态,接着用np库中的random.choice函数在备选状态集中选择下一状态,直至循环到设置最大值。 生成结果如下:

step4 概率分布的估计

法一:Monte Carlo方法

steps = 10**6
start_state = 0  #其中A[curr_state]只有三种状态:pizza、buger、hotgog
curr_state = start_state
pi = np.array([0, 0, 0])  #初始状态均为0
pi[start_state] = 1   #把初始状态开始的state设为1i = 0
while i<steps:curr_state = np.random.choice([0,1,2], p=A[curr_state])  #随机从p中选择一种状态pi[curr_state]+=1i +=1print("π = ", pi/steps)

输出结果如下:

法二:矩阵连乘法 

steps = 10**3  #设置矩阵相乘的次数
A_n = Ai=0
while i<steps:A_n =  np.matmul(A_n, A)  #矩阵乘法i+=1print("A^n = \n", A_n, "\n")
print("π = ", A_n[0])

输出结果如下:

法三:求解左特征值

pi向量代表各个状态的概率分布,也就是每一行的概率分布

可以看出,上面关于pi的等式要成立,有些类似于线性代数中特征值和特征向量的求解,pi相当于是特征向量,特征值为1

import scipy.linalg
values, left = scipy.linalg.eig(A, right = False, left = True)  #计算左特征向量和特征值print("left eigen vectors = \n", left, "\n")
print("eigen values = \n", values)

特征值和特征向量输出结果如下:

 将特征向量进行归一化处理:

pi = left[:,0]  #提取第一个左特征向量
pi_normalized = [(x/np.sum(pi)).real for x in pi]   #归一化第一个左特征向量

pi的向量输出结果如下:

Markov Chains的概率预测

def find_prob(seq, A, pi):start_state = seq[0]prob = pi[start_state]prev_state, curr_state = start_state, start_statefor i in range(1, len(seq)):curr_state = seq[i]prob *= A[prev_state][curr_state]prev_state = curr_statereturn probprint(find_prob([1, 2, 2, 0], A, pi_normalized))

预测一条给定的markov chains的概率P(pizza——>hotdog——>hotdog——>burger)

预测结果如下:

2、蒙特卡洛方法

step1 由一个分布产生随机变量

step1 分布函数CDF的反函数

#随机线性选取x,得到概率密度f和概率分布F
x = np.linspace(0,3,100)  #初始、结束、总数
f = 2*np.exp(-2*x)
F = 1-np.exp(-2*x)#绘图
plt.figure(figsize=(8,3))
plt.plot(x, f, label=r'$f(x)$')
plt.plot(x,F, label=r'$F(x)$')
plt.legend()
plt.xlabel('$x$', fontsize=20)
plt.legend()
plt.show()

上述代码以泊松分布为例 

分布函数的反函数 

#设定反函数
Us = np.random.rand(10000)
F_inv_Us = -np.log(1-Us)/2#绘图
plt.figure(figsize=(8,3))
plt.plot(x, f, label=r'$f(x)$')
plt.hist(F_inv_Us, histtype='step', color='red', density='norm', bins=100, label='$F^{-1}(u)$')
plt.legend()
plt.xlabel('$x$', fontsize=20)
plt.legend()
plt.show()

step2 查找排序算法 

#设定自变量及概率密度和分布函数的定义式
x, y, F1, F2, E1, E2 = smp.symbols('x y F_1 F_2 E_1 E_2', real=True, positive=True)
fs = F1*smp.exp(-smp.sqrt(x/E1)) + F2*smp.exp(-smp.sqrt(x/E2))
Fs = smp.integrate(fs, (x,0,y)).doit()#写成只需要传递参数的函数形式
Fn = smp.lambdify((y, E1, E2, F1, F2), Fs)  #目的就是输入前面的数值y, E1, E2, F1, F2)带入后面的式子Fs中去
fn = smp.lambdify((x, E1, E2, F1, F2), fs)#给定参数的实际数值
E1 = E2 = 0.2
F1 = 1.3
F2 = 1.4
x = np.linspace(0,5,1000)
f = fn(x, E1, E2, F1, F2)
F = Fn(x, E1, E2, F1, F2)#绘图
plt.figure(figsize=(8,3))
plt.plot(x,f, label=r'$f(x)$')
plt.plot(x,F, label=r'$F(x)$')
plt.legend()
plt.xlabel('$x$', fontsize=20)
plt.legend()
plt.show()

加入分布函数的反函数

#反函数
F_inv_Us = x[np.searchsorted(F[:-1], Us)]#绘图
plt.figure(figsize=(8,3))
plt.plot(x, f, label=r'$f(x)$')
plt.hist(F_inv_Us, histtype='step', color='red', density='norm', bins=100, label='$F^{-1}(u)$')
plt.legend()
plt.xlabel('$x$', fontsize=20)
plt.legend()
plt.xlim(0,2)
plt.show()

上面的函数分布是正太分布 

step3 建立随机变量 

#rayleigh分布
r = np.random.rayleigh(size=1000)#绘图
plt.hist(r, bins=100)
plt.show()

step2 用这些随机变量做实验

累积计算detector的energy  

N = 100000# Part 1 
X = np.random.poisson(lam=4, size=N)  #采样泊松分布# Part 2
x = np.linspace(0,5,1000)   
F = Fn(x, E1, E2, F1, F2)   #分布函数
Us = np.random.rand(X.sum()) #随机生成指定维度的样本数据  
E = x[np.searchsorted(F[:-1], Us)]  #样本数据在分布函数中的索引,E是分布中的原有数据

在n轮实验之后,检测到的粒子总数净和 

idx = np.insert(X.cumsum(), 0, 0)[:-1] #累积求和插入到空列表中
E_10s = np.add.reduceat(E, idx)  #分段求和,E是一个完整的数组,ind给出的是分段的位置,然后每一段分别进行求和
#也就是,0-2求和、3-5求和、6-11求和#绘图
plt.figure(figsize=(5,3))
plt.hist(E_10s, bins=100)
plt.xlabel('Energy [GeV]', fontsize=20)
plt.ylabel('# Occurences')
plt.show()

结果绘制如下: 

3、MCMC算法 

MCMC:该方法将马尔科夫(Markov)过程引入到Monte Carlo模拟中,实现抽样分布随模拟的进行而改变的动态模拟,弥补了传统的蒙特卡罗积分只能静态模拟的缺陷。 

4、参考文章

参考视频:https://www.youtube.com/watch?v=i3AkTO9HLXo

 https://www.youtube.com/watch?v=U00Kseb6SB4

参考文章: 动态规划之——矩阵连乘(全网最详细博文,看这一篇就够了!)-CSDN博客

原创 | 一文读懂蒙特卡洛算法

二、flow-based GAN 

1、引入 

 

问题:一般的GAN无法直接optimize模型的function,也就是无法使得G^*取得最大值

解决:flow-based GAN 

2、数学基础回顾 

Jacobian matrix 

向量z是输入、向量x是输出 ,Jacobian matrix 就是分别在各自位置上进行偏微分操作。由此引申出了Jacobian的逆矩阵。二者互为逆矩阵的关系,有公式如下:

J_fJ_f^{-1}=1

determinant 

 

几何意义的表示如下: 

 

几维向量就代表了该矩阵能够组成几维空间的图形。 

change of variable theorem

 

已知输入z的正态分布\pi (z)以及输出的一个复杂分布p(x)。首先,将z作为输入、x作为输出,f是连接输入输出的函数,体现二者之间的关系;接着,将z{}'对应到x{}'上去,找到x{}'在分布中对应的p({x}');最后,找到两个分布之间的关系。

无论输入输出是什么分布,蓝色方块和绿色方块的面积要保持一致。

 

 

总结 

本周对GAN的变形算法进行数学基础学习,并且拓展学习了MCMC算法的基本内容和代码。下周将继续学习flow-based GAN算法的基本理论推导,并且对MCMC算法进行总结,找到马尔科夫链和蒙特卡罗方法的关联及在该算法中各自的应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/58005.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

程序员在线面试刷题神器

大家好&#xff0c;我是程序员阿药。推荐大家一款面试刷题神器&#xff01;&#xff01;&#xff01; 简介 微学时光是一款专为计算机专业学生和IT行业求职者设计的面试刷题小程序&#xff0c;它汇集了丰富的计算机面试题和知识点&#xff0c;旨在帮助用户随时随地学习和复习…

Zookeeper面试整理-故障排查和调试

在使用 Zookeeper 的过程中,可能会遇到各种问题,如性能下降、节点失效、集群不可用等。为了保持系统的稳定性和高可用性,掌握 Zookeeper 的故障排查和调试方法至关重要。以下是一些常见的故障排查技巧和调试方法: 1. 日志分析 Zookeeper 的日志是最直接的调试和故障排查工具…

Python 应用可观测重磅上线:解决 LLM 应用落地的“最后一公里”问题

作者&#xff1a;彦鸿 背景 随着 LLM&#xff08;大语言模型&#xff09;技术的不断成熟和应用场景的不断拓展&#xff0c;越来越多的企业开始将 LLM 技术纳入自己的产品和服务中。LLM 在自然语言处理方面表现出令人印象深刻的能力。然而&#xff0c;其内部机制仍然不明确&am…

gin入门教程(8):渲染与静态文件

目录结构 /hello-gin │ ├── cmd/ │ └── main.go ├── pkg/ │ └── shared_lib.go ├── internal/ │ └── internal_lib.go ├── api/ │ └── routes.go ├── config/ │ └── config.go ├── migrations/ │ └── migration.sql └…

城市景色视频素材下载好去处

在制作短视频、Vlog 或商业宣传片时&#xff0c;城市景色视频素材能为作品增添现代感与活力。繁华都市、流光溢彩的夜景、清晨街道等都是展现城市魅力的好素材。那么城市景色视频素材去哪里下载呢&#xff1f; 蛙学网 是专为短视频创作者打造的素材平台&#xff0c;城市景色素材…

Spring Boot框架中的IO

1. 文件资源的访问与管理 在 Spring Boot 中&#xff0c;资源文件的访问与管理是常见的操作需求&#xff0c;比如加载配置文件、读取静态文件或从外部文件系统读取文件。Spring 提供了多种方式来处理资源文件访问&#xff0c;包括通过 ResourceLoader、Value 注解以及 Applica…

[bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist

[bug] vllm 0.6.1 RuntimeError: operator torchvision::nms does not exist 环境 python 3.10 torch 2.4.0cu118 torchvision 0.19.0cu118 vllm 0.6.1.post2cu118问题详情 if torch._C._d…

嵌入式软开——八股文——学习引导和资料网址

1、找工作期间整理的相关八股资料&#xff0c;可以帮助初学者按此流程快速学习入门&#xff0c;帮助有基础的同学快速复习、查缺补漏&#xff0c;帮助找工作面试的同学&#xff0c;快速复习知识点。 2、前13个文件夹为单独模块的相关学习内容&#xff0c;里面涵盖相关模块的主…

零基础Java第十一期:类和对象(二)

目录 一、对象的构造及初始化 1.1. 就地初始化 1.2. 默认初始化 1.3. 构造方法 二、封装 2.1. 封装的概念 2.2. 访问限定符 2.3. 封装扩展之包 三、static成员 3.1. 再谈学生类 3.2. static修饰成员变量 一、对象的构造及初始化 1.1. 就地初始化 在声明成员变…

耦合回路网络

目录 去耦 阻抗 初级回路对次级回路的影响 次级回路对初级回路的影响 对比 物理意义 讨论: 谐振时 ​编辑 谐振 耦合回路谐振分类 部分谐振 复谐振 全谐振 要研究耦合回路 , 就要先进行去耦的工作 去耦 对于去耦的方法 , 总共列出两个方程 , 初级回路与次级回路的方程求解…

傻瓜式AI头像生成

01、先看看看效果 02、第一步 输入关键词&#xff1a;Design by Disney Pixar Studio, by craig mccracken, maintaining consistency in the actions, expressions, clothing, shape, and appearance of the photos, three-quarter side looking at camera, a cute 20-year-ol…

第11次CCF CSP认证真题解

1、打酱油 题目链接&#xff1a;https://sim.csp.thusaac.com/contest/11/problem/0 本题只需推导出所有输出样例都满足的规律式并输出即可。 100代码&#xff1a; #include <iostream> using namespace std; int main(int argc, char *argv[]) {int n;cin >> …

车机Android整机开发架构方向

一、 Android 整机开发与应用开发的区别 整机开发需求&#xff08;存量市场&#xff09; 来源于 Google&#xff0c;每年都会对系统进行版本升级&#xff08;15、16、17 …&#xff09;&#xff1b;Google 对 Android 升级&#xff0c;头部的厂商必须跟着做系统升级并更新功能…

IntelliJ IDEA 设置数据库连接全局共享

前言 在日常的软件开发工作中&#xff0c;我们经常会遇到需要在多个项目之间共享同一个数据库连接的情况。默认情况下&#xff0c;IntelliJ IDEA 中的数据库连接配置是针对每个项目单独存储的。这意味着如果你在一个项目中配置了一个数据库连接&#xff0c;那么在另一个项目中…

Axure简单进度条制作,原型文件可下载

1.先看效果 2.需要用到的主要元件 a动态面板遮挡进度条左侧部分 b进度条底色背景 c百分比数字 3.将进度条、背景、百分比数字设置为隐藏 4.为按钮【选择文件】添加事件&#xff0c;并显示相应的原件 显示进度条process向右侧滑动 5.设置百分比数字及显示时每25毫秒加1 如…

nuxt数据库之增删改查,父组件子组件传值

nuxt学到数据库这里&#xff0c;就涉及到响应数据&#xff0c;父组件向子组件传值&#xff0c;子组件向父组件传值&#xff0c;最终还是需要掌握vue3的组件知识了。学习真的是一个长期的过程&#xff0c;不管学习了什么知识&#xff0c;有多少&#xff0c;都应该及时的记录下来…

安全见闻(7)——开阔眼界,不做井底之蛙

内容预览 ≧∀≦ゞ 安全见闻七&#xff1a;洞悉硬件设备的安全风险声明导语硬件设备的安全问题物理安全问题设备被盗或损坏环境因素电磁干扰 供应链安全问题假冒伪劣产品恶意软件植入供应链中断 设备漏洞问题操作系统漏洞固件漏洞硬件设计漏洞 网络连接问题网络攻击无线连接安全…

Python 判断键是否存在字典中(新手入门、实战案例)

在早期的Python2版本中&#xff0c;可以使用 dict.has_key()方法来判断一个键是否存在于字典中。 在Python3中&#xff0c;dict.has_key()方法被废弃了&#xff0c;不能再被使用。如果在Python3中尝试使用dict.has_key()方法会导致 AttributeError异常。 那在Python3中要如何判…

【jellyfin】解决Edge 浏览器播放 jellyfin 的 hevc/h265 视频“该客户端与媒体不兼容,服务器未发送兼容的媒体格式”错误

文章目录 问题原因分析解决方法 问题 在 windows 系统自带的 Edge 浏览器里网页播放 jellyfin 媒体库里的 hevc/h265 编码的视频时&#xff0c;总是提示 该客户端与媒体不兼容&#xff0c;服务器未发送兼容的媒体格式&#xff0c;无法播放视频。 原因分析 Edge 浏览器默认不…

k8s-service详解

Service介绍 在kubernetes中&#xff0c;pod是应用程序的载体&#xff0c;我们可以通过pod的ip来访问应用程序&#xff0c;但是pod的ip地址不是固定的&#xff0c;这也就意味着不方便直接采用pod的ip对服务进行访问。 为了解决这个问题&#xff0c;kubernetes提供了Service资源…