Как мне создать матрицу подобия на основе приведенного ниже кода?

#python-3.x #cluster-analysis #categorical-data

#python-3.x #кластерный анализ #категориальные данные

Вопрос:

Я пытаюсь использовать функцию gower по этой ссылке https://sourceforge.net/projects/gower-distance-4python/files /. Я пытаюсь применить ее к моему фрейму данных категориальных переменных. Однако я вижу, что при использовании функции gower_distances у меня есть несколько ненулевых значений в моих диагоналях (мне нужно, чтобы все они были равны 0).

Я пытался устранить ошибку в коде. Я думаю, что знаю, где это происходит, и это происходит в функции _gower_distance_row. Есть эта строка кода, которую я не понимаю sij_cat = np.where(xi_cat == xj_cat,np.zeros_like(xi_cat),np.ones_like(xi_cat)). Но я представлю это в более простом для понимания формате.

Допустим, у меня есть:

 xi=np.array(['cat','dog','monkey'])
xj=np.array([['cat','dog','monkey'],['horse','dog','hairy']])
sij_cat = np.where(xi == xj,np.zeros_like(xi),np.ones_like(xi))
  

Я получаю это в качестве результата:

 array([['', '', ''],
       ['1', '', '1']], dtype='<U6') 
  

поскольку я сравниваю cat с cat, я хочу присвоить ноль, а там, где он отличается, например, cat vs horse и monkey vs hairy, он должен быть равен 1. Я не понимаю, почему в приведенном выше результате я получаю «? я хочу, чтобы здесь были нули. Как мне это исправить?

Ответ №1:

 np.logical_not(xi == xj).astype(int)
  

вывод будет:

 array([[0, 0, 0],
       [1, 0, 1]])
  

объяснение:
np.logical_not изменения True в False и False в True и astype(int) изменения в 0 и 1