Python 简单聚类算法的Numpy实现

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,

我想使用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,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}