1

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 スコアすることは常に良いことですか? 相対的な長所/短所について誰でも議論できますか?

ありがとう。

4

2 に答える 2

3

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))
于 2010-06-06T19:37:26.367 に答える
2

次のリリースで利用可能な scipy の新しい zscore は、任意の配列次元を取ります

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

于 2010-06-07T20:26:25.873 に答える