我正在尝试运行自定义的kmeans聚类算法,但是在获取每个2-d numpy数组中每列(术语)的文档频率时遇到了问题。我的当前算法有两个numpy数组,一个原始数据集,按术语列出文档[2000L,9500L],另一个是聚类分配[2000L,]。共有5个聚类。我需要做的是创建一个数组,列出每个聚类的文档频率 - 基本上是在每个列中计数,其中列号与不同数组中的行号匹配。输出将是一个[5L,9500L]数组(聚类x术语)。我无法找到一种方法来执行countif和group by的等效操作。以下是一些示例数据以及如果我仅使用2个聚类运行它时想要的输出:
import numpy as np
dataset = np.array[[1,2,0,3,0],[0,2,0,0,3],[4,5,2,3,0],[0,0,2,3,0]]
clusters = np.array[0,1,1,0]
#run code here to get documentFrequency
print documentFrequency
>> [1,1,1,2,0],[1,2,1,1,1]
我的想法是选择与每个聚类匹配的特定行,因为这样计数应该很容易。例如,如果我可以将数据拆分为以下数组:
cluster0 = np.array[[1,2,0,3,0],[0,0,2,3,0]]
cluster1 = np.array[[0,2,0,0,3],[4,5,2,3,0]]
任何指导或提示都将不胜感激!
np.bincount
的 gufunc 版本,详见这里。如果你能够编译和安装它(如果你的系统已经正确设置,运行python setup.py install
应该就可以了),那么你就可以像这样做:import new_gufuncs as ng; doc_freq = ng.bincount(clusters, dataset.T).T
,所有循环都在 C 中进行。 - Jaime