вычисление z-показателей для двумерных матриц в scipy / numpy в Python - PullRequest
1 голос
/ 06 июня 2010

Как я могу вычислить z-показатель для матриц в Python?

Предположим, у меня есть массив:

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

и я хочу вычислить z-показатель для каждой строки. Решение, которое я придумал:

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

где zs находится в scipy.stats.stats. Есть ли лучший встроенный векторизованный способ сделать это?

Кроме того, всегда ли полезно выполнять z-оценку чисел перед использованием иерархической кластеризации с евклидовым или евклидовым расстоянием? Кто-нибудь может обсудить относительные преимущества / недостатки?

спасибо.

Ответы [ 2 ]

3 голосов
/ 06 июня 2010

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))
2 голосов
/ 08 июня 2010

новый zscore scipy, доступный в следующем выпуске, принимает произвольное измерение массива

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

...