我正在尝试使用sklearn的聚集群集命令执行约束群集。为了使算法受约束,它需要一个“连接矩阵”。描述为:
连通性约束是通过连通性矩阵施加的:稀疏矩阵,其稀疏矩阵仅在行和列的交点处具有应连接的数据集索引。该矩阵可以由先验信息构造而成:例如,您可能希望仅通过合并页面与指向彼此的链接来对网页进行聚类。
我有一个观测对列表,希望该算法强制将其保留在同一群集中。我可以将其转换为稀疏scipy
矩阵(coo
或csr
),但是生成的群集无法强制约束。
一些数据:
import numpy as np
import scipy as sp
import pandas as pd
import scipy.sparse as ss
from sklearn.cluster import AgglomerativeClustering
# unique ids
ids = np.arange(10)
# Pairs that should belong to the same cluster
mustLink = pd.DataFrame([[1, 2], [1, 3], [4, 6]], columns=['A', 'B'])
# Features for training the model
data = pd.DataFrame([
[.0873,-1.619,-1.343],
[0.697456, 0.410943, 0.804333],
[-1.295829, -0.709441, -0.376771],
[-0.404985, -0.107366, 0.875791],
[-0.404985, -0.107366, 0.875791],
[-0.515996, 0.731980, -1.569586],
[1.024580, 0.409148, 0.149408],
[-0.074604, 1.269414, 0.115744],
[-0.006706, 2.097276, 0.681819],
[-0.432196, 1.249149,-1.159271]])
将对转换为“连接矩阵”:
# Blank coo matrix to csr
sm = ss.coo_matrix((len(ids), len(ids)), np.int32).tocsr()
# Insert 1 for connected pairs and diagonals
for i in np.arange(len(mustLink)): # add links to both sides of the matrix
sm[mustLink.loc[i, 'A'], mustLink.loc[i, 'B']] = 1
sm[mustLink.loc[i, 'B'], mustLink.loc[i, 'A']] = 1
for i in np.arange(sm.tocsr()[1].shape[1]): # add diagonals
sm[i,i] = 1
sm = sm.tocoo() # convert back to coo format
训练并拟合聚集聚类模型:
m = AgglomerativeClustering(n_clusters=6, connectivity=sm)
out = m.fit_predict(X=data)
警告我收到:
UserWarning:连接矩阵的连接组件数为7>1。对其进行填充,以避免过早停止树。连接性,n_components = _fix_connectivity(X,连接性)
除了不祥的警告外,我希望这些对不会属于同一群集。
这是因为sklearn算法并非旨在处理mustlink约束,而是只能使用distance
矩阵(此处区分)吗?
将连通性矩阵传递给时sklearn.cluster.AgglomerativeClustering
,必须将矩阵中的所有点都连接起来。聚集聚类创建一个层次结构,在该层次结构中,所有点都被迭代地分组在一起,因此孤立的聚类不存在。连接矩阵对于“关闭”可能在欧几里得空间中附近但与另一个度量标准相距甚远的点很有用(请参见此处的《用户指南》中的果冻卷示例)。
另一种思考的方式是,您的点必须形成不相交的图形,您所能做的就是关闭节点之间的边。
此警告:
UserWarning:连接矩阵的连接组件数为7>1。对其进行填充,以避免过早停止树。连接性,n_components = _fix_connectivity(X,连接性)
告诉您您有7个不相交的簇,这比允许的1个多。这样的sklearn“完成”了(本质上将其填充为没有不相交的簇),这就是为什么根本不尊重您的约束的原因。
这里没有简单的解决方法。您可以在聚类后尝试重新分配中心,以遵守您的约束条件,或者您需要采用其他算法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句