通过两个属性从列表聚类相关项构建图的更好方法

时间:2013-07-06 19:27:02

标签: python-2.7 graph

我有一个歌曲列表。对于每首歌我都有艺术家,作家和流派。

我想创建有向图,以便查找模式。

所以,我希望每个艺术家都有一个节点,所以我将从基于艺术家的歌曲聚类开始。

然后我想找到作曲家并以某种方式安排已经聚集的歌曲,使他们接近作家。

稍后我也将根据流派进行分组,但我仍然坚持前两个。

所以,我的第一种方法是做一些像(未经测试)的事情:

pos_x = 20
for x in songs:
    pos_y = 20
    artist_list = [s for s in songs if s.artist==x.artist]
    for y in len(artist_list):
        artist_list[y].x = pos_x
        pos_x += 10 * len(artist_list[y].title)
        artist_list[y].y = pos_y
        pos_y += 10

然后我会循环播放艺术家列表,创建初始图表,但是当一首歌上有多位艺术家时会出现问题,例如我们是世界

但是,我相信Python这是一个非常有缺陷的方法,因为我的下一个方法是拍摄歌曲,使它们与艺术家保持相对接近,但是为了得到作曲家并对组进行小的改动而放弃那些相关的人,所以艺术家的歌曲集群可能会被移动。

我正在使用pyglet来执行此操作,所以基本上我在OpenGL中执行此操作。

我能做的实际定位,但这是我关注的方法,因为我不知道如何处理这个问题。

更新

我正在寻找的是:

   Song A1          Song A3       Song A2         

                      Artist A     
                                  Artist B

   Song B1                      Song B2

我的线路从A1,A2,A3到艺术家A,B1,B2到艺术家B,但A3和B1,B2连接到艺术家B,但我也希望艺术家B的位置更接近A2和B2这两首歌有着相同的作曲家。

因此,艺术家将成为一个与歌曲分开的新节点,但每个群集中歌曲的实际位置将取决于至少一个其他关系。后来我也可能最终表现出这种关系,这就是为什么我现在在3D中进行映射。

1 个答案:

答案 0 :(得分:2)

我将采用的方法是在Python中生成一个有向图,可以写成“点”格式并由Graphviz(http://www.graphviz.org)呈现。 Graphviz和点格式是用于定义和渲染复杂图形的已建立工具。

好消息是有些Python库允许您以Pythonic方式定义图形,然后用一行代码写出点文件。 PyGraphviz看起来是个不错的选择:http://networkx.lanl.gov/pygraphviz。您可以在Python中创建图形的结构,这就像定义歌曲和艺术家之间,歌曲和作曲家之间的边缘一样简单,等等。以下是PyGraphviz教程的片段:

>>> G.add_node('a') # adds node 'a'
>>> G.add_edge('b','c') # adds edge 'b'-'c' (and also nodes 'b', 'c')

然后只需编写点文件并将其加载到Graphviz中,这将在2d空间中布置节点。有各种布局算法,因此您可以对它们进行试验,以便以最有用的方式对歌曲进行聚类。