Advertisement
Dimaush

Untitled

May 31st, 2023
1,006
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.23 KB | None | 0 0
  1. import numpy as np
  2.  
  3. import sklearn
  4. import sklearn.metrics
  5.  
  6.  
  7. def silhouette_score(x, labels):
  8.     '''
  9.    :param np.ndarray x: Непустой двумерный массив векторов-признаков
  10.    :param np.ndarray labels: Непустой одномерный массив меток объектов
  11.    :return float: Коэффициент силуэта для выборки x с метками labels
  12.    '''
  13.     if np.unique(labels).shape[0] == 1:
  14.         return 0
  15.  
  16.     s = np.zeros(x.shape[0])
  17.     clusters = []
  18.  
  19.     for label in np.unique(labels):
  20.         if (labels == label).shape[0] == 1:
  21.             s[(labels == label)] = 0
  22.         else:
  23.             values = np.sum(sklearn.metrics.pairwise_distances(x, x)[:, (labels == label)], axis=1)
  24.             s[(labels == label) * (np.sum(labels == label) > 1)] = values[(labels == label) * (np.sum(labels == label) > 1)] / (np.sum(labels == label) - 1)
  25.             avg = values / np.sum(labels == label)
  26.             avg[(labels == label)] = np.max(sklearn.metrics.pairwise_distances(x, x)) + 1
  27.             clusters.append(avg)
  28.  
  29.     p = np.min(np.stack(clusters), axis=0)
  30.     m = (p != 0) * (s != 0)
  31.  
  32.     sil = np.zeros(x.shape[0])
  33.     sil[m] = (p - s)[m] / np.maximum(p, s)[m]
  34.     sil_score = np.mean(sil, axis=0)
  35.     return sil_score
  36.  
  37.  
  38. def bcubed_score(true_labels, predicted_labels):
  39.     '''
  40.    :param np.ndarray true_labels: Непустой одномерный массив меток объектов
  41.    :param np.ndarray predicted_labels: Непустой одномерный массив меток объектов
  42.    :return float: B-Cubed для объектов с истинными метками true_labels и предсказанными метками predicted_labels
  43.    '''
  44.     n_objects = true_labels.shape[0]
  45.     precision = 0
  46.     recall = 0
  47.     for i in range(n_objects):
  48.         p = true_labels[(predicted_labels == predicted_labels[i])]
  49.         precision += np.mean(p == true_labels[i])
  50.         r = predicted_labels[(true_labels == true_labels[i])]
  51.         recall += np.mean(r == predicted_labels[i])
  52.     precision /= n_objects
  53.     recall /= n_objects
  54.     score = 2 * (precision * recall) / (precision + recall)
  55.     return score
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement