0

Я использую scipy.cluster.hierarchy для иерархической кластеризации на множестве точек с использованием метрики подобия «косинус». В качестве примера, у меня есть:Иерархическая кластеризация с метрикой сходства косинуса в пакете fcluster

import scipy.cluster.hierarchy as hac 
import matplotlib.pyplot as plt 

Points = 
    np.array([[ 0.   , 0.23508573], 
[ 0.00754775 , 0.26717266], 
[ 0.00595464 , 0.27775905], 
[ 0.01220563 , 0.23622067], 
[ 0.00542628 , 0.14185873], 
[ 0.03078922 , 0.11273108], 
[ 0.06707743 ,-0.1061131 ], 
[ 0.04411757 ,-0.10775407], 
[ 0.01349434 , 0.00112159], 
[ 0.04066034 , 0.11639591], 
[ 0.   , 0.29046682], 
[ 0.07338036 , 0.00609912], 
[ 0.01864988 , 0.0316196 ], 
[ 0.   , 0.07270636], 
[ 0.   , 0.  ]]) 


z = hac.linkage(Points, metric='cosine', method='complete') 
labels = hac.fcluster(z, 0.1, criterion="distance") 


plt.scatter(Points[:, 0], Points[:, 1], c=labels.astype(np.float)) 
plt.show() 

Так как я использую косинуса метрику, в некоторых случаях скалярное произведение двух векторов может быть отрицательным или норма некоторых векторов может быть равно нулю. Это означает, что г выход будет иметь некоторые отрицательные или бесконечные элементы, которые не является действительным для fcluster (как показано ниже):

z = 
[[ 0.00000000e+00 1.00000000e+01 0.00000000e+00 2.00000000e+00] 
[ 1.30000000e+01 1.50000000e+01 0.00000000e+00 3.00000000e+00] 
[ 8.00000000e+00 1.10000000e+01 4.26658708e-13 2.00000000e+00]  
[ 1.00000000e+00 2.00000000e+00 2.31748880e-05 2.00000000e+00] 
[ 3.00000000e+00 4.00000000e+00 8.96700489e-05 2.00000000e+00] 
[ 1.60000000e+01 1.80000000e+01 3.98805492e-04 5.00000000e+00] 
[ 1.90000000e+01 2.00000000e+01 1.33225099e-03 7.00000000e+00] 
[ 5.00000000e+00 9.00000000e+00 2.41120340e-03 2.00000000e+00] 
[ 6.00000000e+00 7.00000000e+00 1.52914684e-02 2.00000000e+00] 
[ 1.20000000e+01 2.20000000e+01 3.52441432e-02 3.00000000e+00] 
[ 2.10000000e+01 2.40000000e+01 1.38662986e-01 1.00000000e+01] 
[ 1.70000000e+01 2.30000000e+01 6.99056531e-01 4.00000000e+00] 
[ 2.50000000e+01 2.60000000e+01 1.92543748e+00 1.40000000e+01] 
[ -1.00000000e+00 2.70000000e+01    inf 1.50000000e+01]] 

Чтобы решить эту проблему, я проверил связь() функцию, так и внутри него мне нужно было проверить _hierarchy.linkage(). Я использую PyCharm текстовый редактор и когда я попросил «связь» исходный код, он открыл питона файл, а именно «_hierarchy.py» внутри каталога, как следующее:

.PyCharm40/system/python_stubs/-1247972723/scipy/cluster/_hierarchy.py 

Этот файл питон не имеет какого-либо определение для всех включенных функций.
Мне интересно, что является правильным источником этой функции для ее пересмотра или есть другой способ решить эту проблему. Буду признателен за ваши советы и подсказки.

ответ

0

У вас есть нулевой вектор 0 0 в ваших данных. Для таких данных Косинусное расстояние не определено, поэтому вы используете неподходящую функцию расстояния! Это пробел определения, который не может быть тривиально замкнутым. inf такой же неправильный, как 0. Расстояние до 0 0 с косинусом не может быть определено без препятствий. Вы не должны использовать косинус для таких данных.

Назад к актуальному вопросу: _hierarchy - это модуль Cython. Это не чистый python, но он скомпилирован в собственный код. Вы можете легко увидеть исходный код на Github:

https://github.com/scipy/scipy/blob/master/scipy/cluster/_hierarchy.pyx

+0

Спасибо @ Anony-мусс. Я не видел, чтобы в моем наборе данных был вектор «0 0»! Я должен исправить другую часть моего кода. Также спасибо за ссылку. Вы мне очень помогли. – Peggy

+0

Почему, на ваш взгляд, подходит косинус? –

+0

Я использую расстояние для косинуса, чтобы выполнить иерархическую кластеризацию в моем наборе данных. После того, как я сделаю сумму по всем элементам каждого кластера. Фактически я ищу приближенный наибольший вектор в каждом кластере. Тогда, я думаю, что косинус-метрика подобия может быть хорошей метрикой. что-то вроде этой цифры: [figure] (https://pegahalizadeh.wordpress.com/figure/). Предлагаете ли вы другие показатели для моего случая? – Peggy