接到mail, 公布出来省得再有提问 :)
首先, 我要实现的canopy和kmeans算法都是固定的,本来我不必要重新实现这些算法。我是暂时加入mahout-*.jar,因为里面的SparseVector,省得我再去实现一遍。
但我没用其中的算法, 因为我去年就发现mathout的实现有以下以个问题:
1.
它的CanopyMapper默认读取的是SparseVector.asFormatString之后的字符串形成的Text。我估计他们没有做过大数
集的测试,因为这个String占的空间非常大。SparseVector的每个元素由index和value组成, index是int型占4字节,
value是double型占8字节,
他们转成字符串加起来远不止12字节。这势必会造成空间上的膨胀,事实上我测试过用一个4.1m的新闻分词后,如果采用这种形式建立VSM,将是11M.
2. 他们对Canopy算法的理解有误区。这是canopy提出者的原文
http://www.kamalnigam.com/papers/canopy-kdd00.pdf
注意它摘要的话:
The key idea involves using a cheap,approximate distance measure
to efficiently divide the data into overlapping subsets we call
canopies. Then clustering is performed by measuring exact distances only between points that occur in a common canopy
.
作者提出的这两点,第一点mahout是采用命令行参数指定的Distance
Measure,这很灵活,虽然使用者可能不懂canopy,没体现cheap这特点,但也不能说mathout有错。 关键是第二点,在k-means
这一步只需要计算出现在同一canopy中所有数据点的精确距离。这是canopy之所以高效至关重要的一点。这一点,mathout的代码没有体现。事
实上我去年打过patch给他们,由于我对apache的format不熟,而且没有写JUnit相关的test,所以没有被接受。我怀疑mahout的
canopy实现作者只看过google的那段canopy视频。
3. 注意mathout中org.apache.mahout.clustering.canopy.Canopy这个类中的计算canopy质心的方法:
public Vector computeCentroid() {
Vector result = new SparseVector(pointTotal.cardinality());
for (int i = 0; i < pointTotal.cardinality(); i++)
result.set(i, new Double(pointTotal.get(i) / numPoints));
return result;
}
它构造一个稀疏矩阵, 但这个矩阵每个元素都是赋了值的,就算是为0也赋值。用SparseVector去存,反而会极大地增大其容量。再者在大规模数据中,词条向量应该会有百万级别的元素,这样存太没道理了。加上按照刚才1. 中指出的存成String,光存一个canopy质心就可以达到数百K字节.
4. 如果读者测试了mathout的Naive
Bayes关于20_newsgroups的示例,你会发现它根本不能工作。代码不能工作就提交上去。我们作了一些改动,结果它的算法精确度非常之低,结
果自己重写了,当然也避免重复劳动,用了些mahout已有的代码。对搜狐新闻,拿Je
MMAnalyzer分词器分词,分类精度提到90.2%。另外,也是存储空间的问题,
20_newsgroups解压下来只有90.4MB,这当然不会有问题。但它计算词频采用的key是label,
term,代表类与词;value是这个类中该词条的词频。有时候数据集大了词条非常多,在我的实验当中多至数百万,而且类有N个的话。那么它要数百
万*N个记录。这一点完全可以避免。
分享到:
相关推荐
通过使用PageRank、LSI等算法,Redpoll能够从大量文本数据中提取有价值的信息,帮助用户更好地理解和利用数据。 总之,Hadoop作为大数据处理领域的关键技术,不仅提供了强大的数据处理能力,还构建了一个丰富的生态...
MapReduce研究 调试、监控等 优化、扩展等 常用API Hadoop改造 数据挖掘项目Redpoll Canopy, k-means Naive bayes, SVM
opencv_python-4.1.0.25-cp37-cp37m-linux_armv7l.whl
onnxruntime-1.13.1-cp38-cp38-win_amd64.whl
Few-shot CIFAR100数据集,来自CIFAR100数据集。 数据集共包含100类别,每个类别600张图像,合计60,000张图像。 数据集介绍:分为训练集、验证集、测试集 --data--train--:60个文件夹,36,000张图片 --data--val--: 20个文件夹,12,000张图片 --data--test--:20个文件夹,12,000张图片 FC100按照超类(Superclass)进行划分:训练集60个超类,验证集20个超类,测试集20个类别。
numpy-1.19.5-cp39-cp39-linux_armv7l.whl
基于springboot的城乡商城协作系统源码数据库文档.zip
基于springboot宠物管理系统源码数据库文档.zip
基于springboot餐饮连锁店管理系统源码数据库文档.zip
基于springboot在线问诊系统源码数据库文档.zip
1、资源内容地址:https://blog.csdn.net/2301_79696294/article/details/143734777 2、数据特点:今年全新,手工精心整理,放心引用,数据来自权威,且标注《数据来源》,相对于其他人的控制变量数据准确很多,适合写论文做实证用 ,不会出现数据造假问题 3、适用对象:大学生,本科生,研究生小白可用,容易上手!!! 4、课程引用: 经济学,地理学,城市规划与城市研究,公共政策与管理,社会学,商业与管理
功能说明: 陕理工图书馆管理系统包括两种用户,管理员,和学生用户。不同的用户都需要进行登录,然后针对其操作权限才能进入管理系统。 系统的设计将分为后台和前台,后台是系统管理员进行登录后管理,前台是学生使用的部分。 前台实现的功能包括:学生用户注册、登录,座位信息查看、阅览室信息、在线交流、座位预约、查看图书位置等。 服务器后台管理实现的功能包括:管理员登录,阅览室信息管理,座位管理,预约管理,图书管理以及用户管理等。 环境说明: 开发语言:python Python版本:3.6.8 数据库:mysql 5.7数据库工具:Navicat11开发软件:pycharm
numpy-1.16.1-cp35-cp35m-linux_armv7l.whl
scipy-1.2.0-cp35-cp35m-linux_armv7l.whl
opencv_python-4.0.1.24-cp37-cp37m-linux_armv7l.whl
ASP.NET酒店管理系统源码(WPF) 一、源码特点 采用WPF进行开发的酒店管理系统源码,界面相当美观,功能齐全 二、菜单功能 1、预订登记:可选择入住时间、离店时间、所在城市、证件类型,保存、删除、查询、返回 2、住宿结算:新增入住、保存、删除、查询、返回 3、今日盘点:查询、返回 4、查询统计: 5、房间管理:增加房间类型、删除类型、增加房间、删除房间、保存、返回 6、用户管理:增加用户、删除用户、保存、返回 7、系统配置:基本功能 8、显示当前系统时间等功能的实现
基于springboot的c语言学习辅导网站源码数据库文档.zip
基于springboot医疗废物管理系统源码数据库文档.zip
opencv_python-4.5.5.64-cp39-cp39-linux_armv7l.whl
gee_python基于机器学习ML(随机森林RF)的土地分类.ipynb