1

こんにちはみんな私は次のコードを持っています:

from math import sqrt
array = [(1,'a',10), (2,'a',11), (3,'c',200), (60,'a',12), (70,'t',13), (80,'g',300), (100,'a',305), (220,'c',307), (230,'t',306), (250,'g',302)]


def stat(lst):
    """Calculate mean and std deviation from the input list."""
    n = float(len(lst))
    mean = sum([pair[0] for pair in lst])/n
##    mean2 = sum([pair[2] for pair in lst])/n
    stdev = sqrt((sum(x[0]*x[0] for x in lst) / n) - (mean * mean))
##    stdev2 = sqrt((sum(x[2]*x[2] for x in lst) / n) - (mean2 * mean2)) 

    return mean, stdev

def parse(lst, n):
    cluster = []
    for i in lst:
        if len(cluster) <= 1:    # the first two values are going directly in
            cluster.append(i)
            continue
###### add also the distance between lengths
        mean,stdev = stat(cluster)
        if (abs(mean - i[0]) > n * stdev):   # check the "distance"
            yield cluster
            cluster[:] = []    # reset cluster to the empty list

        cluster.append(i)
    yield cluster           # yield the last cluster

for cluster in parse(array, 7):
    print(cluster)

変数 i[0] を参照して、タプル (配列) のリストをクラスタ化します。また、実装したいのは、各タプルの変数 i[2] によってさらにクラスター化することです。

現在の出力は次のとおりです。

[(1, 'a', 10), (2, 'a', 11), (3, 'c', 200)]
[(60, 'a', 12), (70, 't', 13), (80, 'g', 300), (100, 'a', 305)]
[(220, 'c', 307), (230, 't', 306), (250, 'g', 302)]

そして、私は次のようにしたいと思います:

[(1, 'a', 10), (2, 'a', 11)]
[(3, 'c', 200)]
[(60, 'a', 12), (70, 't', 13)]
[(80, 'g', 300), (100, 'a', 305)]
[(220, 'c', 307), (230, 't', 306), (250, 'g', 302)]

したがって、i[0] の値は近くにあり、i[2] も同様です。それをクラックする方法はありますか?

4

2 に答える 2

0

まず第一に、分散を計算する方法は数値的に不安定です。E(X^2)-E(X)^2数学的には保持されますが、数値の精度が低下します。最悪の場合、負の値を取得してsqrt失敗します。

numpyこれを適切に計算できるものを実際に調べる必要があります。

概念的に、データを 2 次元データ空間として扱うことを検討しましたか? 次に、それを白くして、k-means またはその他のベクトル ベースのクラスタリング アルゴリズムなどを実行できます。

標準偏差と平均は、複数の属性に抽象化するのは簡単です (「マハラノビス距離」を調べてください)。

于 2013-09-11T08:05:57.440 に答える