【发布时间】:2014-12-18 06:27:39
【问题描述】:
我正在尝试定位类似对象的集群。我为每个对象到对象的比较计算了一个值,并创建了一个如下形式的矩阵:
header = [1, 2, 3, 4, 5]
matrix = [[0, 100, 0, 0, 0]
[100, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]]
我将矩阵传递给 sklearn Affinity Propagation 模块:
matrix = np.array(matrix)
cluster = AffinityPropagation(preference="precomputed")
cls = cluster.fit_predict(matrix)
在给出的示例中,我希望 1 和 2 是聚类的,因为 1-2 / 2-1 是 100,而所有其他值都是零。但是 cls 数组并没有反映这一点:
cls = [0 0 0 0 1]
表示1、2、3、4是一个簇,5是单独的簇。
我尝试通过右上三角矩阵,改变值大小(即 0-1 副 0-100)等,但它没有按预期聚集。
对我缺少什么的想法?
附加信息 2014 年 10 月 24 日:
我正在对我的对象进行成对比较,并从中生成一个数字,表明每个对象与其他对象的相关程度。许多这些对象根本不相关,因此它们产生“0”值。
这会创建一个稀疏的 n×n 矩阵,其中 n 大约是 10 到 100 个对象。
从视觉上看,将这些对象“聚类”以进行进一步分析对我来说是微不足道的。在以下情况下,1 与 2 相关,2 与 3 相关,但 1 和 3 并不直接相关。我将继续处理 1、2 和 3,并忽略 4 和 5。(在我的实际数据中,我可能在单个矩阵中有多个有效的簇)。
header = [1, 2, 3, 4, 5]
matrix = [[0, 100, 0, 0, 0]
[100, 0, 96, 0, 0]
[0, 96, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]]
我的研究表明,Affinity Propagation 擅长在稀疏矩阵中寻找聚类,并且我的成对比较有效地生成了“预先计算”的亲和矩阵。
虽然很容易从视觉上找到这些集群,但我想将其自动化,以便将其与之前和之后的代码集成。但是,正如原始帖子所示,我没有生成有意义的集群。
问题:
是否需要某种处理才能从我描述的那种矩阵开始生成有意义的集群?
我是否忽略了一个步骤或以其他方式将错误插入到算法中,导致它无法找到我的集群?
我应该对这类数据使用不同的聚类方法(DBSCAN、k-means 等)吗?
【问题讨论】:
标签: python scikit-learn cluster-analysis