Я использую 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
Этот файл питон не имеет какого-либо определение для всех включенных функций.
Мне интересно, что является правильным источником этой функции для ее пересмотра или есть другой способ решить эту проблему. Буду признателен за ваши советы и подсказки.
Спасибо @ Anony-мусс. Я не видел, чтобы в моем наборе данных был вектор «0 0»! Я должен исправить другую часть моего кода. Также спасибо за ссылку. Вы мне очень помогли. – Peggy
Почему, на ваш взгляд, подходит косинус? –
Я использую расстояние для косинуса, чтобы выполнить иерархическую кластеризацию в моем наборе данных. После того, как я сделаю сумму по всем элементам каждого кластера. Фактически я ищу приближенный наибольший вектор в каждом кластере. Тогда, я думаю, что косинус-метрика подобия может быть хорошей метрикой. что-то вроде этой цифры: [figure] (https://pegahalizadeh.wordpress.com/figure/). Предлагаете ли вы другие показатели для моего случая? – Peggy