Как использовать разреженную матрицу в Python Hcluster?
Я пытаюсь использовать библиотеку hcluster в Python. У меня недостаточно знаний Python, чтобы использовать разреженную матрицу в hcluster. Пожалуйста, помогите мне кто-нибудь. Итак, вот что я делаю:
import os.path
import numpy
import scipy
import scipy.io
from hcluster import squareform, pdist, linkage, complete
from hcluster.hierarchy import linkage, from_mlab_linkage
from numpy import savetxt
from StringIO import StringIO
data.dmp содержит матрицу выглядит так:
A B C D
A 0 1 0 1
B 1 0 0 1
C 0 0 0 0
D 1 1 0 0
и содержит только верхнюю правую часть матрицы. Я не знаю, как правильно писать по-английски:) так что все числа выше главной диагонали, поэтому data.dmp содержит: 1 0 1, 0 1, 0
f = file('data.dmp','r')
s = StringIO(f.readline()).getvalue()
f.close()
matrix = numpy.asarray(eval("["+s+"]"))
по неизвестной мне причине, hcluster использует инвертированные значения, например, я использую 0, если A!=C, и использую 1, если A == D
sqfrm = squareform(matrix)
Y = pdist(sqfrm, metric="cosine")
связь Y
Z = linkage(Y, method="complete")
Итак, мне нужна матрица Z (если я правильно использовал hcluster?)
Но у меня есть следующие проблемы:
Я хочу использовать разреженную матрицу для огромного количества входных данных, потому что генерация входных данных занимает много времени, как сейчас, мне нужно импортировать данные в python из другого языка, поэтому мне нужно прочитать текстовый файл. Пожалуйста, любезно, гуру питона подскажут, как это сделать?
Людям, которые использовали Python hcluster, мне нужно обрабатывать огромное количество данных, сотни строк, это можно сделать в hcluster? Этот алгоритм действительно выдает правильный HAC?
Спасибо за чтение, я ценю любую помощь!
1 ответ
Представлять входные данные каждый в виде словаря, от имени элемента до значения. Нули в словаре отсутствуют.
Вычислите матрицу Y самостоятельно, не используя hcluster.pdist
, Следующий код делает разреженную ошибку в квадрате. Квадратная ошибка эквивалентна косинусному расстоянию, если вы нормализуете все векторы признаков.
def sqrerr(repr1, repr2):
"""
Compute the sqrerr between two reprs.
The reprs are each a dict from feature to feature value.
"""
keys = frozenset(repr1.keys() + repr2.keys())
sqrerr = 0.
for k in keys:
diff = repr1.get(k, 0.) - repr2.get(k, 0.)
sqrerr += diff * diff
return sqrerr
Вы должны вызывать sqrerr для каждого элемента Y[i,j], который вы хотите вычислить.
Сделайте Y квадратной матрицей и убедитесь, что Y[i,j] == Y[j,i]. Используйте метод hcluster.squareform
преобразовать Y в форму, которая хороша для hcluster.linkage
,