关于用mapreduce做kmeans聚类以及python的numpy和list做矩阵、向量乘法的速度对比
2015-10-21 10:38
1036 查看
近期需要用到kmeans聚类:输入数据是每行100维的浮点数向量,共500万行;输出是300个类别(后期的输入可能扩大到数千万行,类别可能会扩大到1000类)。
需求是快速搞一版出来看看效果,因此决定用mapreduce+streaming写一个kmeans聚类。
方案:用mapreduce+streaming做聚类,语言使用python。map端计算输入点和中心点距离,reduce端合并输入点得到新的中心点,跑完一个job就算是迭代一轮。
具体实现:使用了numpy的矩阵和向量乘法。
效果:约4-5轮以后中心点收敛
ps:用numpy做向量相乘和矩阵相乘速度确实非常可观,但是比list能快上多少倍呢?
关于矩阵和向量相乘,对比了numpy和直接用python的list:
centroid存放的是中心点向量,w2v_vec是输入数据的向量,由word2vec对文本向量进行降维得到。
1.numpy的矩阵乘以向量
2.用python的list做矩阵乘以向量
最终速度对比,使用numpy每秒钟约能计算20万个100维的向量相乘,而直接使用list则只能计算2000个左右。故前者是后者速度的100倍。
需求是快速搞一版出来看看效果,因此决定用mapreduce+streaming写一个kmeans聚类。
方案:用mapreduce+streaming做聚类,语言使用python。map端计算输入点和中心点距离,reduce端合并输入点得到新的中心点,跑完一个job就算是迭代一轮。
具体实现:使用了numpy的矩阵和向量乘法。
效果:约4-5轮以后中心点收敛
ps:用numpy做向量相乘和矩阵相乘速度确实非常可观,但是比list能快上多少倍呢?
关于矩阵和向量相乘,对比了numpy和直接用python的list:
centroid存放的是中心点向量,w2v_vec是输入数据的向量,由word2vec对文本向量进行降维得到。
1.numpy的矩阵乘以向量
sim_vec = np.dot(centroid, w2v_vec) simest = sim_vec.max() simest_i = sim_vec.argmax()
2.用python的list做矩阵乘以向量
for c in centroid: sim = cal_sim(w2v_vec, c, dimension) if sim is None: continue if sim > simest: simest = sim simest_i = i i += 1
最终速度对比,使用numpy每秒钟约能计算20万个100维的向量相乘,而直接使用list则只能计算2000个左右。故前者是后者速度的100倍。
相关文章推荐
- Python的metaclass、`__new()__`、单例模式
- python脚本——合并word
- python中的多态
- Python学习之安装WingIDE并破解
- PEP8 Python 编码规范整理
- python函数函数指针用法
- from __future__ import absolute_import
- python -- 抽奖
- Requests+Beautifulsoup+re百度贴吧抓取实例(python3.4逐行解释)
- 怎么解决python "Non-ASCII character"错误
- (1)python基本使用
- Python2.*脚本转换成Python3.*脚本
- leetcode之Search in Rotated Sorted Array
- 【Python】调用WPS V9 API,实现PPT转PDF
- leetcode之Search a 2D Matrix II
- Learn Python The Hard Way(0--26)
- leetcode之Search a 2D Matrix
- python例子-开始一个Django项目
- 零基础学python-19.3 列表解析与矩阵
- 零基础学python-18.8 嵌套lambda与作用域