龍龖龘龖龍 2023-12-26 22:25 采纳率: 0%
浏览 7
已结题

python,直线聚类

下图这个是直线检测后,将所有直线延长后的结果,现在想使用聚类算法,将竖着的直线聚类为两个簇,将横着的直线也聚类为两个簇

img


但是使用k-means方法时,发现聚类时将本来应该分到右边一簇的直线分到了左侧,导致左侧计算合并直线时,受到了右边直线的影响。
不知道各位有什么好的解决方法。
目前查k-means方法时,发现使用的是平均值作为簇的质心,想用中位数尝试一下,找到了k-median方法,但是不知道代码怎么改

  • 写回答

6条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2023-12-26 22:26
    关注

    引自微信小程序:皆我百晓生

    为了实现直线聚类,可以使用DBSCAN(Density-Based Spatial Clustering of Applications with Noise)算法。DBSCAN是一种基于密度的聚类算法,可以将数据点分为高密度区域(簇)和低密度区域(噪声)。

    以下是使用Python的scikit-learn库实现直线聚类的示例代码:

    import numpy as np
    from sklearn.cluster import DBSCAN
    from sklearn.preprocessing import StandardScaler
    
    # 原始直线数据
    lines = [0, 50, 100, 150, 200, 250, 300, 350, 0, 50, 100, 150, 200]
    
    # 将直线数据重塑为二维数组
    lines = np.array(lines).reshape(-1, 1)
    
    # 标准化数据
    scaler = StandardScaler()
    lines = scaler.fit_transform(lines)
    
    # 创建DBSCAN对象
    dbscan = DBSCAN(eps=0.5, min_samples=2)
    
    # 进行聚类
    clusters = dbscan.fit_predict(lines)
    
    # 输出每个直线所属的簇
    print('Cluster labels:')
    for line, cluster in zip(lines, clusters):
        print(f'{line[0]:>5.1f} -> Cluster {cluster}');
    

    这里使用了StandardScaler对直线数据进行标准化,以确保不同直线之间具有相似的尺度。然后使用DBSCAN进行聚类,其中eps参数是邻域的半径,min_samples参数是邻域中要包含的最小样本数。根据实际情况,你可以根据需求调整这两个参数的值。

    运行以上代码后,将得到每个直线所属的聚类簇的标签。

    注意:以上代码假设直线数据按照顺序排列,并且已经处理了一些异常点。如果数据存在噪声或者直线顺序混乱,可能需要先进行预处理或者调整算法参数以获得最佳结果。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 12月27日
  • 修改了问题 12月26日
  • 创建了问题 12月26日

悬赏问题

  • ¥15 Windows Script Host 无法找到脚本文件"C:\ProgramData\Player800\Cotrl.vbs”
  • ¥15 matlab自定义损失函数
  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图