1.K均值聚类
K均值聚类是一种判别式方法,它通过将数据分为K个簇来进行聚类。它并不试图对数据的分布进行建模,而是直接将数据分为不同的簇。
2.K均值聚类是生成式还是判别式方法?
KNN和K均值聚类是两种不同的算法。KNN是一种分类算法,它基于距离度量来确定一个测试样本最近的K个训练样本,并根据它们的类别进行分类。K均值聚类则是一种聚类算法,它将数据分为K个簇,使得每个数据点都属于离它最近的簇。
3.KNN VS. K-means
KNN和K-means是两种完全不同的机器学习算法。KNN是一种有监督学习算法,常用于分类和回归问题。K-means是一种无监督学习算法,常用于聚类分析。
4.主成分分析
主成分分析(PCA)和线性判别分析(LDA)都是降维技术,但是它们的目标不同。PCA的目标是将数据投影到一个新的坐标系中,使得投影后的数据方差最大。LDA则是一种有监督的降维方法,其目标是将数据投影到一个新的坐标系中,使得不同类别之间的距离最大,同类别之间的距离最小。
5.LDA VS. PCA
LDA和PCA都是常用的数据降维技术,但它们有不同的应用和目标。
PCA旨在通过线性变换将高维数据投影到低维空间,以保留最多的数据方差信息。PCA是一种无监督方法,它不考虑类别标签信息。
LDA也是一种线性变换方法,但它是有监督的。与PCA不同,LDA的目标是找到可以最大化不同类别之间的差异性(类别间散度)和最小化同一类别内部的差异性(类别内散度)的投影。
6.奇异值分解(SVD)
奇异值分解是一种矩阵分解技术,可以将一个矩阵分解为三个矩阵的乘积,其中中间的矩阵是对角矩阵,其对角线上的元素为奇异值。SVD在很多应用中都有重要的作用,如图像压缩、推荐系统等。
7.特征人脸方法(Eigenface)
特征人脸方法是一种基于PCA的人脸识别方法,它将人脸图像投影到一个低维空间中,并使用投影后的特征向量进行人脸识别。
8.潜在语义分析 (LSA)
潜在语义分析是一种基于SVD的文本分析方法,它将文本表示为一个矩阵,并使用SVD将其分解为三个矩阵的乘积。LSA可以用于文本分类、信息检索等任务。
9.期望最大化算法(EM)
期望最大化算法是一种迭代算法,用于估计包含隐变量的概率模型参数。K均值聚类可以看作是EM算法在高斯混合模型中的特例。
10.K-means是最简单的EM算法?
K均值聚类可以看作是最简单的EM算法之一。K均值聚类假设每个簇都是由一个高斯分布生成的,并且每个数据点只属于一个簇。
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