3

我用 MFCC 算法得到了一些声音变量的特征。我想用 K-Means 对它们进行聚类。我有 70 帧,每帧都有一个语音样本的 9 个倒谱系数。这意味着我有一个 70*9 大小的矩阵。

让我们假设 A、B 和 C 是语音记录,所以

一个是:

List<List<Double>> -> 70*9 array (I can use Vector instead of List)

而且B和C也有相同的长度。

我不想对每个帧进行聚类,我想对每个帧块进行聚类(在我的示例中,一组有 70 个帧)。

如何在 Java 中使用 K-Means 实现它?

4

2 回答 2

3

在这里,您对问题域的了解变得至关重要。您可能只使用 70*9 矩阵之间的距离,但您可能会更好。我不知道您提到的特定功能,但一些通用示例可能是每个功能 70 个值的平均标准偏差。您基本上希望减少维数,既可以提高速度,又可以使度量对简单的转换具有鲁棒性,例如将所有值偏移一步

于 2011-05-29T06:46:19.407 回答
0

K-Means 对您的数据有一些非常严格的假设。我不相信您的数据适合在其上运行 k-means。

  1. K-means 是为欧几里德距离设计的,可能有更适合您的数据的距离度量。
  2. K-means 需要能够计算合理的均值,这可能不适合您的数据
  3. 许多距离函数(和算法!)在 70*9 维度上效果不佳(“维度灾难”)
  4. 你需要事先知道k。

旁注:远离 Java 泛型的原始类型,例如 Double。它会扼杀性能。使用double[][].

于 2012-07-10T08:25:36.987 回答