-
- 春学期】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)