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

    1. 春学期】AI作业4-无监督学习

1.K均值聚类 

        是一种最普及的聚类算法,接受一个未标记的数据集,然后将数据聚类成不同的组

        具体方法是选择k个随机的点称为聚类中心,对于数据集中的每一个数据,按照距离𝐾个中心点的距离,将其与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类。计算每一个组的平均值,将该组所关联的中心点移动到平均值的位置。直至中心点不变化。

2.K均值聚类是生成式还是判别式方法?

       K均值,是聚类算法,属于判别类方法。

3.KNN  VS.  K-means

        Knn是监督学习,对已知分类的数据进行训练和学习

        k-means是非监督学习,用过聚类方法将数据聚类,不需要对数据进行训练和学习。

4.主成分分析

       一种数据降维算法,可以用较少的新变量替换原来较多的新变量,替换的这些新变量可以尽可能的多保留原来反映的信息。

5.LDA VS. PCA

       都是降维方法,都符合高斯分布。

       LDA是监督学习,最多降到K-1的维度,更依赖于均值,可能过拟合数据。

       PCA是无监督学习,更依赖于方差,对数据拟合效果较好。

6.奇异值分解(SVD)

       一种适用于PCA的降维算法,作用是将任意较复杂的矩阵更小更简单的三个子矩阵的相乘表示,勇者三个小矩阵来描述大矩阵的重要特性,。

7.特征人脸方法(Eigenface)
       将每一张人脸拉成一个列向量,所有人脸构成一个矩阵,每列是一张列。对每一行都求平均值,得到一个列向量,我们称之为“平均脸”,是所有人脸的平均。每一个脸都减去平均脸。对中心化后的样本,求协方差矩阵的特征向量。每一个特征向量都是一张脸,我们称之为“特征脸”,原始的人脸可以表示为特征脸的线性组合。

8.潜在语义分析 (LSA)

       一种基于线性代数的自然语言处理技术,用于处理文本的语义相似性。它通过对文本的共现矩阵进行奇异值分解来提取文本的潜在语义,从而将文本表示为一个低维度的向量空间模型。这个向量空间模型可以用于比较和计算文本的语义相似性,以及进行自然语言处理任务,例如信息检索、文本分类、情感分析等。

9.期望最大化算法(EM)

       一种统计学习算法,主要用于无监督学习中的参数估计问题。它通过迭代求解潜在变量的期望值和最大化似然函数的方式,来估计模型参数。在EM算法中,假设有一个隐含变量模型,其中观测变量和隐含变量是相互依赖的。EM算法的目标是找到最大似然估计,即使得观测数据在模型下的条件概率最大的模型参数。

10.K-means是最简单的EM算法?

       k-means算法假设所有的簇都是同性质的,即所有的簇具有相同的方差,但在实际应用中,这种假设并不总是成立。k-means算法对初始质心的位置非常敏感,容易陷入局部最优解而无法达到全局最优解。所以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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值