質問

私はいくつかのクラスタリングをしました、そして、私は結果を視覚化したいと思います。

クラスターをプロットするために書いた関数は次のとおりです。

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でクラスターをプロットする最良の方法は何ですか?

役に立ちましたか?

解決

投稿したコードを実行すると、プロットに3つのポイントが表示されます。

clusters

(0、4)の「ポイント」は X[1] (0、5)の「ポイント」は実際には3ポイントで、 X[0], X[2], 、 と X[3]. 。 (5、5)のポイントはあなたの最後のポイントです X 配列。 (0、4)および(0、5)のデータは1つのクラスターに属し、(5、5)のポイントはノイズと見なされます(黒でプロット)。

ここでの問題は、あなたが実行しようとしているということです DBSCAN 5ポイントを含むデータセットのアルゴリズム、クラスターごとに少なくとも4ポイントが必要です( DBSCAN コンストラクタ)。の中に sklearn たとえば、クラスタリングアルゴリズムは、3つの異なるセンターを備えた750ポイントを含むデータセットで実行されます。大きいものを作成してみてください X データセットとこのコードを再度実行します。

また、削除したいかもしれません plt.ylim([0,10])plt.xlim([0,10]) コードからの行。彼らは、プロットの端にあるポイントを見ることを少し難しくしています!省略した場合 ylimxlim それから matplotlib プロットの制限を自動的に決定します。

ライセンス: CC-BY-SA帰属
所属していません datascience.stackexchange
scroll top