我在尝试比较同学们的轮廓分数计算结果与我的结果时,遇到了理解他们for循环的困难。我不是在寻求免费的帮助,我们已经提交了下面的内容进行评分,只是为了将来参考,想理解这里发生了什么。
问题是:
使用DBSCAN,通过for循环迭代不同的min_samples值(从1到10)和epsilon值(从0.05到0.5,步长为0.01),在课程中使用的道路数据中寻找聚类,并计算min_samples和epsilon的轮廓系数。
道路数据:
osm lat lon alt0 144552912 9.349849 56.740876 17.0527721 144552912 9.350188 56.740679 17.6148402 144552912 9.350549 56.740544 18.083536...434873 93323209 9.943451 57.496270 24.635285434874 rows × 4 columns
(更新编辑) 归一化:
#Normalize sample from datasetXX = 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.0stop = 0.45step = 0.01my_list = np.arange(start, stop+step, step)startb = 1stopb = 10stepb = .2 # To scale proportionately with epsilon incrementsmy_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=1eps_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=2eps_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))
我观察到的差异包括:
- 同学在他们的for循环中没有包括’alt’。
- 同学尝试了某种嵌套循环?
- 同学的范围是45,我不确定这是否正确。
- 同学的
my_list
使用了不正确的表示法? - 同学的最大轮廓分数比我的高很多。
- (未显示) 同学使用了10,000个随机样本,我使用了30,000个随机样本。
回答:
问题要求同时变化min_samples和epsilon – 它需要一个嵌套循环。你的同学使用了一个单一循环,并且没有考虑组合。你通过复制粘贴完成了外部循环。
你的同学使用了一种非常误导的方式来管理范围,因为他后来分别加了0.05和1!
你不能简单地混合使用纬度、经度和高度。它们有不同的单位。实际上,你甚至不应该混合使用纬度和经度,因为有失真 – 应该使用哈弗赛恩距离!
轮廓系数假设聚类是凸形的,但DBSCAN并不生成凸形聚类。
sklearn的实现可能将噪声视为一个聚类,这通常会导致更差的结果。但轮廓系数并不真正适用于噪声标签…