无监督算法原理总结 EM 期望最大化 k-means LDA

EM 期望最大化

算法原理

  1. 首先初始化一个参数 A
  2. 根据训练数据和当前的模型参数A 找出隐变量Z 也就是E步骤
  3. 根据训练数据和Z对参数A做最大似然估计 (M步)
  4. 重复2 3 步骤直到收敛或者找到局部最后解

k-means 聚类

  1. 先从样本集中随机选择k个样本作为随机质心
  2. 将所有样本点归到距离质心最近的类簇中
  3. 重新计算质心 作为新的质心 知道收敛或者找到局部最优解

聚类的评判 可以根据 类间的距离大 类内的距离小 来衡量

sklearn k-means 聚类 的实现
同样是我github的项目 https://github.com/everyStudyNow/ml_learning.git k-means_test.py 文件 下面是核心代码

from sklearn.cluster import KMeans
source_path = 'random_train.txt'
model_path = 'k-means.model'
vocab_path = 'vocab.txt'
x_train, train_target = build_vocab(source_path, vocab_path)
train_feature = train_feature(vocab_path, x_train)
model = KMeans(n_clusters=2, random_state=0) # 由于我的训练样本没变化 所以n_clusters是2个类  random_state 随机种子 不设置每次的结果都不一样
model.fit(np.array(train_feature))
joblib.dump(model, model_path)
print(model.predict([train_feature[0]]))  # 预测簇id
print(model.cluster_centers_)  # 聚类中心
print(model.labels_)  # 返回所有簇id
print(metrics.calinski_harabaz_score(train_feature, model.predict(train_feature)))

LDA(Latent Dirichlet Allocation,隐含狄利克雷分布)

LDA 是一个无监督的主题转换模型
算法的结果是可以拿到 主题词矩阵和主题样本矩阵
算法原理

  1. 对于任一文档d,其主题分布θd为:θd = Dirichlet(α⃗),其中,α为分布的超参数,是一个K维向量,K为主题个数;
  2. 对于任一主题k, 其词分布βk为:βk = Dirichlet(η⃗),其中,η为分布的超参数,是一个V维向量,V代表词汇表里所有词的个数;
  3. 对于每一篇文档d,它的每一个词n,我们可以先从他的主题分布θd中得到它的主题Zd,n = multi(θd);
    然后根据该主题,从它的词分布βk中得到我们看到的词Wd,n = multi(βzdn)。

那么我们应该如何根据训练样本求解这个LDA模型的各个参数值呢(即求出每一篇文档的主题分布和每一个主题中的词分布)? 一般有两种方法:

第一种是基于Gibbs采样算法求解。即通过Gibbs采样得到所有词的主题,然后统计所有词的主题计数,就可以得到各个主题的词分布;接着统计各个文档对应词的主题计数,得到各个文档的主题分布。
第二种是基于变分推断EM算法求解。模型的隐变量为θ,β,z,模型的参数是α,η。

你可能感兴趣的:(机器学习)