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

3

我正在使用Scikit-learn对关于#奥斯卡的推文(仅文本)进行聚类。

如果像@LeonardoDiCaprio这样的用户名或像#redcarpet这样的标签可以被视为预处理中更重要的因素,那将非常有用。

我想知道是否可能增加更多的权重给这些常见的用户名和标签,使其成为更重要的特征。


当你说添加权重时,你是指什么?k-means使用距离计算来尝试确定两个实例的所有特征有多“相似”。你是说你想要“接近度”超过某些单词的外观吗?反之,这是否意味着您希望它们在一个推文具有这些单词而另一个推文没有时加重了它们之间的“距离”?此外,您的数据是否以某种方式进行了归一化处理? - flyingmeatball
例如,我想将“@sasha”作为一个特征,因为它是语料库中的常见词(在超过30%的推文中出现),并且它是一个用户名(它是以“@”开头的标记)。但除此之外,我不想错过那些不是用户名的特征。 我的数据管道是CountVectorizer -> K-Means。 - fuxes
我碰巧在使用SGDClassifier时遇到了类似的情况。它的fit方法中有一个名为sample_weight的参数。也许K-means也有类似的功能。你可以参考这个链接:http://scikit-learn.org/stable/auto_examples/linear_model/plot_sgd_weighted_samples.html#example-linear-model-plot-sgd-weighted-samples-py - Shovalt
1个回答

11

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 )

如果w_i>1,则会导致特征i更加重要 - 这意味着对于具有不同值的特征(以词袋/单词集为衡量标准),你将获得更大的惩罚。这简单地意味着,如果两个文档中某个特定单词的数量不同,它们被认为比在另一组单词上存在差异的文档之间的差异更大。

那么如何执行此操作? 基本的数学知识就足够了! 你可以很容易地看到

|| A - B ||_W = || sqrt(W)*A - sqrt(W)*B ||

换句话说,您拿出您的tfidf转换器(或任何用于将文本映射到常数大小矢量的工具),检查哪些特征负责您感兴趣的单词,创建一个由1组成的向量(大小等于维度数),并增加您关心的单词的值(例如10倍),然后取这个东西的平方根。接下来,通过使用广播(np.multiply)点乘这个加权向量,预处理您的所有数据。这就是您所需要的一切,现在您的单词将以这种明确定义的方式更为重要。从数学角度来看,这是引入Mahalanobis距离而不是欧几里得距离,其中协方差矩阵等于w*I(因此-对角高斯用作您规范的生成器)。


说得好 - @fuxes,可能需要一些试错来确定要使用什么值来乘以“有价值”的项。通常,您会有一些指标来衡量模型在各种权重更新下的准确性,并且可以将整体性能与测试集进行比较。 - flyingmeatball
您将如何自动优化给定每个特征的权重以进行聚类?是在 scikit-learn 中还是通过其他方法?什么是更成功的聚类的度量标准?确定每个特征的最佳权重的方法是什么,以使聚类最好地分离? - zlatko

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