KMeans кластеризация участка стандартизированных ПК - PullRequest
0 голосов
/ 06 марта 2019

У меня есть новый набор данных, который содержит первые стандартизированные значения ПК (от ПК1 до ПК5) набора данных. Теперь я хочу создать график kmeans с 3 кластерами, используя этот новый набор данных. Имя набора данных - PrincipalDf, как показано ниже:

      PC1         PC2         PC3         PC4         PC5
    4.220974   -2.270272    0.757259   -1.597269    4.238792
   13.464907   -3.685775   -2.142520   -0.889321   -0.217543
    5.900341   -2.368060    0.093671    0.484737    0.243810
   -1.884293    1.370640   -0.221722    3.304978    0.292733
    2.631881    1.782549    0.575880   -2.894564   -0.848573

Я попытался построить его, используя код ниже:

model = KMeans(n_clusters = 3)
model.fit(principalDf)

#get clusters
clusters = model.predict(principalDf)
print(clusters)

#plot based on cluster
for i in range(len(clusters)):
    if clusters[i] == 0:
        c1 = plt.scatter(principalDf[i, 0], principalDf[i, 1], c='r', marker='+')
    elif clusters[i] == 1:
        c2 = plt.scatter(principalDf[i, 0], principalDf[i, 1], c='g', marker='o')
    elif clusters[i] == -1:
        c3 = plt.scatter(principalDf[i, 0], principalDf[i, 1], c='b', marker='*')
    elif clusters[i] == 2:
        c3 = plt.scatter(principalDf[i, 0], principalDf[i, 1], c='black', marker='-')

plt.legend([c1, c2, c3], ['Cluster 1', 'Cluster 2', 'Cluster3'])
plt.title('There are 3 cluster in our data but we can only plot in 2 dimensions')
plt.show()

Но я продолжаю получать эту ошибку:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-22-ae7667a531f7> in <module>()
      3 for i in range(len(clusters)):
      4     if clusters[i] == 0:
----> 5         c1 = plt.scatter(principalDf[i, 0], principalDf[i, 1], c='r', marker='+')
      6     elif clusters[i] == 1:
      7         c2 = plt.scatter(principalDf[i, 0], principalDf[i, 1], c='g', marker='o')

C:\Users\user\Anaconda2\lib\site-packages\pandas\core\frame.pyc in __getitem__(self, key)
   2686             return self._getitem_multilevel(key)
   2687         else:
-> 2688             return self._getitem_column(key)
   2689 
   2690     def _getitem_column(self, key):

C:\Users\user\Anaconda2\lib\site-packages\pandas\core\frame.pyc in _getitem_column(self, key)
   2693         # get column
   2694         if self.columns.is_unique:
-> 2695             return self._get_item_cache(key)
   2696 
   2697         # duplicate columns & possible reduce dimensionality

C:\Users\user\Anaconda2\lib\site-packages\pandas\core\generic.pyc in _get_item_cache(self, item)
   2487         res = cache.get(item)
   2488         if res is None:
-> 2489             values = self._data.get(item)
   2490             res = self._box_item_values(item, values)
   2491             cache[item] = res

C:\Users\user\Anaconda2\lib\site-packages\pandas\core\internals.pyc in get(self, item, fastpath)
   4113 
   4114             if not isna(item):
-> 4115                 loc = self.items.get_loc(item)
   4116             else:
   4117                 indexer = np.arange(len(self.items))[isna(self.items)]

C:\Users\user\Anaconda2\lib\site-packages\pandas\core\indexes\base.pyc in get_loc(self, key, method, tolerance)
   3078                 return self._engine.get_loc(key)
   3079             except KeyError:
-> 3080                 return self._engine.get_loc(self._maybe_cast_indexer(key))
   3081 
   3082         indexer = self.get_indexer([key], method=method, tolerance=tolerance)

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: (0, 0)

Пожалуйста, мне нужна помощь в этом, так как я пытаюсь построить кластер.

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Вы не можете индексировать фреймы данных таким образом, вам придется использовать .iloc. В качестве альтернативы:

plt.scatter(x=principalDF["PC1"], y=principalDF["PC2"], c=clusters)

0 голосов
/ 06 марта 2019

PrincipalDF - это кадр данных pandas. Вы относитесь к этому как к массиву. Простым решением было бы сделать PrincipalDF.values, который дает вам массив данных массива данных.

...