如何可视化用户群?

时间:2020-03-06 14:21:59  来源:igfitidea点击:

我有一个用户可以彼此交互的应用程序。我想可视化这些交互,以便确定是否存在用户群(在该群中,交互更为频繁)。

我已经为每个用户分配了一个2D点(每个坐标在0和1之间)。我的想法是,两个用户的点在交互时会彼此靠近,这是一种"吸引力",而我只是一遍又一遍地反复查看我的交互日志。

当然,我需要一种"排斥力",它将用户也推开,否则他们只会崩溃成一个点。

首先,我尝试监视每个XY坐标的最低和最高值,并对它们的位置进行归一化,但这是行不通的,少数互动很少的用户停留在边缘,其余所有用户都陷入了中间。

有谁知道我应该使用什么方程式移动点,既要针对用户交互时的"吸引力"力,又要使他们都陷入单一点的"排斥力"?

编辑:在回答一个问题时,我应该指出,我正在处理大约100万用户,以及用户之间大约1000万的交互。如果有人可以推荐一种可以为我做到这一点的工具,我就会不厌其烦:-)

解决方案

我可以建议一些可能性:首先,尝试对交互进行对数缩放或者通过S型函数运行以压缩范围。这将为我们提供更平滑的间距视觉分布。

独立于此缩放问题:查看graphviz中的某些渲染策略,尤其是程序" neato"和" fdp"。从手册页:

neato  draws  undirected graphs using ``spring'' models (see Kamada and
  Kawai, Information Processing Letters 31:1, April 1989).   Input files
  must  be  formatted  in the dot attributed graph language.  By default,
  the output  of  neato  is  the  input  graph  with  layout coordinates
  appended.

  fdp  draws  undirected  graphs using a ``spring'' model. It relies on a
  force-directed approach in the spirit of Fruchterman and Reingold  (cf.
  Software-Practice & Experience 21(11), 1991, pp. 1129-1164).

最后,考虑一种缩放策略,一种吸引力以及某种阻力系数而不是排斥力。实际上,将事物移近一点,然后再移远一点,可能只会使我们循环行为。

考虑一个模型,其中所有事物最终都会崩溃,但是缓慢。然后运行直到满足某些条件(节点穿过布局区域的中心或者类似区域)。

阻力或者动量可以被编码为对运动的基本抵抗力,并且可以限制运动。可以有差别地应用它(事物可以根据它们走了多远,它们在空间中的位置,还有多少其他节点靠近等而移动得更慢)。

希望这可以帮助。

过去,当我尝试这种方法时,我曾使用spring模型将链接的节点拉在一起,例如:dx = -k *(x-l) dx是位置的变化,x是当前位置,l是所需的间距,k是我们要调整的弹簧系数,直到在弹簧强度和稳定性之间达到平衡为止,小于0.1. l> 0可以确保所有内容不会在中间出现。

除此之外,所有节点之间的一般"排斥"力会将它们散布开来,例如:" dx = k / x ^ 2"。越靠近两个节点,该值将越大,调整" k"以获得合理的效果。

弹簧模型是执行此操作的传统方法:基于交互作用在每个节点之间产生吸引力,并根据其距离的平方反比在所有节点之间产生排斥力。然后解决,将能量降到最低。如果我们有多个节点,则可能需要一些功能强大的编程才能获得有效的解决方案。确保起始位置是随机的,并多次运行该程序:像这样的情况几乎总是在其中包含多个局部能量最小值,并且我们要确保自己有一个好的能量最小值。

另外,除非我们只有几个节点,否则我将以3D方式进行。额外的自由度可以提供更好的解决方案,并且即使不比2D更好,我们也应该能够以3D形式显示群集。