K均值聚类
一种迭代求解的聚类分析算法。给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。K均值聚类是生成式还是判别式方法?
不是生成式也不是判别式。KNN VS. K-means
KNN属于监督学习,类别是已知的,通过对已知分类的数据进行训练和学习,找到这些不同类的特征,再对未分类的数据进行分类。
Kmeans属于非监督学习,事先不知道数据会分为几类,通过聚类分析将数据聚合成几个群体。聚类不需要对数据进行训练和学习。
主成分分析
将高维数据映射到低维空间,从而实现对数据的降维和特征提取LDA VS. PCA
- 两者均可以对数据进行降维。
- 两者在降维时均使用了矩阵特征分解的思想。
- 两者都假设数据符合高斯分布。
- LDA是有监督的降维方法,而PCA是无监督的降维方法
- LDA除了可以用于降维,还可以用于分类。
奇异值分解(SVD)
矩阵的奇异值分解是指,将一个非零的m xn实矩阵A,A ∈ RTXn,表示为以下三个实矩阵乘积形式的运算,即进行矩阵的因子分解:其中U是m 阶正交矩阵( orthogonal matrix ),V是n 阶正交矩阵,又是由降序排列的非负的对角线元素组成的m x n矩形对角矩阵( rectangular diagonal matrix ),
特征人脸方法(Eigenface)
将PCA方法应用到人脸识别中,将人脸图像看成是原始数据集,使用PCA方法对其进行处理和降维,得到“主成分”——即特征脸,然后每个人脸都可以用特征脸的组合进行表示。潜在语义分析 (LSA)
基于奇异值分解(SVD)的文本挖掘技术,它通过将文本转化为向量空间模型,利用矩阵分解技术找到文本语义的潜在结构,从而实现文本的自动分类、聚类和相似性计算。期望最大化算法(EM)
通过迭代的方式,交替进行两个步骤:E步骤和M步骤,从而不断更新模型参数,直到收敛。K-means是最简单的EM算法?
K-means是EM算法的一种特殊情况。编程实现EM算法
from scipy import stats import numpy as np # 硬币投掷结果观测序列 observations = np.array([[1, 0, 0, 0, 1, 1, 0, 1, 0, 1], [1, 1, 1, 1, 0, 1, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1, 1, 0, 1, 1], [1, 0, 1, 0, 0, 0, 1, 1, 0, 0], [0, 1, 1, 1, 0, 1, 1, 1, 0, 1]]) def em_single(priors, observations): """ EM算法单次迭代 Arguments --------- priors : [theta_A, theta_B] observations : [m X n matrix] Returns -------- new_priors: [new_theta_A, new_theta_B] :param priors: :param observations: :return: """ counts = {'A': {'H': 0, 'T': 0}, 'B': {'H': 0, 'T': 0}} theta_A = priors[0] theta_B = priors[1] # E step for observation in observations: len_observation = len(observation) num_heads = observation.sum() num_tails = len_observation - num_heads contribution_A = stats.binom.pmf(num_heads, len_observation, theta_A) contribution_B = stats.binom.pmf(num_heads, len_observation, theta_B) # 两个二项分布 weight_A = contribution_A / (contribution_A + contribution_B) weight_B = contribution_B / (contribution_A + contribution_B) # 更新在当前参数下A、B硬币产生的正反面次数 counts['A']['H'] += weight_A * num_heads counts['A']['T'] += weight_A * num_tails counts['B']['H'] += weight_B * num_heads counts['B']['T'] += weight_B * num_tails # M step new_theta_A = counts['A']['H'] / (counts['A']['H'] + counts['A']['T']) new_theta_B = counts['B']['H'] / (counts['B']['H'] + counts['B']['T']) return [new_theta_A, new_theta_B] def em(observations, prior, tol=1e-6, iterations=10000): """ EM算法 :param observations: 观测数据 :param prior: 模型初值 :param tol: 迭代结束阈值 :param iterations: 最大迭代次数 :return: 局部最优的模型参数 """ import math iteration = 0 while iteration < iterations: new_prior = em_single(prior, observations) delta_change = np.abs(prior[0] - new_prior[0]) if delta_change < tol: break else: prior = new_prior iteration += 1 return [new_prior, iteration] if __name__ == "__main__": result=em(observations, [0.6, 0.4]) print(result)
AI作业4
于 2023-04-04 08:18:29 首次发布