Марковская кластеризация в Python - PullRequest
0 голосов
/ 19 октября 2018

Как видно из названия, я пытаюсь заставить алгоритм кластеризации Маркова работать в Python, а именно Python 3.7

К сожалению, он ничего не делает, и заставляет меня взбираться на стену, пытаясьисправить это.

РЕДАКТИРОВАТЬ: Во-первых, я внес коррективы в основной код, чтобы каждый столбец суммировал до 100, даже если он не идеально сбалансирован.Я попытаюсь объяснить это в окончательном ответе.

Чтобы было ясно, самая большая проблема заключается в том, что числа выходят из-под контроля, превращаясь в такие легко понятные числа, как 5.56268465e-309, иЯ не знаю, как преобразовать это во что-то понятное.

Вот код на данный момент:

import numpy as np
import math
## How far you'd like your random-walkers to go (bigger number -> more walking)
EXPANSION_POWER = 2
## How tightly clustered you'd like your final picture to be (bigger number -> more clusters)
INFLATION_POWER = 2
ITERATION_COUNT = 10
def normalize(matrix):
    return matrix/np.sum(matrix, axis=0)

def expand(matrix, power):
    return np.linalg.matrix_power(matrix, power)

def inflate(matrix, power):
    for entry in np.nditer(transition_matrix, op_flags=['readwrite']):
        entry[...] = math.pow(entry, power)
    return matrix

def run(matrix):
    #np.fill_diagonal(matrix, 1)
    #print(matrix)
    matrix = normalize(matrix)
    print(matrix)
    for _ in range(ITERATION_COUNT):
        matrix = normalize(inflate(expand(matrix, EXPANSION_POWER), INFLATION_POWER))
    return matrix

transition_matrix = np.array ([[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
                                [0.5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
                                [0.5,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
                                [0,0,0.34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
                                [0,0,0.33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
                                [0,0,0.33,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],
                                [0,0,0,0.34,0,0,0,0,0,0,0,0,0,0,0,0,0.125,0],
                                [0,0,0,0.33,0,0,0.5,0,0,0,0,0,0,0,0,0,0.125,1],
                                [0,0,0,0.33,0,0,0.5,1,1,0,0,0,0,0,0,0,0.125,0],
                                [0,0,0,0,0.166,0,0,0,0,0,0,0,0,0,0,0,0.125,0],
                                [0,0,0,0,0.166,0,0,0,0,0.2,0,0,0,0,0,0,0.125,0],
                                [0,0,0,0,0.167,0,0,0,0,0.2,0.25,0,0,0,0,0,0.125,0],
                                [0,0,0,0,0.167,0,0,0,0,0.2,0.25,0.5,0,0,0,0,0,0],
                                [0,0,0,0,0.167,0,0,0,0,0.2,0.25,0.5,0,1,0,0,0.125,0],
                                [0,0,0,0,0.167,0,0,0,0,0.2,0.25,0,1,0,1,0,0.125,0],
                                [0,0,0,0,0,0.34,0,0,0,0,0,0,0,0,0,0,0,0],
                                [0,0,0,0,0,0.33,0,0,0,0,0,0,0,0,0,0.5,0,0],
                                [0,0,0,0,0,0.33,0,0,0,0,0,0,0,0,0,0.5,0,0]])
run(transition_matrix)
print(transition_matrix)

Это часть унифицированного назначения - мне нужно сделать этот массив как взвешенными невзвешенные (хотя взвешенная часть может просто подождать, пока у меня не заработает кровавая штука), какие-либо советы или предложения?

1 Ответ

0 голосов
/ 19 октября 2018

Ваша матрица перехода недействительна.

>>> transition_matrix.sum(axis=0)
>>> matrix([[1.  , 1.  , 0.99, 0.99, 0.96, 0.99, 1.  , 1.  , 0.  , 1.  ,
         1.  , 1.  , 1.  , 0.  , 0.  , 1.  , 0.88, 1.  ]])

Мало того, что некоторые из ваших столбцов не суммируются с 1, некоторые из них с суммой 0.

Это означает, что при попыткенормализуя матрицу, вы получите nan, потому что делите на 0.

Наконец, есть ли причина, по которой вы используете матрицу Numpy вместо просто массива Numpy, который является рекомендуемым контейнеромдля таких данных?Потому что использование массивов Numpy упростит некоторые операции, такие как возведение каждой записи в степень.Кроме того, между матрицей Numpy и массивом Numpy есть некоторые различия, которые могут привести к незначительным ошибкам.

...