Scikit-Learn(Sklearn)でクラスターをプロット/視覚化する方法は?
-
16-10-2019 - |
質問
私はいくつかのクラスタリングをしました、そして、私は結果を視覚化したいと思います。
クラスターをプロットするために書いた関数は次のとおりです。
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つのポイントが表示されます。
(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])
コードからの行。彼らは、プロットの端にあるポイントを見ることを少し難しくしています!省略した場合 ylim
と xlim
それから matplotlib
プロットの制限を自動的に決定します。