Можно ли вычислить оценку Дэвиса Боулдина на основе заранее вычисленной матрицы расстояний с помощью sklearn?Python

Программы на Python
Ответить
Anonymous
 Можно ли вычислить оценку Дэвиса Боулдина на основе заранее вычисленной матрицы расстояний с помощью sklearn?

Сообщение Anonymous »

Я пытаюсь вычислить показатель Дэвиса Боулдина, чтобы сравнить различные подходы к кластеризации. У меня есть предварительно вычисленная матрица расстояний (которая представляет расстояние между текстами на основе редактирования).
Я использую реализацию Silhouette_score, davies_bouldin_score и scikit-learn. Calinski_harabasz_score доступен в модуле sklearn.metrics.
Он работает, но для sihouette_score он указывает, что я могу использовать матрицу расстояний. В случае двух других показателей это не так.
Я могу передать матрицу расстояний как в davies_bouldin_score, так и в Calinski_harabasz_score, но они ожидают n_samples x N_features матрица. Я предполагаю, что они рассматривают матрицу расстояний как матрицу признаков. Правильно ли будет подсчитывать балл таким образом?
В ответе на предыдущий вопрос упоминается, что это возможно.
Тогда мой вопрос: можно ли с математической точки зрения использовать матрицу расстояний для вычисления этих оценок?
Мой код работает, и я могу вывести оценку, поэтому моя проблема больше: делает ли то, что я делаю, смысл?
Вот минимальный рабочий пример:

Код: Выделить всё

import numpy as np
from sklearn.cluster import AgglomerativeClustering
from sklearn import metrics

# Generate random points in a 2D space
num_points = 5  # Adjust the number of points
points = np.random.rand(num_points, 2)

# Compute the Euclidean distance matrix
distance_matrix = np.linalg.norm(points[:, np.newaxis] - points, axis=2)

# Clustering
thresholds = [0.25, 0.35]

for t in thresholds:
c = AgglomerativeClustering(n_clusters=None,
metric="precomputed",
linkage="average",
distance_threshold=t)

clusters = c.fit(distance_matrix)

s_score = metrics.silhouette_score(distance_matrix,
clusters.labels_,
metric="precomputed")
dbi_score = metrics.davies_bouldin_score(distance_matrix,
clusters.labels_)
ch_score = metrics.calinski_harabasz_score(distance_matrix,
clusters.labels_)

print(f"Threshold = {t}")
print(f"\tSilhouette score:\t\t{s_score:.3f}")
print(f"\tDavies-Bouldin score:\t\t{dbi_score:.3f}")
print(f"\tCalinski-Harabasz score:\t{ch_score:.3f}")

# Output:
# Threshold = 0.25
#   Silhouette score:       0.311
#   Davies-Bouldin score:       0.114
#   Calinski-Harabasz score:    21.653
# Threshold = 0.35
#   Silhouette score:       0.533
#   Davies-Bouldin score:       0.343
#   Calinski-Harabasz score:    9.360
Если возникает ошибка ValueError: Количество меток равно 5., просто перезапустите код (проблема возникает из-за случайности сгенерированной матрицы тестовых расстояний).


Подробнее здесь: https://stackoverflow.com/questions/791 ... ance-matri
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»