首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >多元正态分布的Numpy向量化

多元正态分布的Numpy向量化
EN

Stack Overflow用户
提问于 2018-02-08 13:42:38
回答 1查看 1.7K关注 0票数 3

我有两个二维numpy数组A,B。我想使用scipy.stats.multivariate_normal来计算A中每行的联合logpdf,使用B中的每一行作为协方差矩阵。有没有什么方法可以在不显式循环行的情况下做到这一点?将scipy.stats.multivariate_normal直接应用于A和B确实会计算A中每一行的logpdf (这是我想要的),但使用整个2D数组A作为协方差矩阵,这不是我想要的(我需要B的每一行创建一个不同的协方差矩阵)。我正在寻找一种使用numpy向量化并避免在两个数组上显式循环的解决方案。

EN

回答 1

Stack Overflow用户

发布于 2018-06-12 03:57:39

我也在尝试完成类似的事情。下面是我的代码,它接受三个NxD矩阵。X的每一行是一个数据点,means的每一行是一个均值向量,covariances的每一行是一个对角协方差矩阵的对角向量。结果是对数概率的长度为N的向量。

代码语言:javascript
运行
AI代码解释
复制
def vectorized_gaussian_logpdf(X, means, covariances):
    """
    Compute log N(x_i; mu_i, sigma_i) for each x_i, mu_i, sigma_i
    Args:
        X : shape (n, d)
            Data points
        means : shape (n, d)
            Mean vectors
        covariances : shape (n, d)
            Diagonal covariance matrices
    Returns:
        logpdfs : shape (n,)
            Log probabilities
    """
    _, d = X.shape
    constant = d * np.log(2 * np.pi)
    log_determinants = np.log(np.prod(covariances, axis=1))
    deviations = X - means
    inverses = 1 / covariances
    return -0.5 * (constant + log_determinants +
        np.sum(deviations * inverses * deviations, axis=1))

请注意,此代码仅适用于对角线协方差矩阵。在这种特殊情况下,下面的数学定义被简化了:行列式变成元素的乘积,逆变成元素的倒数,矩阵乘法变成元素的乘法。

快速测试正确性和运行时间:

代码语言:javascript
运行
AI代码解释
复制
def test_vectorized_gaussian_logpdf():
    n = 128**2
    d = 64

    means = np.random.uniform(-1, 1, (n, d))
    covariances = np.random.uniform(0, 2, (n, d))
    X = np.random.uniform(-1, 1, (n, d))

    refs = []

    ref_start = time.time()
    for x, mean, covariance in zip(X, means, covariances):
        refs.append(scipy.stats.multivariate_normal.logpdf(x, mean, covariance))
    ref_time = time.time() - ref_start

    fast_start = time.time()
    results = vectorized_gaussian_logpdf(X, means, covariances)
    fast_time = time.time() - fast_start

    print("Reference time:", ref_time)
    print("Vectorized time:", fast_time)
    print("Speedup:", ref_time / fast_time)

    assert np.allclose(results, refs)

我得到了250倍的加速。(是的,我的应用程序要求我计算16384种不同的高斯分布。)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48686934

