我正在使用Python 2.7。我的路由由相互连接的节点阵列组成。节点由字符串键标识,但为了方便起见,我将使用数字:
sample_route = [1,2,3,4,7]
#obviously over-simplified; real things would be about 20-40 elements long
我将使用zip创建一个由元组点连接组成的set
,最终会像:
set([(1,2),(2,3),(3,4),(4,7)])
我需要一种方法来过滤掉一些非常相似的路由(比如一个或两个添加的节点),并使用最近路径中的最小路径。我现在的计划是:
从第一条(可能是最佳的)路线开始。迭代其余路线,并使用以下公式计算其与步骤1中序列的相似性:
matching = len(value1.difference(value2)) + len(value2.difference(value1))
#value1, value2 = two compared sets
数字越低,越相似。 但根据路线与其他路线的相似性对路线进行分组的好方法是什么?它们的长度都不同。我从未参加统计课程。
示例:
sets = [
set([(1,2),(2,3),(3,4),(4,5),(5,10)]),
set([(1,2),(2,3),(3,4),(4,6),(6,5),(5,10)]),
set([(1,7),(7,3),(3,8),(8,7),(7,6),(6,5),(5,10)]),
set([(1,2),(2,3),(3,4),(4,6),(6,5),(5,10)]),
set([(1,9),(9,4),(4,5),(5,10)]),
set([(1,9),(9,4),(4,6),(6,5),(5,10)])
]
在此示例中,分组可能类似于[[1,2,4],[3],[5,6]]
,其中1,2和4非常相似,5和6相似,而3则不在其他任何一个附近。作为示例,1到2的得分为2,而3到6的得分为8。这是我正在使用的那种数据(虽然这些都是易于阅读的简化)。
这有一段时间的好处。如果我可以删除多余的路线,我将减少相当长的时间。
答案 0 :(得分:0)
我建议查看networkx包。它允许您创建您描述的有向图。为了测量2条路线的相似性,我建议使用Jaccard相似性指数。以下是显示您所示示例的代码。
首先,导入一些库:图形,绘图和数字python。然后通过添加编号为1到8的节点来构建有向图。构建从节点到节点的连接以构建路径。 networkx包具有内置功能,可以从一个节点到另一个节点查找图中的所有路径:nx.all_simple_paths(g, start_node, end_node)
。
获得所有路径后,您可以计算路径之间Jaccard相似性的矩阵J
。实际上,您希望如何根据相似性对路径进行聚类取决于您。
import networkx as nx
import matplotlib.pyplot as plt
import numpy as np
g = nx.DiGraph()
g.add_nodes_from(range(1,8))
g.add_edges_from([(1,2),(2,3),(3,4),(4,7)]) #path 1,2,3,4,7
g.add_edges_from([(4,5),(5,7)]) #path 1,2,3,4,5,7
g.add_edges_from([(4,6),(6,7)]) #path 1,2,3,4,6,7
paths_iter = nx.all_simple_paths(g,1,7)
paths = [p for p in paths]
np.random.seed(100000)
nx.draw_spring(g, with_labels=True)
plt.show()
def jaccard(v1, v2):
return (len(np.intersect1d(v1,v2))+0.0)/len(np.union1d(v1,v2))
J = np.zeros([len(paths),len(paths)])
for i in range(J.shape[0]):
for j in range(i, J.shape[1]):
J[i,j] = J[j,i] = jaccard(paths[i],paths[j])
print J
> [[ 1. 0.71428571 0.83333333]
> [ 0.71428571 1. 0.83333333]
> [ 0.83333333 0.83333333 1. ]]
修改强> 由于您有一个度量标准来比较路径之间的相似性,因此请查看k-means群集以将路径聚合在一起。
from scipy.cluster.vq import kmeans2
从现在开始,我没有足够的代码或数据来帮助我们。