您的位置:首页 > 编程语言 > Python开发

关于用mapreduce做kmeans聚类以及python的numpy和list做矩阵、向量乘法的速度对比

2015-10-21 10:38 477 查看
近期需要用到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的矩阵乘以向量

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倍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: