0

vq.whitenfromを使用しscipy.clusterてデータを正規化するのに問題があります。私は、欠落している機能値が各機能の平均で埋められたnumpy配列を渡しています。

スタックする行は次のとおりです。

data = scipy.cluster.vq.whiten(self.imputed)

これは、欠落しているデータを置き換えるために使用しているコードです。

imputed = np.array([self.masked[:,i].filled(self.masked[:,i].mean()) 
                   for i in range(np.shape(self.masked)[1])])
self.imputed = np.transpose(imputed)

私のコードを壊しているように見えるという事実は別として、この部分を行うためのより良い方法もあると確信しています。それは醜い方法のように思えますが、それは通常、Python でより良い方法があることを意味します。

送信する配列の量をスライスしてみましたwhitenが、トレースバックで次の結果が得られても問題ありません。

Traceback (most recent call last):
  File "C:\Users\jamie.bull\workspace\Metadata\src\draft_workflow.py", line 87, in <module>
    dataset.cluster()
  File "C:\Users\jamie.bull\workspace\Metadata\src\draft_workflow.py", line 59, in cluster
    data = scipy.cluster.vq.whiten(self.imputed)
  File "C:\Enthought\Python27\lib\site-packages\scipy\cluster\vq.py", line 131, in whiten
    std_dev = std(obs, axis=0)
  File "C:\Enthought\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 2467, in std
    return std(axis, dtype, out, ddof)
AttributeError: sqrt

クラスタリングは、データが欠落することなく同じデータセットで正常に機能するため、次に何を試すべきか途方に暮れています。

編集:次imputedを使用して、完全なデータセットと欠落しているデータセットの両方について 、各アイテムのタイプを印刷してみました:

for item in imputed:
    print type(item)

2 つの違いは、平均置換と転置が呼び出されていないバージョンではnumpy.ndarray行ごとに 1 つあるのに対し、平均置換されたバージョンでは列ごとに 1 つあることです。

4

1 に答える 1

3

私は今これを解決したので、将来の失われた魂のためにここに答えを置きます。float問題は、元のデータがとして保存されたときに、私の平均的な置換が欠落している値をsに置き換えることでしたnumpy.float64

解決策は、リスト内包表記を実行し、にを設定してそれに従うことdtypeですnp.float64。混合データ型を受け取るのは好きでwhitenはないようです。

また、リスト内包の後に転置しなければならないという醜い問題を解決して、私は再発見しnp.column_stack()ました。仕事関数は次のようになります。

def mean_impute(self):
    imputed = np.column_stack(self.masked[:,i].filled(self.masked[:,i].mean()) 
               for i in range(np.shape(self.masked)[1]))
    self.imputed = np.array(imputed, dtype=np.float64)

追加するために編集

昔のことですが、ここで更新すると思いました。私は今、データの処理と使用pandas、そしてfill_na()この状況のた​​めにパンダを使用します。

OPの問題のある行は、次のように置き換えることができます。

imputed = self.masked.fillna(self.masked.mean())
于 2012-11-21T01:45:51.023 に答える