K均值聚类
k均值聚类算法是一种迭代求解的聚类分析算法,给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。
K均值聚类是判别式还是生成式
K均值是一种判别式算法,通过将数据分为K个簇来进行聚类,它并不试图对数据的分布进行建模,而是直接将数据分为不同的簇。
KNN VS K-means
K-means本质上是无监督学习,而KNN是监督学习;K-means是聚类算法,KNN是分类算法。K-means算法把一个数据集分割成簇,使得形成的簇是同构的,每个簇里的点相互靠近。KNN算法尝试基于其k个周围邻居来对未标记的观察进行分类。
主成分分析
PCA是一种常用的数学分析的方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。
LDA VS PCA
LDA和PCA都是常用的数据降维技术。PCA旨在通过线性变换将高维数据投影到低维空间,以保留最多的数据方差信息。PCA是一种无监督方法,它不考虑类别标签信息。LDA也是一种线性变换方法,但它是有监督的。与PCA不同,LDA的目标是找到可以最大化不同类别之间的差异性和最小化同一类别内部的差异性的投影。
奇异值分解(SVD)
奇异值分解是一种矩阵分解技术,可以将一个矩阵分解为三个矩阵的乘积,其中中间的矩阵是对角矩阵,其对角线上的元素为奇异值。SVD在很多应用中都有重要的作用,如图像压缩、推荐系统等。
特征人脸方法
特征人脸方法是一种基于PCA的人脸识别方法,它将人脸图像投影到一个低维空间中,并使用投影后的特征向量进行人脸识别。
潜在语义分析
潜在语义分析是一种基于SVD的文本分析方法,它将文本表示为一个矩阵,并使用SVD将其分解为三个矩阵的乘积。LSA可以用于文本分类、信息检索等任务。
期望最大化算法
期望最大化算法是一种迭代算法,用于估计包含隐变量的概率模型参数。K均值聚类可以看作是EM算法在高斯混合模型中的特例
K-means是最简单的EM算法?
K均值聚类可以看作是最简单的EM算法之一。K均值聚类假设每个簇都是由一个高斯分布生成的,并且每个数据点只属于一个簇。
编程实现EM算法
def creat_gauss_dist(self):
// 构造一个高斯混合样本集
data1 = np.random.normal(self.miu1, self.sigma1, int(self.dataSize * self.phi_1))
data2 = np.random.normal(self.miu2, self.sigma2, int(self.dataSize * self.phi_2))
dataset = []
dataset.extend(data1)
dataset.extend(data2)
random.shuffle(dataset)
return dataset
```def calculate_gauss(self, dataset, miu, sigma):
/计算高斯核函数
:param miu: 高斯核伪均值
:param sigma: 高斯核方差
:return: 高斯分布概率值
"""
gauss = (1 / (math.sqrt(2 * math.pi) * sigma)) * \
np.exp(-1 * (dataset - miu) * (dataset - miu) / (2 * sigma ** 2))
return gauss
def E_step(self, dataset, phi_1, phi_2, miu1, miu2, sigma1, sigma2):
/// E步:
q1_numerator = phi_1 * self.calculate_gauss(dataset, miu1, sigma1)
q2_numerator = phi_2 * self.calculate_gauss(dataset, miu2, sigma2)
q_denominator = q1_numerator + q2_numerator
q1 = q1_numerator / q_denominator
q2 = q2_numerator / q_denominator
return q1, q2
def M_step(self, dataset, miu1, miu2, q1, q2):
/M步计算参数的最大似然估计
nk1 = np.sum(q1)
nk2 = np.sum(q2)
phi_new_1 = np.sum(q1) / len(q1)
phi_new_2 = np.sum(q2) / len(q2)
miu_new_1 = np.dot(q1, dataset) / nk1
miu_new_2 = np.dot(q2, dataset) / nk2
sigma_new_1 = math.sqrt(np.dot(q1, (dataset - miu1) ** 2) / nk1)
sigma_new_2 = math.sqrt(np.dot(q2, (dataset - miu2) ** 2) / nk2)
return miu_new_1, miu_new_2, sigma_new_1, sigma_new_2, phi_new_1, phi_new_2