K ОЗНАЧАЕТ график кластеризации стандартизированных ПК

#python-3.x #machine-learning #scikit-learn #cluster-analysis #k-means

#python-3.x #машинное обучение #scikit-learn #кластерный анализ #k-означает

Вопрос:

У меня есть новый набор данных, который содержит первые стандартизированные значения PC (от PC1 до PC5) набора данных. Теперь я хочу создать график 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:UsersuserAnaconda2libsite-packagespandascoreframe.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:UsersuserAnaconda2libsite-packagespandascoreframe.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 amp; possible reduce dimensionality

C:UsersuserAnaconda2libsite-packagespandascoregeneric.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:UsersuserAnaconda2libsite-packagespandascoreinternals.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:UsersuserAnaconda2libsite-packagespandascoreindexesbase.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_libsindex.pyx in pandas._libs.index.IndexEngine.get_loc()

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

pandas_libshashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

pandas_libshashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item()

KeyError: (0, 0)
  

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

Ответ №1:

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

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

Ответ №2:

principalDF — это фрейм данных pandas. Вы рассматриваете его как массив numpy. Простым решением было бы выполнить principalDF.values, который выдает вам массив numpy фрейма данных.