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))
我观察到的差异:
- 同学没有在他们的 for 循环中包含 'alt'。
- 同学尝试了某种嵌套循环?
- 同学的范围是45,不知道对不对
- 同学的
my_list
写错了?
- 同学的最高剪影分数比我高很多
- (未显示) 同学用了10000个随机样本,我用了30000个随机样本
该问题要求 minors 和 epsilon 都不同 - 它需要一个 nested 循环。你同学用的是单循环,没有考虑组合。您通过复制和粘贴完成了外循环。
你同学用一个很误导人的方式来管理范围,因为他后面分别加0.05和1!
您不能只混合使用纬度、经度和高度。他们有不同的单位。事实上,你甚至不应该因为失真而混合纬度和经度 - 请改用 Haversine 距离!
Silhouette 假定为凸簇,但 DBSCAN 不生成凸簇。
sklearn 实现可能像对待集群一样对待噪声,这通常会产生更差的结果。但是 Silhouette 并不是真的要与噪声标签一起使用...
我正在尝试将我的同学 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))
我观察到的差异:
- 同学没有在他们的 for 循环中包含 'alt'。
- 同学尝试了某种嵌套循环?
- 同学的范围是45,不知道对不对
- 同学的
my_list
写错了? - 同学的最高剪影分数比我高很多
- (未显示) 同学用了10000个随机样本,我用了30000个随机样本
该问题要求 minors 和 epsilon 都不同 - 它需要一个 nested 循环。你同学用的是单循环,没有考虑组合。您通过复制和粘贴完成了外循环。
你同学用一个很误导人的方式来管理范围,因为他后面分别加0.05和1!
您不能只混合使用纬度、经度和高度。他们有不同的单位。事实上,你甚至不应该因为失真而混合纬度和经度 - 请改用 Haversine 距离!
Silhouette 假定为凸簇,但 DBSCAN 不生成凸簇。
sklearn 实现可能像对待集群一样对待噪声,这通常会产生更差的结果。但是 Silhouette 并不是真的要与噪声标签一起使用...