我正在使用Scikit-learn对关于#奥斯卡的推文(仅文本)进行聚类。
如果像@LeonardoDiCaprio这样的用户名或像#redcarpet这样的标签可以被视为预处理中更重要的因素,那将非常有用。
我想知道是否可能增加更多的权重给这些常见的用户名和标签,使其成为更重要的特征。
我正在使用Scikit-learn对关于#奥斯卡的推文(仅文本)进行聚类。
如果像@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 )
如果w_i>1,则会导致特征i更加重要 - 这意味着对于具有不同值的特征(以词袋/单词集为衡量标准),你将获得更大的惩罚。这简单地意味着,如果两个文档中某个特定单词的数量不同,它们被认为比在另一组单词上存在差异的文档之间的差异更大。
那么如何执行此操作? 基本的数学知识就足够了! 你可以很容易地看到
|| A - B ||_W = || sqrt(W)*A - sqrt(W)*B ||
换句话说,您拿出您的tfidf转换器(或任何用于将文本映射到常数大小矢量的工具),检查哪些特征负责您感兴趣的单词,创建一个由1组成的向量(大小等于维度数),并增加您关心的单词的值(例如10倍),然后取这个东西的平方根。接下来,通过使用广播(np.multiply
)点乘这个加权向量,预处理您的所有数据。这就是您所需要的一切,现在您的单词将以这种明确定义的方式更为重要。从数学角度来看,这是引入Mahalanobis距离而不是欧几里得距离,其中协方差矩阵等于w*I(因此-对角高斯用作您规范的生成器)。