【问题标题】:pyclustering visualising xmeans when the matrix has more than three dimensions当矩阵具有三个以上维度时,pyclustering 可视化 xmeans
【发布时间】:2021-02-22 19:48:54
【问题描述】:

我正在尝试使用 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 也会发生。

【问题讨论】:

    标签: python plot cluster-analysis k-means xmeans


    【解决方案1】:

    与你得到的错误一致:

    只能显示尺寸为 1(1D 图)、2(2D 图)或 3(3D 图)的对象。对于多维数据,请使用“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 &gt; 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]])
    

    我认为我必须使错误更具可读性,并建议在第一句话中使用另一个类。让我知道它是否有帮助(如果它仍然与您相关)。

    【讨论】:

    • 多谢回复,还是有关系的。我认为只有当我想绘制 3 个或更多特征时才必须使用 multidim。
    • 您知道引发异常的可能原因是什么?
    • @GerardoZinno,两种不同的实现。我已经将cluster_visualizer 实现为某种自然可视化(1-3 维数据),cluster_visualizer_multidim 用于所有其他情况。从用户的角度来看,区别在于 3 维数据的表示(cluster_visualizer 使用单个图来显示它(x0, x1, x2)cluster_visualizer_multidim 使用三个图 (x0, x1), (x0, x2) and (x1, x2))。您希望看到cluster_visualizer 更通用吗?我可以为下一个版本更新它。
    • 是的,cluster_visualizer_multidim 还不支持numpy,下个版本0.11.0 会支持。只需按以下方式将您的输入数据转换为列表visualizer.append_clusters(clusters, X.tolist())
    • 谢谢,现在绘图不会引发异常并且可以正常工作。但是我需要将 X.tolist() 传递给 kmeans_plusplus_initializerxmeans 吗?现在我将 X 传递给他们,这是一个 numpy ndarray 并且没有引发异常
    猜你喜欢
    • 2014-03-24
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多