我必须将聚类算法应用于数据集的列

问题描述 投票:-1回答:1

我必须将以下内容应用于数据集DF的列聚类算法https://scikit-learn.org/stable/modules/generated/sklearn.cluster.DBSCAN.html我能怎么做?谢谢

我编写了这段代码,但是当我发送它并使用完整的数据集运行时,输出为“ MEMORYERROR”

from sklearn.cluster import DBSCAN
from sklearn import metrics
import sklearn.utils
from sklearn.preprocessing import StandardScaler
#sklearn.utils.check_random_state(1000)
Clus_dataSet = df[['pickup_dt','pickup_lat', 'pickup_lon']]
Clus_dataSet = numpy.nan_to_num(Clus_dataSet)
Clus_dataSet = StandardScaler().fit_transform(Clus_dataSet)

# Compute DBSCAN
db = DBSCAN(eps=2, min_samples=2, metric='euclidean').fit(Clus_dataSet)
core_samples_mask = numpy.zeros_like(db.labels_, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True
labels = db.labels_

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

print('Estimated number of clusters: %d' % n_clusters_)
print('Estimated number of noise points: %d' % n_noise_)

# Plot result
import matplotlib.pyplot as plt

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

    class_member_mask = (labels == k)

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

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

plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.show()
python-3.x dbscan
1个回答
0
投票
Clus_dataSet = df[['pickup_dt','pickup_lat', 'pickup_lon']]
Clus_dataSet = numpy.nan_to_num(Clus_dataSet)
Clus_dataSet = StandardScaler().fit_transform(Clus_dataSet) 

对我来说,这听起来像是一个非常糟糕的主意。纬度和经度不得标准化。同样,仅将其与日期时间混合可能会导致一个相对于另一个的不期望的偏差。相反,您将要使用具有two阈值的通用DBSCAN。一个时间阈值,一个在Haversine坐标距离上。因为地球不是平坦的,所以如果对它进行标准化,则甚至在向东移动与向北移动时,其缩放比例也会有所不同。这没有什么意义,对吧?

此外,对于我来说,ε似乎很大,而选择的最小样本太小(在2,DBSCAN通过单链接聚类成为平坦的切片)。

关于可伸缩性,DBSCAN的sklearn实现differs与原始DBSCAN的不同之处在于,它使用了更多的内存,特别是当半径设置太高时。然后sklearn最多可以使用O(n²)内存。您可能想尝试使用OPTICS实现(实际上应该仅使用O(n)内存),或使用其他DBSCAN实现,例如ELKI中的实现。

© www.soinside.com 2019 - 2024. All rights reserved.