1、K均值聚类
K-means,属于无监督学习,通过迭代方式实现。策略是把相近的分为一类。算法大概为:
(1)选n个质心(质心的个数(n>=2)和位置开始是由人定,但是质心个数和位置的选择对最终结果会有一定影响)
(2)计算每个数据到质心的欧氏距离(不足:不同维度的重要性相同),判断数据距离哪个质心最近,将其归为一类
(3)根据归为一类的数据求出新的质心值
(4)重复(2)(3)直到质心值基本保持不变或迭代次数达规定阈值(时间开销大)
2、K均值聚类是生成式还是判别式方法?
K均值聚类是生成式方法。
理由:通过相似度(或是特征,这里是欧氏距离的远近)学习数据的分布规律,得到结果。
3、KNN VS. K-means
同:思想:都是通过点之间的距离解决问题
异:k:KNN(k-Nearest Neighbor)中的k是离一个点距离最近的k个点
K-means中的k是k个质心,形成k簇
思想:KNN是找点P距离最近的k个点,判断这k个点多数是什么特征(带标签),则P表示的样本就判断为什么特征;K-means是给k个质心(位置不确定),利用质心与样本点之间的距离不断改变质心位置,以改变簇中样本,最终,在哪一簇就是有那一簇相似的特征。KNN属于监督学习,k-means属于无监督学习
KNN属于判别式方法,k-means属于生成式方法。
4、主成分分析
抓住重要特征后进行降维。主要是通过将样本点投影到某个方向上使得方差最大(将点打散)
算法:样本中心化(使得计算量变小)->计算协方差矩阵(表示各点之间的相关程度,协方差为0则彼此无关)->协方差矩阵的特征值分解,对特征根排序->选择前L个最大特征根对应的特征向量组成映射矩阵(投影后选方差最大的L个)
5、LDA VS. PCA
同:二者都利用了映射的方法,找到特征向量w
异:LDA为监督学习,有给出的标签,知道分类,目的是将类内尽可能“近”,类外尽可能“远”,维 度与类别个数有关
PCA为无监督学习,没有标签,自己学习,将数据通过映射打散,维度由原始数据特征有关
6、奇异值分解(SVD)
目的也是将复杂问题简单化。将一个复杂矩阵变成三个简单矩阵,其中,中间的那个只有主对角线上有值,其他元素均为0的矩阵中的值就是奇异值。(奇异值求法:求A的奇异值,首先求出、的所有特征值等和特征向量v、u,利用求出奇异值)
7、特征人脸方法(Eigenface)
利用奇异值分解以简化运算,利用PCA实现降维,在另一较低维空间中做相似度计算。每幅人脸都是特征人脸(由特征向量还原)的线性组合,利用线性组合的系数来表示原始人脸图像
8、潜在语义分析 (LSA)
以话题向量表示文本的语义内容。通过奇异值分解将文本从单词向量空间映射到话题向量空间(单词文本矩阵=单词话题矩阵*话题话题矩阵*话题文本矩阵)
9、期望最大化算法(EM)
通过不断优化函数得出结果。
算法:1、假设模型参数初始值,估计隐变量取值(E步),转2
2、根据观测数据、模型参数、隐变量,最大化“拟合”数据,更新模型参数(M步),转3
3、利用模型参数更新隐变量取值,算法收敛则结束,否则转2
10、K-means是最简单的EM算法?
K-means是最简单的EM算法。
K-means是初始化质心后根据质心与各点的距离判断是否属于一个集合,然后利用数据重新计算质心位置,再重新将数据放入距离最近质心的集合中,反复迭代,直至质心基本保持不变
EM是初始化参数后求出隐变量取值,根据数据、参数、隐变量重新计算模型参数,再重新利用参数更新隐变量取值,反复迭代,直至算法收敛K-means中质心的位置就是EM中的参数取值,都是反复迭代直至参数基本不变。
11、编程实现EM算法。
def EM_algorithm(samples, n_components, max_iter=100, tol=1e-4):
# 初始化均值和方差
mu = np.random.uniform(samples.min(), samples.max(), size=n_components)
sigma = np.random.uniform(0, 1, size=n_components)
# 初始化混合系数
alpha = np.ones(n_components) / n_components
# 定义E步骤
def E_step(samples, mu, sigma, alpha):
p = np.zeros((len(samples), n_components))
for i in range(n_components):
p[:, i] = alpha[i] * norm.pdf(samples, mu[i], sigma[i])
return p / p.sum(axis=1)[:, None]
# 定义M步骤
def M_step(samples, p):
mu_new = np.sum(p * samples[:, None], axis=0) / np.sum(p, axis=0)
sigma_new = np.sqrt(np.sum(p * (samples[:, None] - mu_new) ** 2, axis=0) / np.sum(p, axis=0))
alpha_new = np.mean(p, axis=0)
return mu_new, sigma_new, alpha_new
# 迭代EM算法
for i in range(max_iter):
# E步骤:计算隐变量的期望
p = E_step(samples, mu, sigma, alpha)
# M步骤:最大化对数似然函数更新参数
mu_new, sigma_new, alpha_new = M_step(samples, p)
# 计算对数似然函数并判断是否收敛
log_likelihood = np.sum(np.log(np.sum(p, axis=1)))
if i > 0 and log_likelihood - log_likelihood_old < tol:
break
log_likelihood_old = log_likelihood
# 更新参数
mu, sigma, alpha = mu_new, sigma_new, alpha_new
return mu, sigma, alpha, p