如何使用 Ruby 进行 one-dimensional k-means 聚类?

How to make one-dimensional k-means clustering using Ruby?

我的问题:

我搜索了可用的 Ruby gem 以找到执行 k-means 聚类的软件。我发现了很多:kmeans, kmeans-clustering, reddavis-k_means and k_means_pp。我的问题是 gem 中的 none 处理 one-dimensional k-means 集群。他们都期待这样的输入:

[[1, 2], [3, 4], [5, 6]]

我的输入是这样的:

[1, 2, 3, 4, 5, 6]

因此我的问题是:如何使用 Ruby 执行 one-dimensional k-means 聚类?

上下文(我的任务):

我有 100 个输入值:

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 , 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3 , 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 5, 8, 8, 10, 16, 18, 22, 22, 35 , 50, 50

每个值代表一个响应时间,即某些客户服务代理响应客户电子邮件所花费的分钟数。所以第一个值 0 表示客户只等待 0 分钟响应。

我需要找出有多少快速、medium-fast 和慢速响应时间实例。换句话说,我想将我的输入值分成 3 个池,然后计算每个池中有多少。

复杂的因素是我必须根据整体坡度的陡度来确定在何处进行切割。快、medium-fast、慢没有固定的定义。第一次切割(在 fast 和 medium-fast 之间)应该发生在坡度开始比以前急剧增加的地方。第二次切割(在 medium-fast 和缓慢之间)应该在陡度增加得更剧烈时发生。

这是输入值的图形表示。

在上面的例子中,常识可能会将快速定义为 0-3,因为有很多 0、1、2 和 3 的实例。4-8 或 4-10 看起来像是 medium-fast。但是如何从数学上确定这样的事情呢?如果响应时间通常更快,那么客户就会期待这一点,因此接近尾声的更小的增加应该会触发削减。

整理说明:

我确实找到了处理 one-dimensional k-means 集群的 gem davidrichards-kmeans,但它似乎无法正常工作(示例代码提出了一个语法错误)。

无论如何,k-means 是这项工作的错误工具。

它不是为拟合指数曲线而设计的。

这里有一个更合理的建议:

看剧情,标记三点,就得到你的三组了

或查看分位数...报告中值响应时间、90% 分位数和 99% 分位数...

聚类是关于多变量数据中的结构发现。这可能不是你想要的,抱歉。

如果您坚持尝试 k-means,请尝试将数据编码为

[[1], [2], [3], [4], [5]]

并检查结果是否至少符合您的要求(还要记住 k-means 是随机的。运行它多次可能会产生非常不同的结果)。