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

fux*_*xes 2 python cluster-analysis machine-learning feature-selection scikit-learn

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

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

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

lej*_*lot 6

K-means仅适用于欧几里德空间,其中矢量A和B之间的距离表示为

|| A - B || = sqrt( SUM_i (A_i - B_i)^2 )
Run Code Online (Sandbox Code Playgroud)

因此,如果你想"加权"特定的功能,你会喜欢这样的东西

|| A - B ||_W = sqrt( SUM_i w_i(A_i - B_i)^2 )
Run Code Online (Sandbox Code Playgroud)

这将导致特征i变得更加重要(如果w_i> 1) - 因此你会因为具有不同的价值而获得更大的惩罚(就单词/单词组而言 - 它只是意味着如果两个文档具有不同的数量在这个特定单词中,它们被假定为与另一组单词不同的单词更加不同.

那么你怎么能强制执行呢?那么,基本的数学就是你所需要的!你可以很容易地看出来

|| A - B ||_W = || sqrt(W)*A - sqrt(W)*B ||
Run Code Online (Sandbox Code Playgroud)

换句话说 - 你取出你的tfidf变换器(或者你用来将你的文本映射到常量矢量的任何东西),检查哪些特征负责你感兴趣的单词,你创建一个矢量(大小等于数量的维度)并增加你关心的单词的值(例如10x)并取这个东西的平方根.然后,您只需np.multiply通过此加权矢量将"逐点"与broadcast()相乘来预处理所有数据.这就是你所需要的,现在你的话语将以这种定义明确的方式变得更加重要.从数学的角度来看,这是引入Mahalanobis距离而不是欧几里德,协方差矩阵等于w*I(因此 - 对角高斯用作你的范数的发生器).