如何获取 DBSCAN 的结果参考 http://scikit-learn.org/ 的例子

How to get result of DBSCAN refer to example from http://scikit-learn.org/

参考这个使用DBSCAN的例子,聚类过程的真实数据输入是'X'。但是在 example 之后,我使用 'X1' 来构建聚类模型。

# -*- coding: utf-8 -*-
"""
===================================
Demo of DBSCAN clustering algorithm
===================================

Finds core samples of high density and expands clusters from them.

"""
#print(__doc__)

import numpy as np

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


# Generate sample data
centers = [[1, 1], [-1, -1], [1, -1]]
X=[(9,0),(7,8),(8,6),(1,2),(1,3),(7,6),(10,14)]

X1 = StandardScaler().fit_transform(X)
##############################################################################
# Compute DBSCAN
db = DBSCAN(eps=0.3, min_samples=10).fit(X1)
core_samples_mask = np.zeros_like(db.labels_, dtype=bool) # bikin matriks      False ukuran matriks db.labels

core_samples_mask[db.core_sample_indices_] = True # bikin matriks, kalau indexnya ada di matriks db, maka true
labels = db.labels_

print "cluster: ", set(labels)

# Number of clusters in labels, ignoring noise if present.
n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)

在这种情况下,我想获得噪音成员,所以我打印 xy if k=-1. 不幸的是,xy 是指 X1 而不是真实数据 X

# Plot result
import matplotlib.pyplot as plt

# 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):
   class_member_mask = (labels == k)
   if k == -1:
   # Black used for noise.
       xy = X1[class_member_mask]
       print "Noise :", xy
   else:
       xy = X1[class_member_mask & core_samples_mask]

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

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

plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.show()

当我尝试将 X1 替换为 'X' 时,出现错误。

xy = X[class_member_mask]

错误:

xy=X[class_member_mask&~core_samples_mask] TypeError: only integer arrays with one element can be converted to an index

可能是因为格式 X1X 不同。我想如果我知道如何将 X 格式转换为 X1

就会解​​决
X=[(9,0),(7,8),(8,6),(1,2),(1,3),(7,6),(10,14)]
X1=[[ 0.8406627  -1.30435512]
   [ 0.25219881  0.56856505]
   [ 0.54643076  0.10033501]
   [-1.51319287 -0.83612508]
   [-1.51319287 -0.60201006]
   [ 0.25219881  0.10033501]
   [ 1.13489465  1.97325518]]  

帮帮我,给点建议...

X1转换为numpy数组:

X1=[[ 0.8406627,  -1.30435512],
   [ 0.25219881,  0.56856505],
   [ 0.54643076,  0.10033501],
   [-1.51319287, -0.83612508],
   [-1.51319287, -0.60201006],
   [ 0.25219881,  0.10033501],
   [ 1.13489465,  1.97325518]]

X1 =  np.asarray(X1)