- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一些通过转移概率链接的状态(嵌入在转移矩阵中,如马尔可夫链中)。我想通过仅考虑足够高的概率来总结此转换矩阵,以便它们允许从一个状态(〜节点)转到另一个状态(我的转换矩阵中的第一个和最后一个)。一个阈值,这样如果我只考虑更高的概率,我的转换矩阵永远不允许从第一个状态(或节点)移动到最后一个状态(或节点)。
两个问题:
是否有一些知名的库(最好是Python语言)实现了这种方法?我的天真/经验/原型(prototype)方法将是一个循环,它降低阈值,然后检查我是否可以从第一个状态流过过渡矩阵到最后一个状态(距离矩阵中的最佳路径算法?)。但这可能需要非常长的计算时间?
Example 1:
DistMatrix = [[ 'a', 'b', 'c', 'd'],
['a', 0, 0.3, 0.4, 0.1],
['b', 0.3, 0, 0.9, 0.2],
['c', 0.4, 0.9, 0, 0.7],
['d', 0.1, 0.2, 0.7, 0]]
states are a,b,c,d. I want to find the value (threshold) that allow to go from a to d (no matter if other states are walked)
Naive approach:
- first loop: threshold 0.9, I get rid of lesser probabilities: I can only connect c and b
- second loop: threshold 0.7, I get rid of lesser probabilities: I can only connect c, b, d
- third loop: threshold 0.4, I get rid of lesser probabilities: I can connect a,c, b, d: here is my threshold: 0.4
--> 当我的转换矩阵有数千个状态时,应该会变得非常复杂? --> 提出算法?
Example 2:
DistMatrix =
[ 'a', 'b', 'c', 'd'],
['a', 0, 0.3, 0.4, 0.7],
['b', 0.3, 0, 0.9, 0.2],
['c', 0.4, 0.9, 0, 0.1],
['d', 0.7, 0.2, 0.1, 0] ]
states are a,b,c,d. I want to find the value (threshold) that allow to go from a to d (no matter if other states are walked)
Naive approach:
-first loop: threshold 0.9, I get rid of all others: I can only connect c and b
-second loop: threshold 0.7, I get rid of lesser connexion: I connect b and c, and a and d but because a and d are connected, I have my threshold!
最佳答案
为了扩展 E 先生的建议,这里有两个版本的算法,可以在具有数千个节点的图上正常工作。两个版本都使用Numpy第二个也使用 NetworkX .
您需要删除“a”、“b”、“c”和“d”标识符才能使用 Numpy 数组。通过将节点名称转换为 0 到 len(nodes) 之间的整数,可以轻松完成此操作。您的数组应如下所示
DistMatrix1 = np.array([[0, 0.3, 0.4, 0.1],
[0.3, 0, 0.9, 0.2],
[0.4, 0.9, 0, 0.7],
[0.1, 0.2, 0.7, 0]])
DistMatrix2 = np.array([[0, 0.3, 0.4, 0.7],
[0.3, 0, 0.9, 0.2],
[0.4, 0.9, 0, 0.1],
[0.7, 0.2, 0.1, 0]])
使用numpy.unique
获取距离矩阵中所有概率的排序数组。然后,按照 E 先生的建议执行标准二分搜索。在二分搜索的每一步,如果矩阵中的条目低于当前概率,则将其替换为 0。在图上运行广度优先搜索,从第一个节点开始,然后查看是否到达最后一个节点。如果符合,则阈值较高,否则,阈值较低。 bfs代码实际上改编自NetworkX版本。
import numpy as np
def find_threshold_bfs(array):
first_node = 0
last_node = len(array) - 1
probabilities = np.unique(array.ravel())
low = 0
high = len(probabilities)
while high - low > 1:
i = (high + low) // 2
prob = probabilities[i]
copied_array = np.array(array)
copied_array[copied_array < prob] = 0.0
if bfs(copied_array, first_node, last_node):
low = i
else:
high = i
return probabilities[low]
def bfs(graph, source, dest):
"""Perform breadth-first search starting at source. If dest is reached,
return True, otherwise, return False."""
# Based on http://www.ics.uci.edu/~eppstein/PADS/BFS.py
# by D. Eppstein, July 2004.
visited = set([source])
nodes = np.arange(0, len(graph))
stack = [(source, nodes[graph[source] > 0])]
while stack:
parent, children = stack[0]
for child in children:
if child == dest:
return True
if child not in visited:
visited.add(child)
stack.append((child, nodes[graph[child] > 0]))
stack.pop(0)
return False
速度较慢但较短的版本使用 NetworkX。在二分查找中,不运行 bfs,而是将矩阵转换为 NetworkX 图并检查是否存在从第一个节点到最后一个节点的路径。如果有路径,则阈值较高,如果没有路径,则阈值较低。这很慢,因为 NetworkX 中的所有图形数据结构的效率都比 Numpy 数组低得多。然而,它的优点是可以访问许多其他有用的算法。
import networkx as nx
import numpy as np
def find_threshold_nx(array):
"""Return the threshold value for adjacency matrix in array."""
first_node = 0
last_node = len(array) - 1
probabilities = np.unique(array.ravel())
low = 0
high = len(probabilities)
while high - low > 1:
i = (high + low) // 2
prob = probabilities[i]
copied_array = np.array(array)
copied_array[copied_array < prob] = 0.0
graph = nx.from_numpy_matrix(copied_array)
if nx.has_path(graph, first_node, last_node):
low = i
else:
high = i
return probabilities[low]
NetworkX 版本在具有一千多个节点的图表上崩溃(在我的笔记本电脑上)。 bfs版本可以轻松找到几千个节点的图的阈值。
代码运行示例如下。
In [5]: from percolation import *
In [6]: print('Threshold is {}'.format(find_threshold_bfs(DistMatrix1)))
Threshold is 0.4
In [7]: print('Threshold is {}'.format(find_threshold_bfs(DistMatrix2)))
Threshold is 0.7
In [10]: big = np.random.random((6000, 6000))
In [11]: print('Threshold is {}'.format(find_threshold_bfs(big)))
Threshold is 0.999766933071
对于时间安排,我得到(在半新的 Macbook Pro 上):
In [5]: smaller = np.random.random((100, 100))
In [6]: larger = np.random.random((800, 800))
In [7]: %timeit find_threshold_bfs(smaller)
100 loops, best of 3: 11.3 ms per loop
In [8]: %timeit find_threshold_nx(smaller)
10 loops, best of 3: 94.9 ms per loop
In [9]: %timeit find_threshold_bfs(larger)
1 loops, best of 3: 207 ms per loop
In [10]: %timeit find_threshold_nx(larger)
1 loops, best of 3: 6 s per loop
希望这有帮助。
我修改了 bfs 代码,以便每当到达目标节点时它就会停止。上述代码和时序已更新。
关于python - 在加权网络中查找 "percolation"阈值的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13607022/
滑动窗口限流 滑动窗口限流是一种常用的限流算法,通过维护一个固定大小的窗口,在单位时间内允许通过的请求次数不超过设定的阈值。具体来说,滑动窗口限流算法通常包括以下几个步骤: 初始化:设置窗口
表达式求值:一个只有+,-,*,/的表达式,没有括号 一种神奇的做法:使用数组存储数字和运算符,先把优先级别高的乘法和除法计算出来,再计算加法和减法 int GetVal(string s){
【算法】前缀和 题目 先来看一道题目:(前缀和模板题) 已知一个数组A[],现在想要求出其中一些数字的和。 输入格式: 先是整数N,M,表示一共有N个数字,有M组询问 接下来有N个数,表示A[1]..
1.前序遍历 根-左-右的顺序遍历,可以使用递归 void preOrder(Node *u){ if(u==NULL)return; printf("%d ",u->val);
先看题目 物品不能分隔,必须全部取走或者留下,因此称为01背包 (只有不取和取两种状态) 看第一个样例 我们需要把4个物品装入一个容量为10的背包 我们可以简化问题,从小到大入手分析 weightva
我最近在一次采访中遇到了这个问题: 给出以下矩阵: [[ R R R R R R], [ R B B B R R], [ B R R R B B], [ R B R R R R]] 找出是否有任
我正在尝试通过 C++ 算法从我的 outlook 帐户发送一封电子邮件,该帐户已经打开并记录,但真的不知道从哪里开始(对于 outlook-c++ 集成),谷歌也没有帮我这么多。任何提示将不胜感激。
我发现自己像这样编写了一个手工制作的 while 循环: std::list foo; // In my case, map, but list is simpler auto currentPoin
我有用于检测正方形的 opencv 代码。现在我想在检测正方形后,代码运行另一个命令。 代码如下: #include "cv.h" #include "cxcore.h" #include "high
我正在尝试模拟一个 matlab 函数“imfill”来填充二进制图像(1 和 0 的二维矩阵)。 我想在矩阵中指定一个起点,并像 imfill 的 4 连接版本那样进行洪水填充。 这是否已经存在于
我正在阅读 Robert Sedgewick 的《C++ 算法》。 Basic recurrences section it was mentioned as 这种循环出现在循环输入以消除一个项目的递
我正在思考如何在我的日历中生成代表任务的数据结构(仅供我个人使用)。我有来自 DBMS 的按日期排序的任务记录,如下所示: 买牛奶(18.1.2013) 任务日期 (2013-01-15) 任务标签(
输入一个未排序的整数数组A[1..n]只有 O(d) :(d int) 计算每个元素在单次迭代中出现在列表中的次数。 map 是balanced Binary Search Tree基于确保 O(nl
我遇到了一个问题,但我仍然不知道如何解决。我想出了如何用蛮力的方式来做到这一点,但是当有成千上万的元素时它就不起作用了。 Problem: Say you are given the followin
我有一个列表列表。 L1= [[...][...][.......].......]如果我在展平列表后获取所有元素并从中提取唯一值,那么我会得到一个列表 L2。我有另一个列表 L3,它是 L2 的某个
我们得到二维矩阵数组(假设长度为 i 和宽度为 j)和整数 k我们必须找到包含这个或更大总和的最小矩形的大小F.e k=7 4 1 1 1 1 1 4 4 Anwser是2,因为4+4=8 >= 7,
我实行 3 类倒制,每周换类。顺序为早类 (m)、晚类 (n) 和下午类 (a)。我固定的订单,即它永远不会改变,即使那个星期不工作也是如此。 我创建了一个函数来获取 ISO 周数。当我给它一个日期时
假设我们有一个输入,它是一个元素列表: {a, b, c, d, e, f} 还有不同的集合,可能包含这些元素的任意组合,也可能包含不在输入列表中的其他元素: A:{e,f} B:{d,f,a} C:
我有一个子集算法,可以找到给定集合的所有子集。原始集合的问题在于它是一个不断增长的集合,如果向其中添加元素,我需要再次重新计算它的子集。 有没有一种方法可以优化子集算法,该算法可以从最后一个计算点重新
我有一个包含 100 万个符号及其预期频率的表格。 我想通过为每个符号分配一个唯一(且前缀唯一)的可变长度位串来压缩这些符号的序列,然后将它们连接在一起以表示序列。 我想分配这些位串,以使编码序列的预
我是一名优秀的程序员,十分优秀!