Как рассчитать ковариационную матрицу для конкретного центроида (кластеризация k-средних) в Python 3? - PullRequest
1 голос
/ 26 июня 2019

Я реализую алгоритм кластеризации k-средних. Пока что это работает с использованием евклидовых расстояний. Выключение евклидовых расстояний для расстояний Махаланобиса не может быть правильно сгруппировано.

По некоторым причинам расстояние Махаланобиса иногда бывает отрицательным. Оказывается, ковариационная матрица имеет отрицательные собственные значения, что, очевидно, не подходит для ковариационных матриц.

Вот функции, которые я использую:

#takes in data point x, centroid m, covariance matrix sigma
def mahalanobis(x, m, sigma):
    return np.dot(np.dot(np.transpose(x - m), np.linalg.inv(sigma)),  x - m)

#takes in centroid m and data (iris in 2d, dimensions: 2x150)
def covar_matrix(m, data):
    d, n = data.shape
    R = np.zeros((d,d)) 
    for i in range(n): 
        R += np.dot(data[:,i:i+1] , np.transpose(data[:,i:i+1]))
    R /= n
    return R - np.dot(m, np.transpose(m))
    #autocorrelation_matrix - centroid*centroid'

Как я реализовал алгоритм:

  1. Set k

  2. Случайно выберите k центроидов

  3. Рассчитать covar_matrix () для каждого центроида

  4. Рассчитать махаланобис () каждой точки данных для каждого центроида и добавить к ближайшему кластеру

  5. Начните искать новые центроиды; для каждой точки данных * в каждом кластере вычислите сумму mahalanobis () для каждой другой точки в кластере; точка с минимальной суммой становится новым центроидом
  6. Повторяйте 3-5, пока старый центроид и новые центроиды не станут одинаковыми

* Рассчитать covar_matrix () с этой точкой

Я ожидаю, что положительное расстояние Махаланобиса и положительно определенная ковариационная матрица (последняя исправит первую, я надеюсь).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...