在Python中使用大稀疏矩阵的kNN

 yilande 发布于 2023-02-13 13:32

我有两个大的稀疏矩阵:

In [3]: trainX
Out[3]: 
<6034195x755258 sparse matrix of type ''
        with 286674296 stored elements in Compressed Sparse Row format>

In [4]: testX
Out[4]: 
<2013337x755258 sparse matrix of type ''
        with 95423596 stored elements in Compressed Sparse Row format>

加载总共大约5 GB RAM.请注意,这些矩阵非常稀疏(占用0.0062%).

对于每一行testX,我想找到最近邻trainX,返回其相应的标签,在发现trainY. trainY是一个长度相同的列表,trainX并且有许多类.(一个类由1-5个单独的标签组成,每个标签是20,000个中的一个,但是类的数量与我现在要做的事情无关.)

我正在使用sklearnKNN算法来做到这一点:

from sklearn import neighbors

clf = neighbors.KNeighborsClassifier(n_neighbors=1)
clf.fit(trainX, trainY)
clf.predict(testX[0])

甚至预测1项testX需要一段时间(即30-60秒之类的东西,但如果你乘以200万,那就变得非常不可能了).我的笔记本电脑有16GB的RAM开始交换一下,但确实设法完成了1项testX.

我的问题是,我怎么能这样做才能在合理的时间内完成?在大型EC2实例上说一晚?只是拥有更多的内存并防止交换速度足够快(我的猜测是否定的).也许我可以以某种方式利用稀疏性来加速计算?

谢谢.

1 个回答
  • sklearn当数据的维数增加时,诸如所使用的KD树之类的经典kNN数据结构变得非常慢.对于非常高维的问题,建议切换算法类并使用近似最近邻(ANN)方法sklearn,遗憾的是这些方法似乎缺乏.请参阅下面的链接,了解有关算法和理论的论文,在这些情况下,近似最近邻居的速度要快得多

    C++世界中一个着名的ANN库,在计算机视觉中广泛用于特征描述符空间中的最近邻居FLANN.主页说它包含Python绑定(我从未使用过).

    另一种流行的选择是ANN用Python包装库在这里,虽然较新的FLANN似乎是目前比较流行的.

    另见这个答案(但有些链接已经死了).

    一个警告:您的数据似乎是非常高的维度 - 我不知道这些库如何为您执行.他们仍然应该击败sklearn.

    2023-02-13 13:35 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有