Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import numpy as np
- import sklearn
- import sklearn.metrics
- def silhouette_score(x, labels):
- '''
- :param np.ndarray x: Непустой двумерный массив векторов-признаков
- :param np.ndarray labels: Непустой одномерный массив меток объектов
- :return float: Коэффициент силуэта для выборки x с метками labels
- '''
- if np.unique(labels).shape[0] == 1:
- return 0
- s = np.zeros(x.shape[0])
- clusters = []
- for label in np.unique(labels):
- if (labels == label).shape[0] == 1:
- s[(labels == label)] = 0
- else:
- values = np.sum(sklearn.metrics.pairwise_distances(x, x)[:, (labels == label)], axis=1)
- s[(labels == label) * (np.sum(labels == label) > 1)] = values[(labels == label) * (np.sum(labels == label) > 1)] / (np.sum(labels == label) - 1)
- avg = values / np.sum(labels == label)
- avg[(labels == label)] = np.max(sklearn.metrics.pairwise_distances(x, x)) + 1
- clusters.append(avg)
- p = np.min(np.stack(clusters), axis=0)
- m = (p != 0) * (s != 0)
- sil = np.zeros(x.shape[0])
- sil[m] = (p - s)[m] / np.maximum(p, s)[m]
- sil_score = np.mean(sil, axis=0)
- return sil_score
- def bcubed_score(true_labels, predicted_labels):
- '''
- :param np.ndarray true_labels: Непустой одномерный массив меток объектов
- :param np.ndarray predicted_labels: Непустой одномерный массив меток объектов
- :return float: B-Cubed для объектов с истинными метками true_labels и предсказанными метками predicted_labels
- '''
- n_objects = true_labels.shape[0]
- precision = 0
- recall = 0
- for i in range(n_objects):
- p = true_labels[(predicted_labels == predicted_labels[i])]
- precision += np.mean(p == true_labels[i])
- r = predicted_labels[(true_labels == true_labels[i])]
- recall += np.mean(r == predicted_labels[i])
- precision /= n_objects
- recall /= n_objects
- score = 2 * (precision * recall) / (precision + recall)
- return score
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement