当前位置: 首页 > 面试题库 >

将float数组划分为相似的段(集群)

怀飞掣
2023-03-14
问题内容

我有这样一个浮点数组:

[1.91, 2.87, 3.61, 10.91, 11.91, 12.82, 100.73, 100.71, 101.89, 200]

现在,我想像这样对数组进行分区:

[[1.91, 2.87, 3.61] , [10.91, 11.91, 12.82] , [100.73, 100.71, 101.89] , [200]]

// [200]由于集群支持较少,将被视为异常值

我必须为多个数组找到这种段,但我不知道分区大小应该是多少。我试图通过使用层次聚类(聚集)来做到这一点
,它为我提供了令人满意的结果。但是,问题是,建议我不要对一维问题使用聚类算法,因为这样做没有任何理论上的依据(因为它们是针对多维数据的)。

我发现了另一个建议,而不是聚类,即自然休息优化。但是,这还需要像K-means一样声明分区号(对吗?)。

这是相当令人困惑的(特别是因为我必须在几个数组上执行那种分段,并且不可能知道最佳的分区号)。

是否有任何方法可以找到分区(因此我们可以减少分区内的方差并最大化分区之间的方差),并且具有一些理论上的依据?

任何具有理论依据的指向文章/论文的指针(如果可用的C / C ++ / Java实现)将对我非常有帮助。


问题答案:

我认为我将对数据进行排序(如果尚未排序),然后采用相邻的差异。将差异除以较小的数字,即得出百分比变化之间的差异。设置一个阈值,当更改超过该阈值时,启动一个新的“集群”。

编辑:C ++中的快速演示代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <numeric>
#include <functional>

int main() {
    std::vector<double> data{ 
        1.91, 2.87, 3.61, 10.91, 11.91, 12.82, 100.73, 100.71, 101.89, 200 
    };

    // sort the input data
    std::sort(data.begin(), data.end());

    // find the difference between each number and its predecessor
    std::vector<double> diffs;
    std::adjacent_difference(data.begin(), data.end(), std::back_inserter(diffs));

    // convert differences to percentage changes
    std::transform(diffs.begin(), diffs.end(), data.begin(), diffs.begin(),
        std::divides<double>());

    // print out the results
    for (int i = 0; i < data.size(); i++) {

        // if a difference exceeds 40%, start a new group:
        if (diffs[i] > 0.4)
            std::cout << "\n";

        // print out an item:
        std::cout << data[i] << "\t";
    }

    return 0;
}

结果:

1.91    2.87    3.61
10.91   11.91   12.82
100.71  100.73  101.89
200


 类似资料:
  • 问题内容: 我不知道如何很好地解释这一点,所以请多多包涵。 我试图对彼此相邻的相似行进行分组,如果相同,则基本上忽略第n + 1行。我不确定这在MySQL中是否容易实现。这些行除描述外不共享其他任何属性。如果还有其他不重复的“描述”,我仍然希望将它们返回。 我有一张桌子,上面满是这样的条目: 问题答案: 您可以使用巧妙的技巧来做到这一点。诀窍是计算与特定id 不同 的描述的数量。对于序列中的值,此

  • 如何将整数数组划分为N个子集,使这些子集的和最小? 例如,数组由11个元素组成,我需要其中的6个子集。 子集:<code>{2,1,1,3},{4},}4,3},}3,2},1,2},{3}</code>最小和=7。 另一个答案是:最小和=7。 注意:在分区时,必须保持数字在原始集合中出现的顺序。

  • 我想检查是否可以将一个数组拆分为具有相同和的连续子数组。拆分数组还意味着删除数组的边框元素。 例如,要将其拆分为3个部分,我们需要删除到元素 通过删除这2个元素,就有3个相同和的连续子数组,和。 因此,如果可以将数组拆分为3个部分(等和)并删除它们之间的边界,则应返回true,否则应返回false。 返回的示例是。因为删除2个元素后,它将有4个元素,这些元素不能分组为3个相等的和 我不知道如何处理

  • 问题内容: 我对Apache Spark和Python比较陌生,想知道像我将要描述的东西是否可行? 我有一个格式为[m 1,m 2,m 3,m 4,m 5,m 6, … m n ]的RDD(运行rdd.collect()时会得到这个)。我想知道是否有可能将此RDD转换为[[m 1,m 2,m 3),(m 4,m 5,m 6).....(m n-2, m n-1,m n)]。内部元组的大小应为k。如

  • 问题内容: 当每个块的总和大致相等时,如何将数组分成两个块? 问题答案: 像这样: 测试:

  • 我一直陷在这个问题中,找不到有效的解决办法。 我有N(高达1000万)说最大100个元素的数组。这些数组包含1-10000的数字。 现在我的问题是将这些数组划分为K个组,这样我就可以最小化所有数组中的重复项,即一个数组包含1,4,10,100,另一个数组包含1100。我希望他们进入同一组,因为这样可以最大限度地减少口是心非。我的问题的两个限制条件如下- > 组中向量的数量应均匀分布。 根据大小以递