Python 简单聚类算法的Numpy实现
我想使用python实现一个简单的集群算法。首先,我将描述问题: 我有一些点,每个点由一个Python 简单聚类算法的Numpy实现,python,numpy,Python,Numpy,我想使用python实现一个简单的集群算法。首先,我将描述问题: 我有一些点,每个点由一个id表示,每个点对之间有一个配对概率,即prob(id1,id2)=一些_值。这是在形状[N,3]的numpy数组中排列的,其中N是所有可能的点对的数目。为了更清楚地说明这一点,这里有一个示例数组: a = np.array([[1,2, 0.9], [2,3, 0.63], [3,4, 0.98], [4,5, 0.1], [5,6, 0.98], [6,
id
表示,每个点对之间有一个配对概率,即prob(id1,id2)=一些_值
。这是在形状[N,3]
的numpy数组中排列的,其中N是所有可能的点对的数目。为了更清楚地说明这一点,这里有一个示例数组:
a = np.array([[1,2, 0.9],
[2,3, 0.63],
[3,4, 0.98],
[4,5, 0.1],
[5,6, 0.98],
[6,7, 1]])
其中前两个条目是点ID,第三个条目是它们相互属于的概率
聚类问题是通过概率cut
cut=0.5
的连接点,即点1、2、3、4属于同一个聚类,点5、6、7属于另一个聚类。我目前的解决方案是通过在唯一的点ID和数组上循环两次,创建一个列表(点ID列表),即l=[[1,2,3,4],[5,6,7]
。有没有更聪明、更快的方法来解决这个问题?您描述的问题是一个图形问题。包中实现了许多常见的图算法
如果您的阈值是用石头写的,您可以预先应用它,并根据剩余数据构建您的阈值:
G = nx.Graph()
G.add_weighted_edges_from(a[a[:, -1] >= threshold])
如果要在图中使用阈值,可以使用整个数组进行构建并删除图中的边。这将比预处理版本慢:
G = nx.Graph()
G.add_weighted_edges_from(a)
G.remove_edges_from(e for e in g.edges if g.get_edge_data(*e) < threshold)
我不知道你是如何从你发布的示例数据中得到这个结果的。
[1,2,3,4],[5,6,7]
。5,6属于同一个集群,使之成为一个单独的集群。@AKX这是因为[1,2]
通过切割[0.5
,也[2,3],[3,4]
即1,2,3和4属于同一集群,但是[4,5]不通过剪切,类似于<代码> [5],[6],[7] [Koal] >谢谢,这是非常好的,只是另一个问题:C++有类似的工具吗?@ WaleDeSmail。我肯定有。查找“C++图形算法”或类似内容。另外,如果这对你有帮助,别忘了投票。
G = nx.Graph()
G.add_weighted_edges_from(a)
G.remove_edges_from(e for e in g.edges if g.get_edge_data(*e) < threshold)
G.remove_edges_from(a[a[:, -1] < threshold]])
G.remove_edges_from(r for r in a if r[-1] < threshold)
>>> nx.number_connected_components(G)
2
>>> for c in nx.connected_components(G):
... print(c)
{1.0, 2.0, 3.0, 4.0}
{5.0, 6.0, 7.0}