Как использовать разреженную матрицу в Python Hcluster? - PullRequest
3 голосов
/ 05 декабря 2010

Я пытаюсь использовать библиотеку 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?)

Но у меня есть следующие проблемы:

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

  2. Для людей, которые использовали Python Hcluster, мне нужно обработать огромный количество данных, сотни строк, это можно сделать в hcluster? Этот алгоритм действительно производит правильный HAC

Спасибо за чтение, я ценю любую помощь!

1 Ответ

2 голосов
/ 17 января 2011

Представляет входные данные каждый в виде словаря, от имени элемента до значения.Нули в словаре отсутствуют.

Вычислите матрицу Y самостоятельно, не используя hcluster.pdist.Следующий код делает разреженную квадратичную ошибку.Квадратная ошибка эквивалентна косинусному расстоянию IF , вы l2 нормализуете все векторы объектов.

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.

...