如何可视化用户群?

时间:2008-09-18 15:41:26

标签: cluster-analysis data-visualization

我有一个应用程序,用户可以相互交互。我希望可视化这些交互,以便我可以确定是否存在用户群(更频繁地进行交互)。

我为每个用户分配了一个2D点(每个坐标在0到1之间)。我的想法是两个用户的点在他们交互时靠得更近,一个“有吸引力的力量”,我只是一遍又一遍地重复浏览我的交互日志。

当然,我需要一种能够将用户分开的“排斥力量”,否则它们都会崩溃到一个点。

首先,我尝试监控每个XY坐标的最低和最高,并对它们的位置进行标准化,但这不起作用,少数相互作用的用户停留在边缘,其余的全部折叠成中间。

有没有人知道我应该使用什么方程来移动点,既可以是用户在互动时的“吸引力”,也可以是“令人厌恶”的力量来阻止他们全部崩溃到一个点?

编辑:在回答问题时,我应该指出,我正在处理大约100万用户,以及用户之间大约1000万次互动。如果有人可以为我推荐一款可以做到这一点的工具,我会全力以赴: - )

3 个答案:

答案 0 :(得分:2)

过去,当我尝试过这种事情时,我使用弹簧模型将链接节点拉到一起,例如:dx = -k*(x-l)dx是位置的变化,x是当前位置,l是所需的分隔,k是你调整的弹簧系数,直到你得到一个好的弹簧强度和稳定性之间的平衡,它将小于0.1。让l > 0确保一切都不会在中间结束。

除此之外,所有节点之间的一般“排斥”力会将它们展开,例如:dx = k / x^2。两个节点越接近,这将越大,调整k以获得合理的效果。

答案 1 :(得分:1)

我可以推荐一些可能性:首先,尝试对交互进行对数缩放或通过sigmoidal函数运行它们来压缩范围。这将为您提供更平滑的视觉空间分布。

独立于此缩放问题:查看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).

最后,考虑一种缩放策略,一种吸引力,以及某种阻力系数而不是排斥力。实际上将事物移近然后可能更远的地方可能会让你产生循环行为。

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

阻力或动量可以被编码为对运动的基本阻力,并且相当于限制运动;它可以以差异方式应用(事物可以根据它们离开的距离,它们在空间中的位置,有多少其他节点靠近等而变慢。)

希望这有帮助。

答案 2 :(得分:0)

弹簧模型是执行此操作的传统方式:基于交互在每个节点之间产生吸引力,并且基于其距离的倒数平方在所有节点之间产生排斥力。然后解决,最小化能量。如果您有多个节点,则可能需要一些相当高级的编程才能获得有效的解决方案。确保起始位置是随机的,并运行程序几次:这样的情况几乎总是有几个局部能量最小值,你想确保你有一个好的。

此外,除非您只有几个节点,否则我会在3D中执行此操作。额外的自由度允许更好的解决方案,您应该能够在3D中可视化集群,如果不比2D更好。