Используйте функцию подобия для кластеризации scikit-learn



Я использую функцию для вычисления сходства между парой документов и хочу выполнить кластеризацию, используя эту меру сходства.

Код пока



Sim=np.zeros((n, n)) # create a numpy arrary  
i=0
j=0
for i in range(0,n):
for j in range(i,n):
if i==j:
Sim[i][j]=1
else:
Sim[i][j]=simfunction(list_doc[i],list_doc[j]) # calculate similarity between documents i and j using simfunction
Sim=Sim+ Sim.T - np.diag(Sim.diagonal()) # complete the symmetric matrix

AggClusterDistObj=AgglomerativeClustering(n_clusters=num_cluster,linkage='average',affinity="precomputed")
Res_Labels=AggClusterDistObj.fit_predict(Sim)


Меня беспокоит то , что здесь я использовал функцию подобия, и я думаю, что в соответствии с документами это должна быть матрица несходства, как я могу изменить ее на матрицу несходства.
Кроме того, что было бы более эффективным способом сделать это.
473   1  

1 ответ:

  • Пожалуйста, отформатируйте ваш код правильно , поскольку отступ имеет значение в Python.

  • Если возможно, сохраните код полным (вы пропустили import numpy as np).

  • Поскольку range всегда начинается с нуля, вы можете опустить его и написать range(n).

  • Индексация в numpy работает как [i, j, k, ...].
    Поэтому вместо Sim[i][j] Вы на самом деле хотите написать Sim[i, j], потому что в противном случае вы делаете две операции: сначала берете весь срез строки, а затем индексируете колонка. Вот еще один способ скопировать элементы верхнего треугольника в Нижний

    Sim = np.identity(n) # diagonal with ones (100 percent similarity)
    
    for i in range(n):      
        for j in range(i+1, n):    # +1 skips the diagonal 
            Sim[i, j]= simfunction(list_doc[i], list_doc[j])
    
    # Expand the matrix (copy triangle)
    tril = np.tril_indices_from(Sim, -1) # take lower & upper triangle's indices
    triu = np.triu_indices_from(Sim, 1)  # (without diagonal)
    Sim[tril] = Sim[triu]
    
  • Предположим, что у вас действительно есть сходство в пределах диапазона (0, 1), чтобы преобразовать вашу матрицу подобия в матрицу расстояния, вы можете просто сделать

    dm = 1 - Sim

    Эта операция будет векторизована numpy

Comments

    Ничего не найдено.