【22-23 春学期】AI作业4-无监督学习

  1. K均值聚类
    无监督学习的聚类算法,旨在将数据点分成K个不同的类别。在这个算法中,我们通过不断地迭代来优化每个数据点与其所属类别的距离。具体来说,它是一种判别式方法。

  2. 比较KNN与K-means
    基于实例的学习方法,用于分类和回归。K-means则是一种聚类算法,用于将数据点分成K个不同的类别。虽然两种算法都可以用于分类问题,但是它们的本质不同。KNN需要大量的训练数据,并且在测试数据点与训练数据点相差很远的情况下,KNN的准确性会降低。K-means则不需要大量的训练数据,并且在处理大量数据时效率较高。

  3. 主成分分析
    一种用于降维的线性技术。它的目的是将高维数据转换为低维数据,同时保留尽可能多的原始数据信息。在这个算法中,我们通过对协方差矩阵进行特征值分解来找到数据的主成分。

  4. LDA VS. PCA
    LDA和PCA都是用于降维的线性技术。它们的区别在于,LDA是一种监督学习算法,它试图将不同类别之间的距离最大化,而PCA是一种无监督学习算法,它旨在最大化数据的方差。

  5. 奇异值分解(SVD)
    一种用于矩阵分解的线性代数技术。它可以将任意矩阵分解成三个矩阵的乘积:一个左奇异矩阵、一个对角矩阵和一个右奇异矩阵。这种分解在数据降维和矩阵近似中非常有用。

  6. 特征人脸方法(Eigenface)
    一种用于人脸识别的技术。它使用主成分分析来将人脸图像转换为特征向量,并将这些特征向量称为“特征人脸”。在识别过程中,我们将待识别的人脸图像转换为特征向量,并将其与存储在数据库中的特征人脸进行比较。

  7. 潜在语义分析 (LSA)
    基于矩阵分解的文本语义分析方法,通过对文本的词项-文档矩阵进行奇异值分解,得到词项和文档的低维向量表示,并通过向量空间模型进行语义相似度计算。

  8. 期望最大化算法(EM)
    基于迭代优化的算法,用于求解含有隐变量的概率模型的最大似然估计,包括高斯混合模型、隐马尔可夫模型等。EM算法通过交替进行E步和M步,来不断优化参数估计。其中E步计算隐变量的后验概率,M步更新模型参数。具体来说,对于高斯混合模型,E步计算隐变量对于每个高斯分量的响应度,M步更新高斯分量的均值和协方差矩阵。EM算法的实现一般涉及到隐变量的后验概率计算、模型参数的更新、收敛判断等步骤。

  9. 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))

你可能感兴趣的:(人工智能,学习,聚类)