【问题标题】:Markov Clustering in PythonPython中的马尔可夫聚类
【发布时间】:2018-10-19 05:13:36
【问题描述】:

正如标题所说,我正在尝试让马尔可夫聚类算法在 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)

这是 uni 作业的一部分 - 我需要对这个数组进行加权和未加权(尽管加权部分可以等到我完全搞定该死的事情)任何提示或建议?

【问题讨论】:

  • 矩阵的倒数第二列 transition_matrix[:, -2] 总和为 0.88,而不是 1。是否有错字?

标签: python python-3.x algorithm markov-chains


【解决方案1】:

您的转换矩阵无效。

>>> 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 矩阵和 Numpy 数组之间存在一些差异,可能会导致一些细微的错误。

【讨论】:

  • 两点都不错!我已经对此进行了调整。我使用的是 numpy 矩阵,因为它是从基本代码模板更改而来的,我不确定将其转换为数组会做什么。
猜你喜欢
  • 1970-01-01
  • 2012-02-04
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
相关资源
最近更新 更多