复制
相关文章
numpy 多元运算函数
如果arr2数组中的元素能被2整除,输出arr2的元素,如果不是,输出默认值100
用户7886150
2020/12/25
5090
金融量化 - numpy 教程
NumPy提供了大量的数值编程工具,可以方便地处理向量、矩阵等运算,极大地便利了人们在科学计算方面的工作。另一方面,Python是免费,相比于花费高额的费用使用Matlab,NumPy的出现使Python得到了更多人的青睐
公众号---人生代码
2020/06/19
1.2K0
【温故知新】应用多元统计分析-第二章 多元正态分布的参数估计
2.5
统计学家
2019/04/10
4380
【温故知新】应用多元统计分析-第二章 多元正态分布的参数估计
【温故知新】应用多元统计分析- -第二章 多元正态分布及参数的估计(上)
多元正态分布
统计学家
2019/04/10
8180
【温故知新】应用多元统计分析- -第二章  多元正态分布及参数的估计(上)
Python+numpy实现函数向量化
Python本身对向量操作的支持并不是很好,需要借助列表推导式或函数式编程来实现,例如: >>> import random # 生成随机测试数据 >>> x = random.sample(range(1000), 5) >>> y = random.sample(range(1000), 5) # 列表推导式,模拟向量减法 >>> [vecX-vecY for vecX, vecY in zip(x,y)] [-171, -370, -66, 282, 231] # 列表推导式,模拟向量减法 >>>
Python小屋屋主
2018/04/16
3.2K0
python的numpy向量化语句为什么会比for快?
举例来说,执行 x = 1234+5678 ,对编译型语言,是从内存读入两个short int到寄存器,然后读入加法指令,通知CPU内部的加法器动作,最后把加法器输出存储到x对应的内存单元(实质上,最后这个动作几乎总会被自动优化为“把加法器输出暂存到寄存器而不是内存单元,因为访问内存的时间消耗常常是访问寄存器的几十倍”)。一共2~4条指令(视不同CPU指令集而定)。
我叫什么好
2021/12/25
9530
向量化操作简介和Pandas、Numpy示例
Pandas是一种流行的用于数据操作的Python库,它提供了一种称为“向量化”的强大技术可以有效地将操作应用于整个列或数据系列,从而消除了显式循环的需要。在本文中,我们将探讨什么是向量化,以及它如何简化数据分析任务。
deephub
2023/10/23
9200
向量化操作简介和Pandas、Numpy示例
Numpy 修炼之道 (13)—— 将python函数向量化
想要实现将python函数向量化,Numpy中的vectorize 和frompyfunc函数都可以满足要求。
abs_zero
2018/04/11
3.5K0
正态分布
比如你可能会问班里的考试成绩是怎样的?这里其实指的是大部分同学的成绩如何。以下图为例,在正态分布中,大部分人的成绩会集中在中间的区域,少部分人处于两头的位置。正态分布的另一个好处就是,如果你知道了自己的成绩,和整体的正态分布情况,就可以知道自己的成绩在全班中的位置。
润森
2019/08/29
1.7K0
正态分布
在向量化NumPy数组上进行移动窗口操作
今天很有可能你已经做了一些使用滑动窗口(也称为移动窗口)的事情,而你甚至不知道它。例如:许多编辑算法都是基于移动窗口的。在GIS中做地形分析的大多数地形栅格度量(坡度、坡向、山坡阴影等)都基于滑动窗口。很多情况下,对格式化为二维数组的数据进行分析时,都很有可能涉及到滑动窗口。
deephub
2021/01/25
1.9K0
利用MOKIT从ORCA向其他量化程序传轨道
(1)在ORCA中进行了RIJK或RIJCOSX加速的大体系HF/DFT计算,想传轨道给其他程序进行后续计算,或想产生fch文件方便可视化。
用户7592569
2023/09/03
6510
利用MOKIT从ORCA向其他量化程序传轨道
利用MOKIT从PySCF向其他量化程序传轨道
MOKIT是免费、开源的轨道转换和接口程序,提供各种小程序和模块,能够在常见量子化学软件间传递分子轨道。其中的automr程序可以进行多参考态方法的自动化、黑箱式计算,详细介绍见《自动做多参考态计算的程序MOKIT》。近期笔者和另一开发者wsr在MOKIT程序中加入了fchk(),py2molpro,py2molcas,py2qchem等模块,可用于从PySCF程序向其他量子化学程序传递分子轨道。尤其是通过fchk()产生.fch文件,可方便地用于轨道可视化、波函数分析。
用户7592569
2022/12/07
1.3K0
普通正态分布如何转换到标准正态分布中_正态分布化成标准正态的公式
项目github地址:bitcarmanlee easy-algorithm-interview-and-practice 欢迎大家star,留言,一起学习进步
全栈程序员站长
2022/11/08
6K0
普通正态分布如何转换到标准正态分布中_正态分布化成标准正态的公式
标准正态分布的分布函数服从均匀分布_python 正态分布
一个分布的随机变量可通过把服从(0,1)均匀分布的随机变量代入该分布的反函数的方法得到。标准正态分布的反函数却求不了。所以我们就要寻找其他的办法。
全栈程序员站长
2022/11/17
1.2K0
标准正态分布的分布函数服从均匀分布_python 正态分布
正态分布的前世今生(1)
神说,要有正态分布,就有了正态分布。 神看正态分布是好的,就让随机误差就服从了正态分布。
生信交流平台
2022/09/21
3970
正态分布的前世今生(1)
统计简单学_正态分布
正态分布简介 正态分布 自然界中,许多连续型随机变量都呈现钟形分布,又叫正态分布。 正态分布的特性 标准正态分布几率表 标准正态分布 利用z表求标准正态分布几率与z值 利用z表求正态分布几率 检查数据
用户1147754
2019/05/27
1.2K0
多元线性回归
书上这里是直接写成了矩阵形式,稍微有一点抽象,这里就不做说明了。 于是可以得到残差的平均值为0,接下来求解多元线性回归模型的离差形式。
爱编程的小明
2022/10/31
1.2K0
numpy的基本用法——numpy的索引
本文主要是关于numpy的一些基本运算的用法。 #!/usr/bin/env python # _*_ coding: utf-8 _*_ import numpy as np # Test 1 # 一维矩阵 a = np.arange(3, 15) print a # 输出矩阵的第三个元素 print a[2] # Test 1 result [ 3 4 5 6 7 8 9 10 11 12 13 14] 5 # Test 2 # 二维矩阵 a = np.arange(3, 15).
Tyan
2019/05/25
5820
统计学习 | 矩阵正态分布 (matrix normal distribution)
在机器学习和统计学习中,正态分布的身影无处不在,最为常见的是标准正态分布和多元正态分布 (multivariate normal distribution),两者分别作用于标量 (scalar) 和向量 (vector)。实际上,也存在一种正态分布的形式,它作用于矩阵,并广泛地应用于贝叶斯向量自回归模型 (Bayesian vector autoregression) 中。本文接下来将从大家所熟知的正态分布出发,先介绍矩阵正态分布,然后讨论矩阵正态分布在贝叶斯方法中的应用。
马上科普尚尚
2020/06/03
3K0
统计学习 | 矩阵正态分布 (matrix normal distribution)
正态分布为什么常见?
统计学里面,正态分布(normal distribution)最常见。男女身高、寿命、血压、考试成绩、测量误差等等,都属于正态分布。 >>>> 以前,我认为中间状态是事物的常态,过高和过低都属于少数
小莹莹
2018/04/24
7580
正态分布为什么常见?

相似问题

Numpy:多元正态分布的对数可能性

30

多元numpy不是正态分布,请帮助纠正这个错误

20

随机多元正态分布

12

聚类多元正态分布

10

是否有一种从Numpy的多元正态分布中以矢量化方式进行批量抽样的方法?

17
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文