2017-10-27 9 views
-1

kmeansアルゴリズムをPythonで実装し、kのさまざまな値に対してクラスタの性能をとして計算しようとしました。 ここでは、データセットの小さな部分にはほとんど変わりません。これはValueError:複数の要素を持つ配列の真理値はあいまいです。シルエットパフォーマンスアルゴリズム

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 

LINE-コメントにエラーと一緒に得られる

data- 
[[ 0. 0. 5.] 
[ 0. 0. 0.] 
[ 0. 0. 0.] 
[ 0. 0. 7.] 
[ 0. 0. 0.] 
[ 0. 0. 12.] 
[ 0. 0. 0.] 
[ 0. 0. 7.] 
[ 0. 0. 9.] 
[ 0. 0. 11.]] 
Clusters 
[[array([ 0., 0., 5.]), array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])], [array([ 0., 0., 7.]), array([ 0., 0., 12.]), array([ 0., 0., 7.]), array([ 0., 0., 9.]), array([ 0., 0., 11.])]] 
[ 0. 0. 5.] 
[[0.0, 0.0, 5.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]] 

follows-ようにして得られた端末上

def avgdist(pt, clust): 
    dists = [] 
    for elem in clust: 
     dists.append(np.linalg.norm(pt-elem)) 
    return np.mean(dists) 

def silhouette(data, clusts): 
    s = [] 
    print("data-") 
    print(data) 
    for i in range(len(clusts)): 
     for j in range(len(clusts[i])): 
      clusts[i][j] = clusts[i][j].tolist() 
    print("Clusters") 
    print(clusts) 
    for elem in data: 
     a = [] 
     b = [] 
     print(elem) 
     for clust in clusts: 
      print(clust) 
      if elem in clust: #Error in this line 
       b.append(avgdist(elem, clust)) 
      else: 
       a.append(avgdist(elem, clust)) 

     s.append((min(b)-min(a)/(max(min(b), min(a))))) 
    return np.mean(s) 

出力は、私が何かわからないよう助けてくださいですそのエラーは私の状況では意味します。同様の質問からエラーの性質を知ることができましたが、ここでは該当しません。

編集 - 私はあなたの問題はあなたがリスト(CLUST)のリストが含まれている場合は、当該行で評価しようということである

..... 
if elem.tolist() in clust: #Error in this line 
    ..... 
+0

を(報告のみ1つの比較)を印刷しますあなたはSOの答えを得ることを満足しています? [誰かが私の質問に答えたときに何をすべきですか?](https://stackoverflow.com/help/someone-answers)を読むことを検討してください。 – Kanak

答えて

0

AS-エラーの行に変更することで、この問題を解決しました評価は、要素単位に行われるため、真実/ Falseの値のリスト/アレイをもたらす別のリスト(ELEM): 問題のコード行は、線に沿って評価される生成する

if [True, False, ...]: #<- error here 
     code 

リストのリストを保持する代わりに問題のエラー

を入力し、データとクラスタ要素をタプルのリストに変換して、この評価が機能します。

+0

基本的には、このようなnumpy配列のリストにnumpy配列の存在をテストしたいと思います。 'a in b'に相当する同様のコマンドを書く方法はありますか?aはnumpy配列、bはnumpy配列のリストです。最後に、すべての座標が同じ真理値を取得します。 –

+0

これを行うには、データを再パックする必要があります。'listoflistsのsublのための' [tuple(subl)]行に沿った何か ' –

0

は、あなたがどのようなアレイのリスト内の1つのnumpyの配列のテスト存在

[...] 
if any([compa.all() for compa in elem == clust]): 
    [...] 

によって

[...] 
if elem in clust: #Error in this line 
    [...] 

の交換について

import numpy as np 
data = np.array([[ 0., 0., 5.], 
       [ 0., 0., 0.], 
       [ 0., 0., 0.], 
       [ 0., 0., 7.], 
       [ 0., 0., 0.], 
       [ 0., 0., 12.], 
       [ 0., 0., 0.], 
       [ 0., 0., 7.], 
       [ 0., 0., 9.], 
       [ 0., 0., 11.]]) 

clusts = [[np.array([ 0., 0., 5.]), np.array([ 0., 0., 0.]), np.array([ 0., 0., 0.]), np.array([ 0., 0., 0.]), np.array([ 0., 0., 0.])], [np.array([ 0., 0., 7.]), np.array([ 0., 0., 12.]), np.array([ 0., 0., 7.]), np.array([ 0., 0., 9.]), np.array([ 0., 0., 11.])]] 

何を持っていると言います。 Python3.6


要するに

def silhouette(data, clusts): 
    s = [] 
    print("data-") 
    print(data) 
    for i in range(len(clusts)): 
     for j in range(len(clusts[i])): 
      clusts[i][j] = clusts[i][j].tolist() 
    print("Clusters") 
    print(clusts) 
    for elem in data: 
     a = [] 
     b = [] 
     print(elem) 
     for clust in clusts: 
      print(clust) 
      condition = any([compa.all() for compa in elem == clust]) 
      print(condition) 
      if condition: #No error anymore in this line 
       b.append(avgdist(elem, clust)) 
      else: 
       a.append(avgdist(elem, clust)) 

     s.append((min(b)-min(a)/(max(min(b), min(a))))) 
    return np.mean(s) 

下で試験

[...] 
[ 0. 0. 5.] 
[[0.0, 0.0, 5.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]] 
True 
[[0.0, 0.0, 7.0], [0.0, 0.0, 12.0], [0.0, 0.0, 7.0], [0.0, 0.0, 9.0], [0.0, 0.0, 11.0]] 
False 
関連する問題