Я хотел бы написать код Python для расчета точности кластера r
следующим образом:
r = (
A1
+ ... +
Ai
+ ...
Ak
) / (the number of data objects)
, где Ai
- количество объектов данных, встречающихся в i -й кластер и соответствующий ему истинный кластер.
Мне нужно реализовать его, чтобы сравнить производительность кластеризации с исследовательской работой, которая использует этот критерий точности.
Я искал существующие методыв sklearn, но не смог найти того, кто сделал это, и попытался написать это сам.
Вот код, который я написал:
# For each label in prediction, extract true labels of the same
# index as 'labels'. Then count the number of instances of respective
# true labels in 'labels', and assume the one with the maximum
# number of instances is the corresponding true label.
pred_to_true_conversion={}
for p in np.unique(pred):
labels=true[pred==p]
unique, counts=np.unique(labels, return_counts=True)
label_count=dict(zip(unique, counts))
pred_to_true_conversion[p]=max(label_count, key=label_count.get)
# count the number of instances whose true label is the same
# as the converted predicted label.
count=0
for t, p in zip(true, pred):
if t==pred_to_true_conversion[p]: count+=1
return count/len(true)
Однако я недумаю, что мой подход «перераспределения меток» - это умный способ, и должен быть лучший способ для вычисления r
.У моего метода есть проблемы, такие как:
- Он основан на предположении, что соответствующая истинная метка является той, которая встречается чаще всего в предсказанном кластере, но это не всегда так.
- Различные прогнозируемые метки кластера соотносятся с одной и той же истинной меткой кластера, особенно когда количество классов отличается в истинных метках и прогнозируемых метках.
Как реализовать точность r
?Или в существующих библиотеках кластеризации есть способ сделать это?