如何在DBSCAN中使用动态espilon?

2024-05-15 06:08:21 发布

您现在位置:Python中文网/ 问答频道 /正文

今天我正在处理来自Kagglehttps://www.kaggle.com/c/house-prices-advanced-regression-techniques/data的数据集。我想将我的数据集按床、浴室、邻居进行细分,并使用DBSCAN在每个细分中按价格进行聚类。问题是因为每个片段都是不同的,我不想对我的所有数据集使用相同的epsilon,但是对于每个片段,最好的epsilon,你知道一种有效的方法吗

from sklearn.cluster import DBSCAN
import sklearn.utils
from sklearn.preprocessing import StandardScaler
sklearn.utils.check_random_state(1000)
Clus_dataSet = pdf[['beds','baths','neighborhood','price']]
Clus_dataSet = np.nan_to_num(Clus_dataSet)
Clus_dataSet = StandardScaler().fit_transform(Clus_dataSet)

# Compute DBSCAN
db = DBSCAN(eps=0.3, min_samples=6).fit(Clus_dataSet)
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True
labels = db.labels_
pdf["Clus_Db"]=labels

realClusterNum=len(set(labels)) - (1 if -1 in labels else 0)
clusterNum = len(set(labels)) 

多谢各位


Tags: 数据fromcoreimportdblabelsutilssklearn
1条回答
网友
1楼 · 发布于 2024-05-15 06:08:21

提出了一种设置Epsilon和MinPts参数的启发式方法in the original DBSCAN paper

一旦设置了MinPts值(例如2∗ 特征数)分区结果强烈依赖于Epsilon。启发式建议通过视觉分析k-dist图来推断ε

下面是一个具有两个高斯分布的程序示例

from sklearn.neighbors import NearestNeighbors
from matplotlib import pyplot as plt
from sklearn.datasets import make_biclusters
data,lab,_ = make_biclusters((200,2), 2, noise=0.1, minval=0, maxval=1)
minpts = 4
nbrs = NearestNeighbors(n_neighbors=minpts, algorithm='ball_tree').fit(data) 
distances, indices = nbrs.kneighbors(data)
k_dist = [x[-1] for x in distances]
f,ax = plt.subplots(1,2,figsize = (10,5))
ax[0].set_title('k-dist plot for k = minpts = 4') 
ax[0].plot(sorted(k_dist))
ax[0].set_xlabel('object index after sorting by k-distance')
ax[0].set_ylabel('k-distance')
ax[1].set_title('original data')
ax[1].scatter(data[:,0],data[:,1],c = lab[0])

在生成的k-dist图中,“弯头”从理论上将噪声对象与簇对象分开,并且确实给出了ε值的合理范围的指示(根据数据集结合所选的MinPts值进行定制)。在这个玩具示例中,我会说介于0.05和0.075之间

k-dist

相关问题 更多 >

    热门问题