Now is best !

word2vec中k-means学习笔记

一、k-means算法

算法描述

输入:簇的数目k;包含n个对象的数据集D。

输出:k个簇的集合。

方法:

  1. 从D中任意选择k个对象作为初始簇中心;
  2. repeat;
  3. 根据簇中对象的均值,将每个对象指派到最相似的簇;
  4. 更新簇均值,即计算每个簇中对象的均值;
  5. 计算准则函数;
  6. 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 }
View Code

 

posted on 2013-11-29 22:37  fang0703  阅读(1599)  评论(0)    收藏  举报

导航