word2vec中k-means学习笔记
一、k-means算法
算法描述
输入:簇的数目k;包含n个对象的数据集D。
输出:k个簇的集合。
方法:
- 从D中任意选择k个对象作为初始簇中心;
- repeat;
- 根据簇中对象的均值,将每个对象指派到最相似的簇;
- 更新簇均值,即计算每个簇中对象的均值;
- 计算准则函数;
- until准则函数不在发生变化
二、Machine Learning(Ng)算法笔记

算法主要思想:
1)首先根据你要聚类的个数(假设为k),选择k个中心u,可以挑选k个样本作为中心。
2)根据挑选出的k个中心,将每个样本(一共m个)贴上特定的标签。
3)根据新贴的标签,更新样本的中心。
三、word2vec中k-means实现
1 int clusterCount = classses; 2 int iter = 10; 3 4 int *centcn = (int *)malloc(clusterCount * sizeof(int)); //属于每个中心的单词个数 5 int *cluster = (int *)calloc(vocab_size, sizeof(int)); // 存放每个单词指派的中心id 6 7 real *cent = (real *)calloc(clusterCount * layer1_size, sizeof(reall)); //存放每个中心的向量表示 8 9 for (a=0; a<vocab_size; a++) 10 cluster[a] = a % clusterCount; //随机指派每个单词的中心 11 12 for (a=0; a < iter; a++) { //一共迭代iter轮 13 for(b = 0; b < clusterCount * layer1_size; ++b) 14 cent[b] = 0; 15 16 for(b=0; b < clusterCount; ++b) 17 centcn[b] = 1; 18 19 for(c=0; c < vocab_size; ++c) { 20 for(d=0; d < layer1_size; ++d) { 21 cent[layer1_size * cluster[c]+d] += syn0[c*layer1_size+d]; //将属于每个中心的点的每个坐标相加 22 centcn[cluster[c]]++; // 分别计算属于每个中心的点个数 23 } 24 } 25 26 for(b=0; b < clusterCount; ++b) { //更新每个中心的向量表示 27 closeV = 0; 28 for (c=0; c<layer1_size; ++c) { 29 cent[layer1_size*b+c] /= centcn[b]; 30 closeV += cent[layer1_size*b+c] * cent[layer1_size*b+c]; 31 } 32 closeV = sqrt(closeV); 33 for (c=0; c<layer1_size; ++c) cent[layer1_size*b+c] /= closeV; 34 } 35 36 //更新每个样本的中心 37 for(c=0; c < vocab_size; ++c) { 38 closev= -10; 39 closeid = 0; 40 for (d=0; d < clusterCount; ++d) { 41 x = 0; 42 for(b=0; b < layer1_size; ++b) { 43 x += cent[layer1_size*d+b] * syn0[c*layer1_size+b] 44 } 45 if (x > closev) { //选出与单词表示最相近的中心 46 closeid = d; 47 closev = x; 48 } 49 } 50 cluster[c] = closeid; 51 } 52 }
浙公网安备 33010602011771号