分析具有相似记录的大型数据集的最佳方法是什么?

时间:2010-09-19 08:54:06

标签: algorithm

目前,我正在寻找一种开发算法的方法,该算法应该分析大型数据集(大约600M记录)。记录有参数“主叫方”,“被叫方”,“通话时长”,我想在手机用户之间创建一个加权连接图。

整个数据集由类似的记录组成 - 人们大多与他们的朋友交谈并且不拨打随机数字,但偶尔也会有人称为“随机”数字。为了分析记录,我正在考虑以下逻辑:

  1. 创建一个数字数组,以指示哪些记录(行号)已被扫描。
  2. 从第一行开始扫描并为第一行组合“主叫方”,“被叫方”检查数据库中的相同组合  将呼叫持续时间相加并将结果除以所有呼叫持续时间的总和  将求和行的数量添加到开头创建的数组中
  3. 检查数组是否已经汇总了下一个记录号 如果已经汇总,则跳过记录,否则执行步骤2
  4. 如果你们中的任何人建议改进上述逻辑,我将不胜感激。

    P.S。因此,边缘被指示(主叫方,被叫方)不等于(被叫方,主叫方)

    虽然事实上与编程没有关系,但我想强调一点,由于法律和对用户隐私的尊重,所有可能揭示用户身份的信息在分析之前都已被散列。

4 个答案:

答案 0 :(得分:1)

与大型数据集一样,关于值的分布的信息越多,您就可以越好地定制算法。例如,如果您知道只有1000个不同的电话号码需要考虑,您可以创建一个1000x1000阵列来编写统计数据。

您的第一步应该是分析数据集中的数据分布。

如果没有关于您的数据的任何进一步信息,我倾向于建议您创建一个哈希表。读取600M数据集中的每条记录,并根据呼叫号码和被叫号码的串联计算哈希地址。在该地址的表中写下调用号码和被叫号码(稍后你需要它们,并记住散列可能是不可逆转的),在呼叫次数上加1,并将持续时间加到总持续时间。重复600M次。

现在您有一个包含所需数据的哈希表。

答案 1 :(得分:0)

由于有600条M记录,它似乎足以利用数据库(并且不会太大而不需要分布式数据库)。因此,您只需将其加载到数据库(MySQL,SQLServer,Oracle等)中并运行以下查询:

select_party选择calling_party,called_pa​​rty,sum(call_duration),avg(call_duration),min(call_duration),max(call_duration),call(*)来自call_logy,call_party order by 7 desc

那将是一个开始。

接下来,您可能希望运行一些关联分析(可能使用Weka),或者您可能希望将此信息分析为多维数据集(可能使用Mondrian / OLAP)。如果您告诉我们更多信息,我们可以为您提供更多帮助。

在算法上,DB在内部执行的操作与您以编程方式执行的操作类似:

  1. 扫描每条记录
  2. 查找每个(calling_party,called_pa​​rty)组合的记录,并更新其统计信息。
  3. 存储和查找(calling_party,called_pa​​rty)记录的好方法是使用哈希函数并从存储桶中查找匹配记录。

    虽然为(calling_party,called_pa​​rty)创建一个二维数组可能很有诱惑力,但这将是一个非常稀疏数组(非常浪费)。

答案 2 :(得分:0)

  1. 您需要多长时间才能执行此分析?如果这是一个庞大的,独特的数据集,因此只需要一次或两次 - 不要过于担心性能,只需完成它,例如正如Amrinder Arora所说,你碰巧使用简单的现有工具。
  2. 您确实需要有关分发的更多信息,正如高性能标记所说。对于初学者来说,很高兴知道唯一电话号码的数量,唯一电话号码对的数量,以及每个唯一电话号码的呼叫/被叫电话号码的平均值,差异和最大值。
  3. 您确实需要有关要对结果执行的分析的更多信息。例如,您对整体统计数据或识别单个群集更感兴趣吗?您是否更关心向前跟踪链接(确定X经常调用的人)或向后跟踪链接(确定谁经常被调用X)?您是否希望将此图的概览投影到低维空间,即2d?应该很容易识别间接链接 - 例如X在{A,B,C}附近,所有人都在Y附近,所以X在Y附近排序?
  4. 如果您想要快速且经常适应的结果,那么请注意具有良好记忆和密度的密集表示。时间局部性很容易在性能上产生巨大的差异。特别是,在大O符号中,这很容易超过因子nn;您可以从哈希表上的密集排序表示中受益。和数据库?那些真的慢。如果你可以完全避免它,请不要碰那些;它们可能是10000倍的因素 - 或者更多,您想要对结果执行的查询越复杂。

答案 3 :(得分:0)

只需按“主叫方”排序记录,然后按“被叫方”排序。这样每个唯一的对将在连续的位置出现。因此,您可以在一次通过中计算每对(主叫方,被叫方)的重量,而且内存很少。

对于排序,您可以单独对小块进行排序,然后执行N路合并排序。这是内存效率高,可以轻松并行化。