【问题标题】:computing z-scores for 2D matrices in scipy/numpy in Python在 Python 中计算 scipy/numpy 中二维矩阵的 z 分数
【发布时间】:2011-02-28 10:23:16
【问题描述】:

如何在 Python 中计算矩阵的 z 分数?

假设我有数组:

a = array([[   1,    2,    3],
           [  30,   35,   36],
           [2000, 6000, 8000]])

我想计算每一行的 z 分数。我想出的解决方案是:

array([zs(item) for item in a])

zs 在 scipy.stats.stats 中的位置。有没有更好的内置矢量化方式来做到这一点?

另外,在使用具有欧几里得或苏几里得距离的层次聚类之前,z 分数总是好的吗?谁能讨论一下相对的优势/劣势?

谢谢。

【问题讨论】:

    标签: python numpy cluster-analysis machine-learning scipy


    【解决方案1】:

    scipy的新zscore,下个版本提供,可以任意数组维度

    http://projects.scipy.org/scipy/changeset/6169

    【讨论】:

    • @user333700:感谢您的信息。
    【解决方案2】:

    scipy.stats.stats.zs 是这样定义的:

    def zs(a):
        mu = mean(a,None)
        sigma = samplestd(a)
        return (array(a)-mu)/sigma
    

    因此,要将其扩展为在 ndarray 的给定轴上工作,您可以这样做:

    import numpy as np
    import scipy.stats.stats as sss
    def my_zs(a,axis=-1):
        b=np.array(a).swapaxes(axis,-1)    
        mu = np.mean(b,axis=-1)[...,np.newaxis]
        sigma = sss.samplestd(b,axis=-1)[...,np.newaxis]
        return (b-mu)/sigma
    
    
    a = np.array([[   1,    2,    3],
               [  30,   35,   36],
               [2000, 6000, 8000]])    
    result=np.array([sss.zs(item) for item in a])
    
    my_result=my_zs(a)
    print(my_result)
    # [[-1.22474487  0.          1.22474487]
    #  [-1.3970014   0.50800051  0.88900089]
    #  [-1.33630621  0.26726124  1.06904497]]
    assert(np.allclose(result,my_result))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-25
      • 1970-01-01
      • 1970-01-01
      • 2010-12-30
      • 1970-01-01
      • 2022-01-26
      • 2012-10-11
      • 1970-01-01
      相关资源
      最近更新 更多