我正在尝试使用 pyclustering 库中的 xmeans 对一些数据进行聚类和可视化。 我直接从 example 复制了代码在文档中,
from pyclustering.cluster import cluster_visualizer
from pyclustering.cluster.xmeans import xmeans
from pyclustering.cluster.center_initializer import kmeans_plusplus_initializer
from pyclustering.utils import read_sample
from pyclustering.samples.definitions import SIMPLE_SAMPLES
sample = X # read_sample(SIMPLE_SAMPLES.SAMPLE_SIMPLE3)
# Prepare initial centers - amount of initial centers defines amount of clusters from which X-Means will
# start analysis.
amount_initial_centers = 2
initial_centers = kmeans_plusplus_initializer(sample, amount_initial_centers).initialize()
# Create instance of X-Means algorithm. The algorithm will start analysis from 2 clusters, the maximum
# number of clusters that can be allocated is 20.
xmeans_instance = xmeans(sample, initial_centers, 20)
xmeans_instance.process()
# Extract clustering results: clusters and their centers
clusters = xmeans_instance.get_clusters()
centers = xmeans_instance.get_centers()
# Print total sum of metric errors
print("Total WCE:", xmeans_instance.get_total_wce())
# Visualize clustering results
visualizer = cluster_visualizer()
visualizer.append_clusters(clusters, sample)
visualizer.append_cluster(centers, None, marker='*', markersize=10)
visualizer.show()
唯一的区别是我将矩阵 X 的值分配给 sample
,而不是加载样本数据集。
当我尝试可视化聚类结果时出现此错误:
Only objects with size dimension 1 (1D plot), 2 (2D plot) or 3 (3D plot) can be displayed. For multi-dimensional data use 'cluster_visualizer_multidim'.
我的X矩阵是这样生成的:
features = ["I", "Iu", other 7 column names]
data = df[features]
...
X = scaler.fit_transform(data)
有没有办法可视化集群并一次只绘制两个/三个特征?
我在文档中找不到任何内容。
我试过这个:
visualizer.append_clusters(clusters, sample[:,[0,1]])
为了只可视化前两个特征而得到这个错误
Only clusters with the same dimension of objects can be displayed on canvas.
编辑:
我按照 annoviko 的回答中的建议更新了代码,但现在我收到以下错误:
ValueError Traceback (most recent call last)
<ipython-input-69-6fd7d2ce5fcd> in <module>
20 visualizer.append_clusters(clusters, X)
21 visualizer.append_cluster(centers, None, marker='*', markersize=10)
---> 22 visualizer.show(pair_filter=[[0, 1], [0, 2]])
/usr/local/lib/python3.8/site-packages/pyclustering/cluster/__init__.py in show(self, pair_filter, **kwargs)
224 raise ValueError("There is no non-empty clusters for visualization.")
225
--> 226 cluster_data = self.__clusters[0].data or self.__clusters[0].cluster
227 dimension = len(cluster_data[0])
228
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
它由 visualizer.show() 引发,即使我从函数调用中删除 pair_filter 也会发生。
最佳答案
根据你得到的错误:
Only objects with size dimension 1 (1D plot), 2 (2D plot) or 3 (3D plot) can be displayed. For multi-dimensional data use 'cluster_visualizer_multidim'.
您必须使用提到的 cluster_visualizer_multidim
。有一个文档(pyclustering 0.10.1)和一个例子:https://pyclustering.github.io/docs/0.10.1/html/dc/d6b/classpyclustering_1_1cluster_1_1cluster__visualizer__multidim.html
例如,如果您有一个数据 (D > 3
) 并且您想要显示 (x0, x1)
和 (x0, x2)
然后你可以通过以下方式显示它:
visualizer = cluster_visualizer_multidim()
visualizer.append_clusters(clusters, sample_4d)
visualizer.show(pair_filter=[[0, 1], [0, 2]])
pair_filter
指定应显示哪些功能。在上面的示例中,它将仅显示 (x0, x1)
- [0, 1]
和 (x0, x2)
- [0, 2]
.
因此,在您只需要显示前两个功能的特定情况下,它应该是:
visualizer = cluster_visualizer_multidim()
visualizer.append_clusters(clusters, sample)
visualizer.show(pair_filter=[[0, 1]])
我认为我必须使错误更具可读性,并建议在第一句话中使用另一个类。让我知道它是否有帮助(如果它仍然与您相关)。
关于python - pyclustering 当矩阵具有三个以上的维度时可视化 xmeans,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64776260/