我有一个新数据集,其中包含一个数据集的前五个标准化主成分值(PC1至PC5)。现在我想使用这个新数据集创建一个包含3个聚类的KMeans图。数据集的名称是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 clustersclusters = model.predict(principalDf)print(clusters)#plot based on clusterfor 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 dimensionalityC:\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] = resC:\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)
请帮助我解决这个问题,因为我正在尝试绘制聚类图。
回答:
你不能像这样索引数据框,你应该使用 .iloc。或者:
plt.scatter(x=principalDF["PC1"], y=principalDF["PC2"], c=clusters)