-
K均值聚类
无监督学习的聚类算法,旨在将数据点分成K个不同的类别。在这个算法中,我们通过不断地迭代来优化每个数据点与其所属类别的距离。具体来说,它是一种判别式方法。 -
比较KNN与K-means
基于实例的学习方法,用于分类和回归。K-means则是一种聚类算法,用于将数据点分成K个不同的类别。虽然两种算法都可以用于分类问题,但是它们的本质不同。KNN需要大量的训练数据,并且在测试数据点与训练数据点相差很远的情况下,KNN的准确性会降低。K-means则不需要大量的训练数据,并且在处理大量数据时效率较高。 -
主成分分析
一种用于降维的线性技术。它的目的是将高维数据转换为低维数据,同时保留尽可能多的原始数据信息。在这个算法中,我们通过对协方差矩阵进行特征值分解来找到数据的主成分。 -
LDA VS. PCA
LDA和PCA都是用于降维的线性技术。它们的区别在于,LDA是一种监督学习算法,它试图将不同类别之间的距离最大化,而PCA是一种无监督学习算法,它旨在最大化数据的方差。 -
奇异值分解(SVD)
一种用于矩阵分解的线性代数技术。它可以将任意矩阵分解成三个矩阵的乘积:一个左奇异矩阵、一个对角矩阵和一个右奇异矩阵。这种分解在数据降维和矩阵近似中非常有用。 -
特征人脸方法(Eigenface)
一种用于人脸识别的技术。它使用主成分分析来将人脸图像转换为特征向量,并将这些特征向量称为“特征人脸”。在识别过程中,我们将待识别的人脸图像转换为特征向量,并将其与存储在数据库中的特征人脸进行比较。 -
潜在语义分析 (LSA)
基于矩阵分解的文本语义分析方法,通过对文本的词项-文档矩阵进行奇异值分解,得到词项和文档的低维向量表示,并通过向量空间模型进行语义相似度计算。 -
期望最大化算法(EM)
基于迭代优化的算法,用于求解含有隐变量的概率模型的最大似然估计,包括高斯混合模型、隐马尔可夫模型等。EM算法通过交替进行E步和M步,来不断优化参数估计。其中E步计算隐变量的后验概率,M步更新模型参数。具体来说,对于高斯混合模型,E步计算隐变量对于每个高斯分量的响应度,M步更新高斯分量的均值和协方差矩阵。EM算法的实现一般涉及到隐变量的后验概率计算、模型参数的更新、收敛判断等步骤。 -
K-means是最简单的EM算法?
K-means可以看作是最简单的EM算法,它使用了EM算法的思想,但是对于高斯混合模型的假设进行了简化。
import numpy as np
from scipy.stats import norm
# 生成观测数据
X = np.concatenate([np.random.randn(500, 2) + np.array([5, 5]),
np.random.randn(500, 2) + np.array([-5, -5])])
# 初始化参数
mu1, mu2 = np.random.randn(2)
sigma1, sigma2 = np.random.rand(2)
# 定义 E 步和 M 步函数
def e_step(X, mu1, mu2, sigma1, sigma2):
# 计算后验概率
p_z1_x = norm(mu1, sigma1).pdf(X[:, 0])
p_z2_x = norm(mu2, sigma2).pdf(X[:, 1])
p_z_x = p_z1_x * p_z2_x
p_z_x /= np.sum(p_z_x, axis=1, keepdims=True)
return p_z_x
def m_step(X, p_z_x):
# 更新参数
mu1 = np.sum(p_z_x[:, 0] * X[:, 0]) / np.sum(p_z_x[:, 0])
mu2 = np.sum(p_z_x[:, 1] * X[:, 1]) / np.sum(p_z_x[:, 1])
sigma1 = np.sqrt(np.sum(p_z_x[:, 0] * (X[:, 0] - mu1) ** 2) / np.sum(p_z_x[:, 0]))
sigma2 = np.sqrt(np.sum(p_z_x[:, 1] * (X[:, 1] - mu2) ** 2) / np.sum(p_z_x[:, 1]))
return mu1, mu2, sigma1, sigma2
# 迭代 EM 算法
prev_llh = None
for i in range(100):
p_z_x = e_step(X, mu1, mu2, sigma1, sigma2)
mu1, mu2, sigma1, sigma2 = m_step(X, p_z_x)
llh = np.sum(np.log(np.sum(p_z_x, axis=1)))
if prev_llh is not None and np.abs(llh - prev_llh) < 1e-6:
break
prev_llh = llh
print("Iteration {}: mu1 = {:.2f}, mu2 = {:.2f}, sigma1 = {:.2f}, sigma2 = {:.2f}, log-likelihood = {:.2f}".format(
i+1, mu1, mu2, sigma1, sigma2, llh))