基于lsh的增量学习分类器、海量数据分类处理复杂度O(1)准确度超越KNN

    目前分类器主要有 svm knn 神经网络等。各自有优点,应用在很多行业,只有knn具备增量学习的能力。但是knn无法处理海量数据,因为knn需要搜索查找最近的数据。虽然有kd树等方法,但是在高维数据上无能为力。图像数据声音数据等的分类上,大部分都是高维数据,动辄几十上百维。Svm 是全局最优解,需要所有的样本数据参加计算。其他的各种分类算法就不一一例举了,网上有很多资料。目前为止没有一个算法能做到完美的增量学习和海量数据处理。为什么需要海量数据处理?智能来自于大量的数据背后发现其各种规律和模式,所以必须具备海量数据处理的能力。

目前提出基于lsh增强knn算法。LSH (local sensitive hash), 该算法就是针对高维海量数据的处理。是近似最近邻查找(Approximate Nearest Neighbor, ANN),在一定概率上毕竟KNN。目前有E2LSH KLSH 等算法,能够在很大的概率上接近KNN的效果。

但目前仍然无法做到O(1)的复杂度。如果要对海量数据处理,需要具备近似 O1 或者O log(N) 的复杂度,暂时忽略维度,对lsh来说维度影响都不具备维数灾难。否则当数据量到一定程度比如百万千万级别,都会无法做到实时响应。

另一个问题是当前的LSH算法需要计算数据集的分布模型。如e2lsh 是依据p稳态分布,需要计算分布的参数,才能得到高的召回率和分类速度,无法用于增量学习。

目前使用以下思路解决当前lsh面临的问题,并且准确度超过原始KNN,其他lsh只能无限接近KNN:

1、  使用自适应的lsh树。

2、  多临近桶探测。

3、  多颗lsh树组成森林。

4、  局部结构化处理。

第三点的加入,在小样本下mnist 手写字数据集,各类10个样本。(以下测试都基于该数据集)。能超越knn 15%的准确度,非常接近SVM的性能。当然本算法自为了海量数据处理,所以小样本不重要。在mnist全数据集下,也超越knn(94.5%) 1%左右,接近svm(96.5%),介于 knn和svm之间,为95.65%。

1.1  自适应lsh树

扫描二维码关注公众号,回复: 1582027 查看本文章

由于lsh本身具备局部敏感性所以,当桶bucket的数据量到达一定数量时候,自动分裂添加子lsh进行进一步lsh映射。这样不需要预先估计数据的分布,桶分裂不影响其他桶的数据,自动适应数据的分布状态。

1.2 多个临近桶探测

使用多个临近桶探测可以提高真实knn的概率,减少lsh树的数量。目前使用8棵树已经超越knn本身的准确度。Mnist全数据集。

1.3 多颗lsh树组成森林

使用多颗lsh树返回临近桶计算knn,能获得很高的准确度。在mnist全数据集上,16棵树就接近了svm的性能。8棵树就超越KNN

1.4 局部结构化

         这个目前保留一下吧?该局部化处理也是动态增量处理,无需所有样本。

经过以上的方法处理数据,已经能获得超越knn的效果。第四点方法不使用的情况下也会很接近knn的效果。使用局部结构化,才能超越knn的效果。

1)经过以上处理,分类效果已经超越knn,同时lsh树数量很小。

2)如何增量学习?基于lsh树自动分裂。无需提前知道样本的分布,自动分裂适应。分裂过程不影响其他桶,只是在桶内进行。所以无论样本数据如何输入,一起输入还是分块在不同输入,最终的分类树都是同样的。

3)另外如何保证搜索复杂度O1.? 所有的搜索都基于临近桶,每棵树只会搜索指定的个数临近桶,比如10个 KNN Bucket。另外本文方法是 lsh自适应树结构,每个桶有最大样本数限制nMaxBucketSize。所以每个桶的样本数量不会超越nMaxBucketSize个。多棵树组成的lsh森林,树的数量一定N棵树,目前测试看N取8已经有很好的结果。这样,保证了最坏的搜索knn数量是

 N棵树* (KNN Bucket临近桶个数)* nMaxBucketSize

这个搜索数量不会随着样本的增加而增加。只是会随着树的深度增加稍微有增加。Lsh树是多叉树,eg 16. 当达到8级树节点时候,即可表示 2^32 的样本数。树状搜索也是每一级lsh哈希直接定位,所以其时间与最终bucket的所有样本比较,相当少。

搜索时间基本固定,主要由最终的所有临近桶的所有样本搜索KNN决定时间。

目前在minst全数据集上,多核查询速度可以达到5000-8000query/s 。如果进一步优化可以达到10000qps或者更高

由于使用了局部结构化处理,最终1nn效果是最好的,目前是经验数值。实际上根据svm的结构化的方法,思考确实是1nn最好,这个1nn非原始样本,而是局部的一个核心。

         这样分类器满足了特征:

海量数据处理,增量训练。

下一步需要研究如何自动聚类,增量聚类,并且用于稀疏编码。目前从lsh的性质看,不但适合海量数据处理,同时适合数据自动聚类。以上使用的桶自动分裂,就是发现数据稠密聚集的地方。自动聚类也就是稀疏编码的核心思想,稀疏编码也是深度神经网络能达到比BP网络好的一个重要方法。

         同时具备增量自动聚类和增量学习,就可以着手real智能系统的工作。

猜你喜欢

转载自blog.csdn.net/zsyddl2/article/details/47782847