目前,我正在寻找一种开发算法的方法,该算法应该分析大型数据集(大约600M记录)。记录有参数“主叫方”,“被叫方”,“通话时长”,我想在手机用户之间创建一个加权连接图。
整个数据集由类似的记录组成 - 人们大多与他们的朋友交谈并且不拨打随机数字,但偶尔也会有人称为“随机”数字。为了分析记录,我正在考虑以下逻辑:
如果你们中的任何人建议改进上述逻辑,我将不胜感激。
P.S。因此,边缘被指示(主叫方,被叫方)不等于(被叫方,主叫方)
虽然事实上与编程没有关系,但我想强调一点,由于法律和对用户隐私的尊重,所有可能揭示用户身份的信息在分析之前都已被散列。
答案 0 :(得分:1)
与大型数据集一样,关于值的分布的信息越多,您就可以越好地定制算法。例如,如果您知道只有1000个不同的电话号码需要考虑,您可以创建一个1000x1000阵列来编写统计数据。
您的第一步应该是分析数据集中的数据分布。
如果没有关于您的数据的任何进一步信息,我倾向于建议您创建一个哈希表。读取600M数据集中的每条记录,并根据呼叫号码和被叫号码的串联计算哈希地址。在该地址的表中写下调用号码和被叫号码(稍后你需要它们,并记住散列可能是不可逆转的),在呼叫次数上加1,并将持续时间加到总持续时间。重复600M次。
现在您有一个包含所需数据的哈希表。
答案 1 :(得分:0)
由于有600条M记录,它似乎足以利用数据库(并且不会太大而不需要分布式数据库)。因此,您只需将其加载到数据库(MySQL,SQLServer,Oracle等)中并运行以下查询:
select_party选择calling_party,called_party,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在内部执行的操作与您以编程方式执行的操作类似:
存储和查找(calling_party,called_party)记录的好方法是使用哈希函数并从存储桶中查找匹配记录。
虽然为(calling_party,called_party)创建一个二维数组可能很有诱惑力,但这将是一个非常稀疏数组(非常浪费)。
答案 2 :(得分:0)
如果您想要快速且经常适应的结果,那么请注意具有良好记忆和密度的密集表示。时间局部性很容易在性能上产生巨大的差异。特别是,在大O符号中,这很容易超过因子nn;您可以从哈希表上的密集排序表示中受益。和数据库?那些真的慢。如果你可以完全避免它,请不要碰那些;它们可能是10000倍的因素 - 或者更多,您想要对结果执行的查询越复杂。
答案 3 :(得分:0)
只需按“主叫方”排序记录,然后按“被叫方”排序。这样每个唯一的对将在连续的位置出现。因此,您可以在一次通过中计算每对(主叫方,被叫方)的重量,而且内存很少。
对于排序,您可以单独对小块进行排序,然后执行N路合并排序。这是内存效率高,可以轻松并行化。