AI作业4

  1.  K均值聚类  

    一种迭代求解的聚类分析算法。给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。
  2. K均值聚类是生成式还是判别式方法?

    不是生成式也不是判别式。
  3. KNN  VS.  K-means

    KNN属于监督学习,类别是已知的,通过对已知分类的数据进行训练和学习,找到这些不同类的特征,再对未分类的数据进行分类。

    Kmeans属于非监督学习,事先不知道数据会分为几类,通过聚类分析将数据聚合成几个群体。聚类不需要对数据进行训练和学习。

  4. 主成分分析

    将高维数据映射到低维空间,从而实现对数据的降维和特征提取
  5. LDA VS. PCA

    1. 两者均可以对数据进行降维。
    2. 两者在降维时均使用了矩阵特征分解的思想。
    3. 两者都假设数据符合高斯分布。
    4. LDA是有监督的降维方法,而PCA是无监督的降维方法
    5. LDA除了可以用于降维,还可以用于分类。
  6. 奇异值分解(SVD)

    矩阵的奇异值分解是指,将一个非零的m xn实矩阵A,A ∈ RTXn,表示为以下三个实矩阵乘积形式的运算,即进行矩阵的因子分解:                                                                                                                                         A=U \Sigma V^{\mathrm{T}}                                                                          其中U是m 阶正交矩阵( orthogonal matrix ),V是n 阶正交矩阵,又是由降序排列的非负的对角线元素组成的m x n矩形对角矩阵( rectangular diagonal matrix ),
  7. 特征人脸方法(Eigenface)

    将PCA方法应用到人脸识别中,将人脸图像看成是原始数据集,使用PCA方法对其进行处理和降维,得到“主成分”——即特征脸,然后每个人脸都可以用特征脸的组合进行表示。
  8. 潜在语义分析 (LSA)

    基于奇异值分解(SVD)的文本挖掘技术,它通过将文本转化为向量空间模型,利用矩阵分解技术找到文本语义的潜在结构,从而实现文本的自动分类、聚类和相似性计算。
  9. 期望最大化算法(EM)

    通过迭代的方式,交替进行两个步骤:E步骤和M步骤,从而不断更新模型参数,直到收敛。
  10. K-means是最简单的EM算法?

    K-means是EM算法的一种特殊情况。
  11. 编程实现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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值