如何在 scikit-learn (sklearn) 中绘制/可视化集群?

数据挖掘 Python scikit-学习 聚类 数据库扫描
2021-10-10 03:31:27

我做了一些聚类,我想可视化结果。

这是我为绘制集群而编写的函数:

import sklearn
from sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.preprocessing import StandardScaler

from sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.datasets.samples_generator import make_blobs
from sklearn.preprocessing import StandardScaler


def plot_cluster(cluster, sample_matrix):
    '''Input:  "cluster", which is an object from DBSCAN, 
       e.g. dbscan_object = DBSCAN(3.0,4)
"sample_matrix" which is a data matrix:  
X = [
    [0,5,1,2],
    [0,4,1,3],
    [0,5,1,3],
    [0,5,0,2],
    [5,5,5,5],
    ]
        Output: Plots the clusters nicely.    
    '''
    import matplotlib.pyplot as plt
    import numpy as np

    f = lambda row: [float(x) for x in row]

    sample_matrix = map(f,sample_matrix)
    print sample_matrix
    sample_matrix = StandardScaler().fit_transform(sample_matrix)

    core_samples_mask = np.zeros_like(cluster.labels_, dtype=bool)
    core_samples_mask[cluster.core_sample_indices_] = True
    labels = cluster.labels_

    # Black removed and is used for noise instead.
    unique_labels = set(labels)
    colors = plt.cm.Spectral(np.linspace(0, 1, len(unique_labels)))
    for k, col in zip(unique_labels, colors):
        if k == -1:
            # Black used for noise.
            col = 'k'

        class_member_mask = (labels == k)  # generator comprehension 
        # X is your data matrix
        X = np.array(sample_matrix)

        xy = X[class_member_mask & core_samples_mask]

        plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col,
                 markeredgecolor='k', markersize=14)

        xy = X[class_member_mask & ~core_samples_mask]
        plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col,
                 markeredgecolor='k', markersize=6)

    plt.ylim([0,10]) 
    plt.xlim([0,10])    
#        plt.title('Estimated number of clusters: %d' % n_clusters_)
    plt.savefig('cluster.png')

上面的函数几乎是从此处的 scikit-learn 演示中逐字复制的

然而,当我尝试以下方法时:

dbscan_object = DBSCAN(3.0,4)

X = [
    [0,5,1,2],
    [0,4,1,3],
    [0,5,1,3],
    [0,5,0,2],
    [5,5,5,5],
    ]

result = dbscan_object.fit(X)
print result.labels_

print 'plotting '
plot_cluster(result, X)

...它产生一个点。在 python 中绘制集群的最佳方法是什么?

1个回答

当我运行您发布的代码时,我的情节得到了三点:

集群

(0, 4) 处X[1]的“点”对应于,(0, 5) 处的“点”实际上是三个点,分别对应于X[0]X[2]X[3](5, 5) 处的点是X数组中的最后一个点。(0, 4) 和 (0, 5) 处的数据属于一个簇,并且 (5, 5) 处的点被认为是噪声(以黑色绘制)。

这里的问题似乎是您试图在DBSCAN包含 5 个点的数据集上运行算法,每个集群至少需要 4 个点(DBSCAN构造函数的第二个参数)。sklearn示例中,聚类算法在包含 750 个具有三个不同中心的点的数据集上运行。尝试创建更大的X数据集并再次运行此代码。

您可能还想从代码中删除plt.ylim([0,10])plt.xlim([0,10])行;他们让看情节边缘的点有点困难!如果省略ylimand xlimthenmatplotlib将自动确定绘图限制。