如何更改K-Means聚类的特征权重?

时间:2016-05-12 21:22:29

标签: python machine-learning scikit-learn cluster-analysis feature-selection

我正在使用Scikit-learn来聚集关于#oscars的推文语料库(仅文本)。

如果@LeonardoDiCaprio之类的用户名或#redcarpet之类的标签在预处理中被视为更重要,那将非常有用。

我想知道是否可以为这些常用用户名和主题标签添加更多权重,以便成为更重要的功能。

1 个答案:

答案 0 :(得分:5)

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)相乘来预处理所有数据。这就是你所需要的,现在你的话语将以这种定义明确的方式变得更加重要。从数学的角度来看,这是引入Mahalanobis距离而不是欧几里德,协方差矩阵等于w * I(因此 - 对角高斯用作你的范数的发生器)。