基于标签的同现图像聚类

问题描述 投票:1回答:1

我使用Google Vision API标记了很多对象图像。使用这些标签(泡菜here中的列表),我创建了一个标签共现矩阵(以numpy数组here下载)。矩阵的大小为2195x2195。

加载数据:

import pickle
import numpy as np
with open('labels.pkl', 'rb') as f:
    labels = pickle.load(f)

cooccurrence = np.load('cooccurrence.npy')

我想使用聚类分析来定义合理数量的聚类(定义为视觉标签列表),这些聚类表示某些对象(例如汽车,鞋子,书籍等)。我不知道群集的正确数量是多少。

我尝试过scikit-learn中可用的分层聚类算法:

import pandas as pd
pd.set_option('display.max_rows', 500)
pd.set_option('display.max_colwidth', 1000)

#creating non-symetrical "similarity" matrix:
occurrences = cooccurrence.diagonal().copy()
similarities = cooccurrence / occurrences[:,None]

#clustering:
from sklearn.cluster import AgglomerativeClustering
clusters = AgglomerativeClustering(n_clusters=200, affinity='euclidean', linkage='ward').fit_predict(similarities)

#results in pandas:
df_clusters = pd.DataFrame({'cluster': clusters.tolist(), 'label': labels})
df_clusters_grouped = df_clusters.groupby(['cluster']).agg({'label': [len, list]})
df_clusters_grouped.columns = [' '.join(col).strip() for col in df_clusters_grouped.columns.values]
df_clusters_grouped.rename(columns = {'label len': 'cluster_size', 'label list': 'cluster_labels'}, inplace=True)
df_clusters_grouped.sort_values(by=['cluster_size'], ascending=False)

像这样,我能够创建200个群集,其中一个看起来像:

["Racket", "Racquet sport", "Tennis racket", "Rackets", "Tennis", "Racketlon", "Tennis racket accessory", "Strings"]

这在某种程度上是可行的,但是我宁愿使用某种软聚类方法,该方法可以将一个标签分配给多个聚类(例如,“皮革”可能对鞋子和钱包有意义)。另外,我必须定义集群的数量(示例代码中为200),这是我希望得到的结果(如果可能)。

我也在玩hdbscank-cliqueGaussian mixture models,但是我没有提出更好的输出。

python graph cluster-analysis similarity google-vision
1个回答
0
投票

sklearn的诸如AgglomerativeClustering之类的集群方法需要输入data matrix。使用metric="precomputed",您还可以使用距离矩阵(对于k-均值和高斯混合建模,it,它们确实需要坐标数据)。

但是,您有一个同现或simarity矩阵。这些值的含义相反,因此您必须确定适当的转换。将同现矩阵视为数据矩阵(然后使用欧几里得距离-即您所做的)可以在某种程度上起作用,但语义非常奇怪,因此not推荐。

© www.soinside.com 2019 - 2024. All rights reserved.