1、K均值聚类
它是一种聚类算法,属于无监督学习算法,目标是将n个d维的数据划分为K个聚簇,使得簇内方差最小化。
2、K均值聚类是生成式还是判别式方法?
K均值聚类是一种判别式方法,它通过将数据分为K个簇来进行聚类。
3、KNN VS K-means
KNN是有监督学习,解决的是分类问题,KNN使用有分类标签的数据集通过计算对新数据进行分类预测。
K-means是无监督学习,解决的是聚类问题,K-means通过算法将数据集划分为K类。
4、主成分分析
主成分分析是一种特征降维的方法,找到数据的主要成分替换原来的数据。
5、LDA VS PCA
两者都符合高斯分布且都可对数据进行降维。LDA是有监督的降维方法,最多降到类别数k-1的维数,PCA是无监督的降维方法,主要以方差衡量数据。
6、奇异值分解(SVD)
将矩阵A分解为三个子矩阵,A=,U是一个mxm矩阵,D是一个mxn的矩阵,V是一个nxn的矩阵。
7、特征人脸方法(Eigenface)
捕捉人脸图像集合的特征信息,并用该信息对各个人脸图像进行编码和比较。使用主成分分析,使用奇异值分解方法,将人脸从像素点空间转到人脸空间,比较是否相似。
8、潜在语义分析(LSA)
潜在语义分析是一种无监督学习算法,主要用于文本的话题分析。最初应用于文本信息检索,也被称为潜在语义索引。
9、期待最大化算法(EM)
期待最大化算法是在概率模型中寻找参数最大似然估计或者最大后验估计的算法,其中概率模型依赖于无法观测的隐性变量。EM算法是数据挖掘的十大算法之一,主要解决有隐含变量时,如何利用最大似然法求解未知参数。
10、K-means是最简单的EM算法?
K-means是最简单的EM算法。K-means算法是将样本聚类成k个簇,EM算法:E步就是估计隐含类别y的期望值,M步调整其他参数使得在给定类别y的情况下,极大似然估计P(x,y)能够达到极大值。然后在其他参数确定的情况下,重新估计y,周而复始,直至收敛。K-means是EM的体现。
11、编程实现EM算法
import numpy as np import math import copy import matplotlib.pyplot as plt isdebug = True def init_data(Sigma, Mu1, Mu2, k, N): global X global Mu global Expectations X = np.zeros((1, N)) Mu = np.random.random(k) Expectations = np.zeros((N, k)) for i in range(0, N): if np.random.random(1) > 0.5: X[0, i] = np.random.normal(Mu1, Sigma) else: X[0, i] = np.random.normal(Mu2, Sigma) if isdebug: print("***********") print("初始观测数据X:") print(X) # EM算法:步骤1,计算E def e_step(Sigma, k, N): global Expectations global Mu global X for i in range(0, N): Denom = 0 Numer = [0.0] * k for j in range(0, k): Numer[j] = math.exp((-1 / (2 * (float(Sigma ** 2)))) * (float(X[0, i] - Mu[j])) ** 2) Denom += Numer[j] for j in range(0, k): Expectations[i, j] = Numer[j] / Denom if isdebug: print("***********") print("隐藏变量E(Z):") print(Expectations) # EM算法:步骤2,求最大化E[zij]的参数Mu def m_step(k, N): global Expectations global X for j in range(0, k): Numer = 0 Denom = 0 for i in range(0, N): Numer += Expectations[i, j] * X[0, i] Denom += Expectations[i, j] Mu[j] = Numer / Denom def run(Sigma, Mu1, Mu2, k, N, iter_num, Epsilon): init_data(Sigma, Mu1, Mu2, k, N) print("初始<u1,u2>:", Mu) for i in range(iter_num): Old_Mu = copy.deepcopy(Mu) e_step(Sigma, k, N) m_step(k, N) print(i, Mu) if sum(abs(Mu - Old_Mu)) < Epsilon: break if __name__ == '__main__': sigma = 6 mu1 = 40 mu2 = 20 k = 2 # 高斯分布的个数 N = 1000 # 样本个数 iter_num = 1000 # 最大迭代次数 epsilon = 0.0001 # 当两次误差小于这个时退出 run(sigma, mu1, mu2, k, N, iter_num, epsilon) plt.hist(X[0, :], 50) plt.show()