1.K均值聚类
k均值聚类是常见的无监督学习算法,可以将数据集分成k个不同的组或聚类。算法可以最小化组内平方误差之和。
1.初始化聚类的质心
2.将每个待聚类数据放入唯一一个聚类集合,计算数据和质心之间的欧氏距离,将数据放入距离最近质心的集合
3.根据聚类结果,更新聚类质心
4.算法循环迭代,直到满足条件
2.KNN VS. K-means
KNN和K-means相似点是都给了一个指定的点,在数据集中找离它最近的点
KNN是一种监督学习分类算法,没有明显的早期训练过程,算法中的K是样本x分类,x附近找离最近的K个点。
K-means是一种非监督学习聚类算法,有明显的早期训练过程,算法中K的是由人工固定好的数字,假设数据集合可以分为K个簇
3.主成分分析(PCA)
一种无监督算法,用于降维、特征提取、数据压缩等
通过分析找到数据特征的主要成分,使用这些主要成分代替原始数据。
降维后的结果保持原始数据的原有结构
4.LDA VS. PCA
LDA线性判别分析是一种监督学习算法,主要是将数据投影到一个低维的空间,同时还能最大程度的保留类别之间的差异。可以让映射后的样本有最好的分类性能。
PCA主成分分析则是让映射后的样本有最大的发散性
5.奇异值分解(SVD)
奇异值分解是将一个复杂变换分解为三个简单变换的矩阵分解技术
奇异值能够代表这个矩阵的信息
6.特征人脸方法(Eigenface)
特征人脸方法有三个步骤:
·用主成分分析实现人脸图像降维
·用奇异值分解实现主成分分析,简化运算
·把人脸从像素空间变换到另一个空间,在另一个空间中做相似性计算
7.潜在语义分析 (LSA)
LSA是一种无监督学习技术,用于文本的话题分析
可以通过矩阵分解发现文本与单词之间的基于话题的语义关系
相比于传统的以单词向量处理的文本信息处理方法,潜在语义分析都是以话题向量做处理,可以更准确地表示文本之间的语义相似度
8.期望最大化算法(EM)
期望最大化算法是一种常见的统计学习算法,用于求解含有隐变量的概率模型参数的最大似然估计。
EM算法可以看作是一种迭代优化算法,其优点在于可以有效地处理含有隐变量的复杂模型,并且不需要对隐变量的取值进行穷举搜索,从而大大提高了算法的计算效率。
9.K-means是最简单的EM算法?
K-means是一种基于EM算法的聚类算法,但并不是最简单的EM算法
10.编程实现EM算法
import numpy as np
# 定义高斯混合模型的 EM 算法
def em_algorithm(data, num_clusters, max_iterations):
num_samples, num_features = data.shape
# 初始化混合模型参数
means = np.random.randn(num_clusters, num_features)
covariances = [np.eye(num_features) for _ in range(num_clusters)]
weights = np.ones(num_clusters) / num_clusters
# 迭代优化
for iteration in range(max_iterations):
# E 步骤:计算每个样本属于每个簇的概率
responsibilities = np.zeros((num_samples, num_clusters))
for i in range(num_samples):
for j in range(num_clusters):
responsibilities[i, j] = weights[j] * multivariate_normal(data[i], means[j], covariances[j])
responsibilities[i] /= np.sum(responsibilities[i])
# M 步骤:更新模型参数
for j in range(num_clusters):
N = np.sum(responsibilities[:, j])
means[j] = np.sum(responsibilities[:, j].reshape(-1, 1) * data, axis=0) / N
covariances[j] = np.dot((responsibilities[:, j].reshape(-1, 1) * (data - means[j])).T, (data - means[j])) / N
weights[j] = N / num_samples
return means, covariances, weights
# 多元高斯分布的概率密度函数
def multivariate_normal(x, mean, covariance):
d = len(x)
exponent = -0.5 * np.dot(np.dot((x - mean).T, np.linalg.inv(covariance)), (x - mean))
coefficient = 1.0 / (np.power((2 * np.pi), d / 2) * np.sqrt(np.linalg.det(covariance)))
return coefficient * np.exp(exponent)
# 示例数据
data = np.array([[1.5, 1.7], [1.3, 1.9], [0.8, 2.2], [1.2, 2.0]])
# 运行 EM 算法
num_clusters = 2
max_iterations = 100
means, covariances, weights = em_algorithm(data, num_clusters, max_iterations)
print("Means:")
print(means)
print("Covariances:")
print(covariances)
print("Weights:")
print(weights)