Python 如何更改功能';K-Means聚类的权重?

Python 如何更改功能';K-Means聚类的权重?,python,machine-learning,scikit-learn,cluster-analysis,feature-selection,Python,Machine Learning,Scikit Learn,Cluster Analysis,Feature Selection,我正在使用Scikit learn对有关奥斯卡颁奖典礼的推文语料库(仅文本)进行聚类 如果像@LeonardoDiCaprio这样的用户名或像#red地毯这样的标签在预处理过程中被认为更重要,那么它将非常有用 我想知道,是否有可能增加更多的重量,这些共同的用户名和hashtag作为更重要的功能 K-均值仅适用于欧几里德空间,其中向量A和B之间的距离表示为 || A - B || = sqrt( SUM_i (A_i - B_i)^2 ) 因此,如果您想“加重”特定功能的重量,您需要 || A

我正在使用Scikit learn对有关奥斯卡颁奖典礼的推文语料库(仅文本)进行聚类

如果像@LeonardoDiCaprio这样的用户名或像#red地毯这样的标签在预处理过程中被认为更重要,那么它将非常有用


我想知道,是否有可能增加更多的重量,这些共同的用户名和hashtag作为更重要的功能

K-均值仅适用于欧几里德空间,其中向量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(因此-对角高斯用作范数的生成器).

当你说增加权重时,你的意思是什么?k-means使用距离计算,试图找出两个实例的所有特征“相似”程度。你是说你希望“接近”加重某些单词的外观?相反,这是否意味着你希望它们加重“距离”在推文之间,如果一条推文有这些词,而另一条推文没有这些词?另外,您的数据是否以某种方式规范化了?@flyingmeatball为例,我想将其作为一个功能“@sasha”,因为它是语料库中的一个常用词(出现在超过30%的推文中),并且是一个用户名(它是一个以“@”开头的标记)。但除此之外,我不想错过非用户名的功能。我的数据管道是CountVectorizer->K-means。我碰巧在SGDClassizer中遇到了类似的情况。它的fit方法有一个参数样本权重。也许K-means有类似的功能。看一看:说得好-@fuxes可能需要一些尝试和测试错误,以确定使用什么值乘以“有价值”术语。通常情况下,您可以通过各种权重更新来衡量您的模型是否更准确,并且可以将您的总体性能与测试集进行比较。您将如何自动优化每个功能的权重,以进行聚类?在scikit内学习或通过其他方法?衡量更多权重的方法是什么r成功率较低的聚类?确定每个特征的最佳权重的方法是什么,从而使聚类得到最佳分离?