如何实现K-Means聚类算法用于MFCC特征?

3

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

假设A、B和C是三个语音记录,则:

A为:

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

同时,B和C的长度也相同。

我不想对每一帧进行聚类,而是想对每个帧块进行聚类(例如,一个组有70帧)。

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

2个回答

3

在这里,你对问题领域的了解变得至关重要。你可能只是使用70*9矩阵之间的距离,但你可以做得更好。我不知道你提到的具体特征,但一些通用的例子可能是每个特征的70个值的平均值、标准偏差。你基本上是想要减少维度的数量,既为了提高速度,也为了使测量结果对简单的转换(例如将所有值偏移一个步骤)更加稳健。


噢,一旦您确保最终功能已经归一化,则最终的距离度量可能只是特征差异之和。 - Nicolas78

0

K-Means对您的数据有一些非常严格的假设。我不确定您的数据是否适合运行k-means。

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

顺便说一句:避免使用Java泛型来处理Double等基本类型。它会降低性能。请使用double[][]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接