scikit-learn Kmeans
内部的向量是否在内部标准化为单位L2范数或TfidfVectorizer
出错?我对文本数据执行聚类,我使用TF-IDF矢量化器进行矢量化。这里的代码太长了,无法复制,但实际上我从20个新闻组数据集中对数据进行了矢量化和聚类。我将矢量化器实例化为(未标准化):
VectorizerUn = TfidfVectorizer(min_df=10,
max_df=0.5,
stop_words='english',
decode_error='ignore')
或(L2标准化):
VectorizerL2 = TfidfVectorizer(min_df=10,
max_df=0.5,
stop_words='english',
decode_error='ignore',
norm=u'l2')
我实例化 k 意味着使用:
km = KMeans(n_clusters=num_clusters, init='random', n_init=1, verbose=0)
然后我继续分割数据以进行交叉验证,矢量化并拟合列车数据集(矢量化器中的X代表' Un'或者' L2')
Vectorized = VectorizerX.fit_transform(TrainData.data)
km.fit(Vectorized)
并将数据分配给火车集中消息的集群
new_msg_vec = VectorizerX.transform([new_msg])
predicted_clust = km_clust.predict(new_msg_vec)[0]
其中new_msg
遍历列车数据中的消息。然后,我基于20个新闻组中的消息的已知组标签将群集分配给组(每个群集属于其大多数内容的组),并使用测试数据来表征群集/分类方案的性能。下面是分类错误与没有标准化和L2标准化的矢量化数据的集群数量的关系图:
误差线是km.fit(Vectorized)
步骤10次独立运行后分类错误的标准偏差。这两个结果基本相同。聚类的其他度量(ARI得分,AMI得分,NMI得分)给出了基本相同的图片。
那么,Kmeans是否在内部将向量归一化为L2范数为1,或者TfidfVectorizer
norm
参数不执行它应该做的事情? (我正在使用scikit-learn 0.14.1)
编辑:我发现这个问题很可能不是Kmeans。如果我使用L1规范化约束进行矢量化(在norm=u'l1'
中设置TfidfVectorizer
),则聚类错误从45%增加到约80%。我更改了标题以反映这一点。
答案 0 :(得分:2)
Kmeans在内部将向量规范化为L2范数为1,或者TfidfVectorizer范数参数不能达到预期的效果吗?
都不是。正如@ YS-L在评论中所说,TfidfVectorizer
的默认行为是对它产生的向量进行L2规范化:
norm : 'l1', 'l2' or None, optional
Norm used to normalize term vectors. None for no normalization.
,默认值为'l2'
,因此请将显式norm=None
传递给不进行规范化。