DBSCAN Silhouette Coefficients:这个 for-loop 有效吗?

DBSCAN Silhouette Coefficients: does this for-loop work?

我正在尝试将我的同学 Silhouette Score 计算结果与我的进行比较,但我在思考他们的 for 循环时遇到了一些问题。我不是在寻找免费赠品,我们已经提交了以下内容进行评分,只是想了解这里发生了什么以供将来参考。

问题:

Using DBSCAN iterate (for-loop) through different values of min_samples (1 to 10) and epsilon (.05 to .5, in steps of .01) to find clusters in the road-data used in the Lesson and calculate the Silohouette Coeff for min_samples and epsilon.

道路数据:

             osm         lat          lon         alt
0      144552912    9.349849    56.740876   17.052772
1      144552912    9.350188    56.740679   17.614840
2      144552912    9.350549    56.740544   18.083536
...
434873  93323209    9.943451    57.496270   24.635285

434874 rows × 4 columns

(更新编辑)归一化:

#Normalize sample from dataset
XX = X.copy()
XX['alt'] = (X.alt - X.alt.mean())/X.alt.std()
XX['lat'] = (X.lat - X.lat.mean())/X.lat.std()
XX['lon'] = (X.lon - X.lon.mean())/X.lon.std()

同学循环:

start   = 0.0
stop    = 0.45
step    = 0.01
my_list = np.arange(start, stop+step, step)

startb   = 1
stopb    = 10
stepb    = .2 # To scale proportionately with epsilon increments
my_listb = np.arange(startb, stopb+stepb, stepb)

my_range = range(45)

one = []

for i in tqdm(my_range):
   dbscan = DBSCAN(eps = .05 + my_list[i] , min_samples = 1 + my_listb[i])
   XX.cluster = dbscan.fit_predict(XX[['lat','lon']])
   one.append(metrics.silhouette_score(XX[['lat', 'lon']], XX.cluster))

我的循环:

(我将解决方案分成 10 个循环,每个循环一个 min_sample (1-10)。示例如下。)

#eps loop 0.05 to 0.5 (steps 0.01) min_samples=1

eps_range = [x / 100.0 for x in range(5,51,1)]
eps_scores_1 = []
for e in tqdm(eps_range):
dbscan = DBSCAN(eps=e, min_samples=1)
labels = dbscan.fit_predict(XX[['lon', 'lat', 'alt']])
eps_scores_1.append(metrics.silhouette_score(XX[['lon', 'lat', 'alt']],labels))

-

#eps loop 0.05 to 0.5 (steps 0.01) min_samples=2

eps_range = [x / 100.0 for x in range(5,51,1)]
eps_scores_2 = []
for e in tqdm(eps_range):
dbscan = DBSCAN(eps=e, min_samples=2)
labels = dbscan.fit_predict(XX[['lon', 'lat', 'alt']])
eps_scores_2.append(metrics.silhouette_score(XX[['lon', 'lat', 'alt']],labels))

我观察到的差异:

  1. 同学没有在他们的 for 循环中包含 'alt'。
  2. 同学尝试了某种嵌套循环?
  3. 同学的范围是45,不知道对不对
  4. 同学的my_list写错了?
  5. 同学的最高剪影分数比我高很多
  6. (未显示) 同学用了10000个随机样本,我用了30000个随机样本

该问题要求 minors 和 epsilon 都不同 - 它需要一个 nested 循环。你同学用的是单循环,没有考虑组合。您通过复制和粘贴完成了外循环。

你同学用一个很误导人的方式来管理范围,因为他后面分别加0.05和1!

您不能只混合使用纬度、经度和高度。他们有不同的单位。事实上,你甚至不应该因为失真而混合纬度和经度 - 请改用 Haversine 距离!

Silhouette 假定为凸簇,但 DBSCAN 不生成凸簇。

sklearn 实现可能像对待集群一样对待噪声,这通常会产生更差的结果。但是 Silhouette 并不是真的要与噪声标签一起使用...