Вы можете использовать векторизованную операцию, поскольку у вас есть пустая матрица. Кроме того, math.sqrt
не разрешает векторизованную операцию, поэтому вы можете использовать np.sqrt
для векторизации операции квадратного корня. Ниже приведен код, в котором вы сохраняете индексы подобия в списке и возвращаете его.
import numpy as np
def cosine_similarity(matrix):
sim_index = []
for row1 in matrix:
for row2 in matrix:
sim_index.append(sum(row1*row2)/np.sqrt(sum(row1**2) * sum(row2**2)))
return sim_index
cosine_similarity(matrix)
# 1.0,0.9985287276116063,0.9943589065201967,0.9995100043150523,0.9986115804314727,0.9985287276116063,1.0,0.9952419798474134,0.9984515542959852,0.9957338741601842,0.9943589065201967,0.9952419798474134,1.0,0.9970632589904104,0.9962784686967592,0.9995100043150523,0.9984515542959852,0.9970632589904104,1.0,0.9992584450362125,0.9986115804314727,0.9957338741601842,0.9962784686967592,0.9992584450362125,1.0
Далее краткий код, используя понимание списка
sim_index = np.array([sum(r1*r2)/np.sqrt(sum(r1**2) * sum(r2**2)) for r1 in matrix for r2 in matrix])
Окончательный список преобразуется в массив для изменения формы для построения графиков.
Визуализация матрицы сходства : Здесь, поскольку каждая строка полностью идентична самой себе, индекс сходства равен 1 (желтый цвет). Следовательно, диагональ построенной матрицы полностью желтая (индекс = 1).
import matplotlib.pyplot as plt
plt.imshow(sim_index.reshape((5,5)))
plt.colorbar()