海量数据挖掘 - 相似度比较的流式任务

20201005 -

0. 引言

本篇文章起源于我之前设计的一个针对恶意软件进行相似度比较的系统,但是为了快速完成系统原型,在来了新数据之后,为了计算相似度(两两相比),每次都是将全部数据都比较一遍,计算的数量就是 n × ( n − 1 ) 2 \frac{n\times(n-1)}{2} 2n×(n1),这样计算的时间复杂度是 C ( n 2 ) C(n^2) C(n2)。不过,当时采用了多线程的方法,同时通过队列缓存,然后单开一个队列进行批量插入,本质上也没有花费太久的时间,我记得在阿里云上运行这个系统时(通过定时任务保证持续运行),基本上很快就完成了,没有明显的时间拖延。

而本篇文章,就是将这个问题形式化,具体来说一说这个里面应该怎么注意这些问题。
(注:本篇文章仅仅是自己的思考,可能生产环境中目标和采用的技术也不一样,所以可能有所出入)

1. 问题定义

在具体展开之前,先说明以下具体的问题,这个才是最关键的。对于相似度比较来说,前面的一篇文章也提到过,一般分为两种方式,分别是求取相似度最高的 t o p − k top-k topk对,另外一种是针对某个样本或者某条记录,找到和他相似度最高的 t o p − k top-k topk。而在前面的描述中,我要达到的目标是所有对的相似度比较。对于后者来说,因为你要求解的就是全部的相似度比较,没有什么捷径,就硬性比就行了,可以使用多线程或者大数据的处理方式来提高效率。

不过,这篇文章所关注的重点是,我已经有了一批数据,设为集合 S 1 S_1 S1,这批数据已经按照前面的说法进行了相似度比比较,现在来了一批新数据,集合 S 2 S_2 S2,我怎么更新整个 S 1 + S 2 S_1+S_2 S1+S2?从上面的定义上来看,就是想能够利用之前的结果,通过一定的技术手段实现全部集合的结果,但是不会像之前的样子一样,通过全部数据的比较。(从前面的说法上来看,很像是之前了解过的增量学习的东西,本质上就是想利用之前的结果。)

2. 解决方案的初步

不管是全部相似度也好,还是 t o p top top相似度也好,如果不是要求实时得到结果的话,可以一直积累相关的数据,然后通过定时任务每天定时两次或者一次进行任务的执行;这种方案适用于对于相似度这部分需求不是很高的情况,可以容忍当天的数据不是实时的。如果是这样的话,那么基本上就解决了问题,本质上就是离线形式的相似度比较问题。
如果是那种两两相比的,可以做好标记,然后新来的数据和其他的所有数据相比就好了,暂时可以不考虑重复计算的问题,毕竟相比于全部的重复计算,仅仅是新来的数据部分。这种算是一种简单的方式提高效率了。
而对于求解 t o p top top形式,我暂时不太清楚有没有高效的办法,本来实现这种方式的时候,都是采用了一种近似的手段,并不是本身的相似度比较形式。这个是需要考虑的。


而另外一种,就是目前比较流行的那种云服务,将要检测的东西发送到云端,然后云端进行检测,当然这只是一种应用场景,实际上就是来了一条新记录,然后这条记录,要去查有多少个指纹库中的信息跟这个匹配。这种的话本质上就是最早的匹配相关的算法,或者说查找算法。我就是要找这个东西是否在之前的记录中出现过。(但是即使是这部分内容,我这里也没有相关的积累)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值