我正在使用 Scikit-learn 对有关 #oscars 的推文语料库(仅文本)进行聚类。
如果 @LeonardoDiCaprio 这样的用户名或 #redcarpet 这样的主题标签在预处理中被认为更重要,那将非常有用。
我想知道是否可以为这些常见的用户名和主题标签添加更多权重,使其成为更重要的功能。
最佳答案
K-means 仅适用于欧几里德空间,其中向量 A 和 B 之间的距离表示为
|| A - B || = sqrt( SUM_i (A_i - B_i)^2 )
因此,如果您想“权衡”特定功能,您会想要类似的东西
|| A - B ||_W = sqrt( SUM_i w_i(A_i - B_i)^2 )
这将导致特征 i 更加重要(如果 w_i>1) - 因此你会因为具有不同的值而受到更大的惩罚(就词袋/词集而言 - 这仅仅意味着如果两个文档该特定单词的数量不同,因此假定它们比另一组单词的差异更大)。
那么如何强制执行呢?好吧,基础数学就足够了!你可以很容易地看到
|| A - B ||_W = || sqrt(W)*A - sqrt(W)*B ||
换句话说 - 你拿出你的 tfidf 转换器(或者任何你用来将文本映射到恒定大小向量的东西),检查哪些特征负责你感兴趣的单词,你创建一个向量(大小等于到维度数)并增加您关心的单词的值(例如 10x)并计算该值的平方根。然后,您只需通过将“逐点”广播 (np.multiply
) 乘以该权重向量来预处理所有数据。这就是您所需要的,现在您的言语将以这种明确的方式变得更加重要。从数学角度来看,这是引入马哈拉诺比斯距离而不是欧几里得距离,协方差矩阵等于 w*I (因此 - 对角高斯用作范数的生成器)。
关于python - 如何更改 K 均值聚类的特征权重?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37197622/