【问题标题】:Create normally distributed columns, with different mean values创建具有不同平均值的正态分布列
【发布时间】:2019-03-09 03:10:03
【问题描述】:

我有以下 numpy 矩阵:

R = np.matrix(np.ones([3,3]))

# Update R matrix based on sales statistics
for i in range(0, len(R)):
    for j in range(0, len(R)):  
        R[j,i] = scipy.stats.norm(2, 1).pdf(i) * 100  

print(R)

[[ 5.39909665 24.19707245 39.89422804]
 [ 5.39909665 24.19707245 39.89422804]
 [ 5.39909665 24.19707245 39.89422804]]

我想转换每一列乘以索引(0,1,2)为对应的法线密度值分布,平均值等于第一列的 5.39909665,第二列的 24.19707245 和第三列的 39.8942280;标准差等于1。

最终,创建一个矩阵为:

[norm(5.39, 1).pdf(0), norm(24.197, 1).pdf(0), ...]
     [ norm(5.39, 1).pdf(1), norm(24.197, 1).pdf(1), ...]
     [ norm(5.39, 1).pdf(2), norm(24.197, 1).pdf(2), ...]]

如何创建最终矩阵?

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    pdf 方法的工作方式与任何 numpy 函数非常相似,从某种意义上说,您可以输入具有相同形状的数组并结合标量。您可以使用以下内容创建 R:

    ix = np.repeat(np.arange(3),3).reshape((3,3)) #row index, or ix.T for column index
    R = scipy.stats.norm(2,1).pdf(ix.T)*100
    >>array([[ 5.39909665, 24.19707245, 39.89422804],
       [ 5.39909665, 24.19707245, 39.89422804],
       [ 5.39909665, 24.19707245, 39.89422804]])
    

    按照相同的逻辑,如果您希望您的 [i,j] 索引为 scipy.stats.norm(scipy.stats.norm(2,1).pdf(j) * 100, 1).pdf(i)(来自您作为结果放置的矩阵),请使用:

    scipy.stats.norm(scipy.stats.norm(2,1).pdf(ix.T) * 100, 1).pdf(ix)
    

    【讨论】:

    • 否;基本上,我想为每一列创建一个高斯分布,平均值由在原始矩阵 R 中重复的值给出,在每个步骤 [0,1,2]
    • 现在检查,这些值与您的结果矩阵相同,尽管它们看起来很奇怪。但是,一旦您了解如何将矩阵作为 pdf 的参数,您就可以在任何情况下自行处理。
    • 问题在于它在每一列中使用相同的值;相反,我希望在 0 处评估的 pdf 与在 1 和 2 处评估的 pdf 不同;这应该发生在每一行,每一列。最终,矩阵应包含来自三个不同高斯的 9 个不同值,均值分别等于 [5.39909665 24.19707245 39.89422804]
    猜你喜欢
    • 2023-03-15
    • 1970-01-01
    • 2021-06-28
    • 2018-06-20
    • 1970-01-01
    • 2021-11-21
    • 2020-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多