贪心聚类算法速度提升

2024-04-23

我正在尝试在 python 中实现一个非常简单的贪婪聚类算法,但很难优化它的速度。该算法将采用距离矩阵,找到具有最多小于预定距离截止值的分量的列,并将行索引(具有小于截止值的分量)存储为簇的成员。簇的质心是列索引。然后,从距离矩阵中删除每个成员索引的列和行(产生一个较小但仍为方阵的矩阵),并且该算法会依次迭代较小的距离矩阵,直到找到所有簇。因为每次迭代都依赖于最后一次(形成一个新的距离矩阵,以便集群之间没有重叠的成员),所以我认为我无法避免 python 中的缓慢 for 循环。我尝试过 numba (jit) 来加速它,但我认为它正在恢复到 python 模式,因此不会导致任何速度增益。下面是该算法的两种实现。第一个比后者慢。任何关于加速的建议都是非常受欢迎的。我知道 scipy 或 sklearn 中实现的其他聚类算法(例如 DBSCAN、kmeans/medoids 等),但我非常热衷于在我的应用程序中使用当前的算法。在此先感谢您的任何建议。

方法 1(较慢):

def cluster(distance_matrix, cutoff=1):
    indices = np.arange(0, len(distance_matrix))
    boolean_distance_matrix = distance_matrix <= cutoff
    centroids = []
    members = []
    while boolean_distance_matrix.any():
        centroid = np.argmax(np.sum(boolean_distance_matrix, axis=0))
        mem_indices = boolean_distance_matrix[:, centroid]
        mems = indices[mem_indices]
        boolean_distance_matrix[mems, :] = False
        boolean_distance_matrix[:, mems] = False
        centroids.append(centroid)
        members.append(mems)
    return members, centroids

方法 2(更快,但对于大矩阵仍然很慢):

它以 sklearn 最近邻实现形成的邻接(稀疏)矩阵作为输入。这是我能想到的获取聚类相关距离矩阵的最简单、最快的方法。我相信使用稀疏矩阵也可以加快聚类算法的速度。

nbrs = NearestNeighbors(metric='euclidean', radius=1.5, 
algorithm='kd_tree')            
nbrs.fit(data)    
adjacency_matrix = nbrs.radius_neighbors_graph(data)   

def cluster(adjacency_matrix, gt=1):
    rows = adjacency_matrix.nonzero()[0]
    cols = adjacency_matrix.nonzero()[1]
    members = []
    member = np.ones(len(range(gt+1)))
    centroids = []
    appendc = centroids.append
    appendm = members.append
    while len(member) > gt:
        un, coun = np.unique(cols, return_counts=True)
        centroid = un[np.argmax(coun)]
        appendc(centroid)
        member = rows[cols == centroid]
        appendm(member)
        cols = cols[np.in1d(rows, member, invert=True)]
        rows = rows[np.in1d(rows, member, invert=True)]
    return members, centroids  

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

