【问题标题】:DBSCAN Silhouette Coefficients: does this for-loop work?DBSCAN 轮廓系数:这个 for 循环有效吗?
【发布时间】:2019-04-04 04:40:19
【问题描述】:

我正在尝试将我的同学剪影分数计算的结果与我的结果进行比较,并且在围绕他们的 for 循环时遇到了一些麻烦。我不是在寻找免费赠品,我们已经提交了下面的评分,只是想了解这里发生了什么以供将来参考。

问题:

使用 DBSCAN 迭代(for-loop)通过 min_samples(1 到 10)和 epsilon(0.05 到 .5,步长为 0.01)的不同值来查找课程中使用的道路数据中的集群并计算min_samples 和 epsilon 的 Silohouette 系数。

道路数据:

             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个随机样本。

【问题讨论】:

    标签: python for-loop machine-learning cluster-analysis dbscan


    【解决方案1】:

    该问题要求对未成年人和 epsilon 进行更改 - 它要求 嵌套 循环。你的同学用了一个循环,没有考虑组合。您通过复制和粘贴完成了外循环。

    你的同学使用了一种非常误导的方式来管理范围,因为他分别在 1 之后分别加了 0.05!

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

    Silhouette 假设凸簇,但 DBSCAN 不生成凸簇。

    sklearn 实现可能会将噪声视为集群,这通常会产生更差的结果。但是剪影并不是真的要与噪声标签一起使用......

    【讨论】:

    • 我很抱歉,我应该分享的,我们确实标准化了我们的数据。 #从数据集中标准化样本 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()
    • 我无法完全理解构建嵌套循环。我的长期做法是正确的,是吗?
    • 归一化纬度、经度和高度是一个更糟糕的主意。数据具有物理意义,您现在已销毁...
    • 当你有噪声点时,sklearn 的剪影函数应该不会给出正确的结果。您将拥有的。
    • 谢谢你的回复,更糟糕的想法相对于?我不跟着你。你说的还是有道理的。规范化确实会降低外部效度!对于您的第二条评论,您能否向我提供有关您的断言的更多细节?我相信您可以在我在问题中概述的工作空间中看到,我是一名有兴趣理解“为什么”而不是“只是错误”的学生。
    猜你喜欢
    • 2015-05-07
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多