贪心聚类算法速度提升 的相关文章

  • Java 11 中使用堆栈跟踪的速度明显慢于 Java 8

    我正在比较 JDK 8 和 11 的性能jmh https openjdk java net projects code tools jmh 1 21 当我遇到一些令人惊讶的数字时 Java version 1 8 0 192 vendor
  • Django 管理员在模型编辑时间歇性返回 404

    我们使用 Django Admin 来维护导出到我们的一些站点的一些数据 有时 当单击标准更改列表视图来获取模型编辑表单而不是路由到正确的页面时 我们会得到 Django 404 页面 模板 它是偶尔发生的 我们可以通过重新加载三次来重现它
  • 为 Anaconda Python 安装 psycopg2

    我有 Anaconda Python 3 4 但是每当我运行旧代码时 我都会通过输入 source activate python2 切换到 Anaconda Python 2 7 我的问题是我为 Anaconda Python 3 4 安
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • Python - StatsModels、OLS 置信区间

    在 Statsmodels 中 我可以使用以下方法拟合我的模型 import statsmodels api as sm X np array 22000 13400 47600 7400 12000 32000 28000 31000 6
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • Spark KMeans 无法处理大数据吗?

    KMeans 有几个参数training http spark apache org docs latest api python pyspark mllib html highlight kmeans pyspark mllib clus
  • Draggable JS Bootstrap 模式 - 性能问题

    对于工作中的项目 我们在 JavaScript 中使用 Bootstrap Modal 窗口 我们想让一些窗口可移动 但我们遇到了 JQuery 的性能问题 myModal draggable handle modal header Exa
  • BeautifulSoup 中的嵌套标签 - Python

    我在网站和 stackoverflow 上查看了许多示例 但找不到解决我的问题的通用解决方案 我正在处理一个非常混乱的网站 我想抓取一些数据 标记看起来像这样 table tbody tr tr tr td td td table tr t
  • IO 密集型任务中的 Python 多线程

    建议仅在 IO 密集型任务中使用 Python 多线程 因为 Python 有一个全局解释器锁 GIL 只允许一个线程持有 Python 解释器的控制权 然而 多线程对于 IO 密集型操作有意义吗 https stackoverflow c
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 使用其构造函数初始化 OrderedDict 以便保留初始数据的顺序的正确方法?

    初始化有序字典 OD 以使其保留初始数据的顺序的正确方法是什么 from collections import OrderedDict Obviously wrong because regular dict loses order d O
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P
  • 导入错误:没有名为 site 的模块 - mac

    我已经有这个问题几个月了 每次我想获取一个新的 python 包并使用它时 我都会在终端中收到此错误 ImportError No module named site 我不知道为什么会出现这个错误 实际上 我无法使用任何新软件包 因为每次我
  • 如何将输入读取为数字?

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 Why are x and y下面的代码中使用字符串而不是整数 注意 在Python 2
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐

  • Delphi XE 和使用 OnKeyDown 捕获箭头键

    我希望我的表单能够处理箭头键 而且我可以做到 只要表单上没有按钮 为什么是这样 关键消息由接收这些消息的控件本身进行处理 这就是为什么当您使用按钮时表单不会接收消息 因此 通常您必须对这些控件进行子类化 但 VCL 足够友好地询问父子表单如
  • 为什么在处理.org java pdf 导出时只显示一个框?

    下面是我的代码 在运行时它显示了我想要的多个框 但是当我尝试导出时 它只在该帧位置显示一个框 我尝试在特定帧生成输出 但它有同样的问题 import processing pdf int ofs 500 boolean record voi
  • 每个域都有唯一的 IP 吗?

    我想知道每个域名地址是否都有唯一的IP地址 此外 这些IP位于哪里 这个重定向系统是如何工作的 当我们尝试通过写入域名来访问网站时 它有多少个重定向 谢谢 否 每个域没有自己的 IP 地址 多个域可以托管在同一台服务器上 并且位于同一 IP
  • 参数类型 Observable 不可分配给 User[] 类型的参数

    我正在努力适应material https material angular io components table overview示例如下 import Component from angular core import MatTab
  • 如何在子进程期间和之后执行操作

    我有一个调用子程序的程序 当子程序使用 Popen 运行时 我需要禁用运行按钮并启用停止按钮 但是 由于Popen打开了一个新进程 因此程序完成后应该打印的内容会立即打印出来 我尝试添加self p communicate after Po
  • 跨浏览器的 CSS 行高问题

    我有一些 CSS line height 18px 的按钮控件 有些是输入控件 type button 另一些是样式化为像输入控件一样显示为按钮的锚点 在 FF3 6 12 IE8 中 它们显示相同的高度 但在 IE7 中 锚点的高度较短
  • Android 在检查并请求权限后继续

    我知道关于检查和请求许可以及处理他们的回复有很多问题得到解答 我对此很清楚 但我有点困惑的是 如果我们正在检查两个不同事物的相同权限 那么在授予权限后我们如何继续任务 例如 我有 recycleView 在我的适配器中我有两个按钮的代码 一
  • Xcode 9/Swift 4 AVCaptureMetadataOutput setMetadataObjectTypes 使用 availableMetadataObjectTypes

    似乎有很多与我遇到的问题类似的问题 AVmetadata 随着 swift 4 xcode 9 的变化 https stackoverflow com questions 46286332 avmetadata changes with s
  • 如何修改之前的 git 提交

    我已经做了 2 次 git 提交 git log commit 9613e1e84b42aeef645977272d310250339cf0e0 commit 01f8699be310f9a56a40835b48a922a879bba24f
  • android - Geocoder.getFromLocationName() 在 ICS 设备中不起作用

    我有两个设备 一是HTC 野火 S另一个是HTC 1V 我用的是Geocoder getFromLocationName 在我的应用程序中 已经成功运行在HTC 野火 S 但在HTC 1V我收到以下错误 为什么它来了 我该如何解决这个问题
  • 即使没有消费者,消费者群体仍陷入“再平衡”

    我正在使用kafka版本2 4 1 最近从2 2 0升级到2 4 1 并注意到一个奇怪的问题 即使应用程序 kafka Streams 已关闭 没有正在运行的应用程序 但消费者组命令返回状态为重新平衡 我们的应用程序作为 kubernete
  • 猫头鹰旋转木马键盘导航

    我正在寻找向 Owl Carousel 插件添加键盘导航 原始 jQuery 插件的 Github 有一个关于此主题的线程here https github com OwlFonk OwlCarousel issues 65 所以我尝试了以
  • Sphinx 文档中人类可读的迭代

    Sphinx autodoc 扁平化字典 列表和元组 使得长的几乎难以阅读 漂亮的打印格式也并不总是需要的 因为一些嵌套容器最好保持扁平化而不是列化 有没有办法显示可迭代对象as typed在源代码中 直接从源获取它 并添加一个 rst其命
  • 在事件处理程序中获取表单元素

    我想添加一个onSubmit事件所有的HTML Forms验证提交文件大小并阻止其提交javascript 问题是我没有id of the form 也没有那些file input element 现在 我怎样才能获得所需的值input 可
  • Prolog 同构图

    这里尝试解决同构图问题 作业信息 判断2个无向图是否同构 没有孤立的顶点 顶点数小于30 图的边作为谓词给出 即 e 1 2 f 1 2 我正在尝试使用以下方法 对于每对边 即图 1 和图 2 中的每条边 Try to bind the v
  • PHP 标头重定向 301 - 有何影响?

    I have example com 如果用户登录 它应该自动加载example com option X其中 X 是用户的预定义选择 所以 我在顶部这样做index php header Location option X 但是 如果用户
  • 将字符串转换为带时区的日期

    我有日期字符串2017 01 03T10 45 00 000 02 00我需要将其转移到类似的东西2017 01 03 10 45 00 0200 let formatter DateFormatter formatter dateForm
  • 查找 AAR 依赖项

    我正在使用编译成 AAR 文件的第 3 方 SDK 我想使用此 AAR 为 Xamarin 创建绑定库 如何找到此 AAR 使用的依赖项 如果我使用 Java 反编译器 我可以看到许多类都有针对第 3 方 SDK 的导入语句 因此我 有时
  • ruby on Rails 3.1 将 .swf 移动到资产管道?

    是否可以将 SWF 文件移动到资源管道中 如果可以 如何做到这一点 我建议将它们放在一个名为的文件夹中app assets flash 将此文件夹添加到您的资源路径中 config assets paths lt lt Rails root
  • 贪心聚类算法速度提升

    我正在尝试在 python 中实现一个非常简单的贪婪聚类算法 但很难优化它的速度 该算法将采用距离矩阵 找到具有最多小于预定距离截止值的分量的列 并将行索引 具有小于截止值的分量 存储为簇的成员 簇的质心是列索引 然后 从距离矩阵中删除每个