首页 > 编程知识 正文

量子聚类算法,混合高斯模型聚类

时间:2023-05-06 04:08:07 阅读:181627 作者:4564

一,介绍

要学会混合年轻的毛衣,首先要了解几个概念:

1、协方差:

协方差是测量两个随机变量联合分布线性相关程度。 两个随机变量线性相关越大,协方差越大,没有完全线性相关,协方差为零。

根据数学期待的性质:

协方差如下。

2、协方差矩阵:

对于zxdhs随机变量X=[X1,X2,X3,Xn],必须计算每个维中两个维之间的协方差。 这样,各协方差构成被称为协方差矩阵的nn的矩阵。

百度百科提供的实例:

3 )服从年轻毛衣分布的概率密度函数:

可知年轻毛衣的分布由平均矢量和协方差矩阵两个参数决定,所以将概率密度函数表示为p(x|,)

年轻毛衣的混合分布可以定义如下。

给定一组数据,假设该数据是从多个年轻毛衣的分布中生成的。 现在我们估计这些年轻毛衣分布的参数,以及每个样本属于年轻毛衣分布的概率。 根据样本推测原始GMM的概率分布就可以了。 具体解可在EM算法获得。

二,公式推导

假设有k个样本,根据c个年轻毛衣的分布,随机抽取一个样本x得到:

(1) ) ) )。

这里,是协方差矩阵,是簇的中心(矢量平均)

根据上面的公式,可以写出关于样本值(第I个样本)的概率密度函数。

(2) ) ) )。

根据贝叶斯定理

该分布由c个混合分量组成,每个混合对应于年轻毛衣的分布,p(CJ )是对应的“混合系数”,=1。

我们定义m个观测样本的对数似然函数:

为了得到最大对数似然函数,需要分别求出偏导数,并将其设为0 :

(一)求:

代入式)2),并且除去第k个分量,剩下的可以看作常数,得到以下内容

因为只有第k个样本相关,其他可以视为常数,上式为

使用对数复合函数导出时,可以得到:

利用贝叶斯公式,整理得到:

(3) ) )。

接下来,解开:

求导:

(4) ) )。

将偏导设为0,将公式(4)代入公式(3),并且知道不是0后,得到以下结果。

)2)求

似曾相识

                

                                                

利用矩阵求导的性质:

                                                                   

                              

                                                  

再继续求解得:

                           

我们假设K的位置再行i和列j上,那么可知,∑除了在位置(i,j)上为1以外,其他的都为零,上式结果为:

                                                                         

代入上式,获得:

                                                                    

(3)求k个分量的比例的问题

在(1)和(2)中,我们已经获取了和,我们要求K个分量最佳比例值,相当于优化:

                                                      

我们利用拉格朗日定理求解:

                                              

                                               

综上所述得到:

                                                                          

将其代入第K个分量,获得:

                                                                        

我们总结下算法流程:

第一步,初始化模型参数;

第二步,计算年轻的毛衣混合分布

                                                                

第三步,计算Ck的后验分布:

                                                               

第四步,计算新的均值向量、协方差矩阵、混合系数

                                                             

                                                            

                                                          

第五步,如果不满足条件,跳转到第二步继续计算。

第六步,满足条件,确定均值向量中心,获得分类模型

二,代码实现

数据:

0.697 0.460.774 0.3760.634 0.2640.608 0.3180.556 0.2150.403 0.2370.481 0.1490.437 0.2110.666 0.0910.243 0.2670.245 0.0570.343 0.0990.639 0.1610.657 0.1980.36 0.370.593 0.0420.719 0.1030.359 0.1880.339 0.2410.282 0.2570.748 0.2320.714 0.3460.483 0.3120.478 0.4370.525 0.3690.751 0.4890.532 0.4720.473 0.3760.725 0.4450.446 0.459 import numpy as npimport matplotlib.pyplot as plt# 预处理数据def loadDataSet(filename): dataSet = [] fr = open(filename) for line in fr.readlines(): curLine = line.strip().split('t') fltLine = list(map(float, curLine)) dataSet.append(fltLine) return dataSet# 年轻的毛衣分布的概率密度函数def prob(x, mu, sigma): n = np.shape(x)[1] expOn = float(-0.5 * (x - mu) * (sigma.I) * ((x - mu).T)) divBy = pow(2 * np.pi, n / 2) * pow(np.linalg.det(sigma), 0.5) # np.linalg.det 计算矩阵的行列式 return pow(np.e, expOn) / divBy# EM算法def EM(dataMat, maxIter=50,c=3): m, n = np.shape(dataMat) # 第一步,初始化参数 alpha = [1 / 3, 1 / 3, 1 / 3] # 初始化参数 alpha1=alpha2=alpha3=1/3 mu = [dataMat[5, :], dataMat[21, :], dataMat[26, :]] # 初始化聚类中心 mu1=x6,mu2=x22,mu3=x27 sigma = [np.mat([[0.1, 0], [0, 0.1]]) for x in range(3)] # 初始化协方差矩阵 gamma = np.mat(np.zeros((m, c))) for i in range(maxIter): for j in range(m): sumAlphaMulP = 0 for k in range(c): gamma[j, k] = alpha[k] * prob(dataMat[j, :], mu[k], sigma[k]) # 计算混合成分生成的后验概率 sumAlphaMulP += gamma[j, k] # 第二步,计算年轻的毛衣混合分布 for k in range(c): gamma[j, k] /= sumAlphaMulP # 第三步,计算后验分布 sumGamma = np.sum(gamma, axis=0) for k in range(c): mu[k] = np.mat(np.zeros((1, n))) sigma[k] = np.mat(np.zeros((n, n))) for j in range(m): mu[k] += gamma[j, k] * dataMat[j, :] mu[k] /= sumGamma[0, k] # 第四步,计算均值向量 for j in range(m): sigma[k] += gamma[j, k] * (dataMat[j, :] - mu[k]).T *(dataMat[j, :] - mu[k]) sigma[k] /= sumGamma[0, k] # 第四步,计算协方差矩阵 alpha[k] = sumGamma[0, k] / m # 第四步,计算混合系数 return gamma# init centroids with random samplesdef initCentroids(dataMat, k): numSamples, dim = dataMat.shape centroids = np.zeros((k, dim)) for i in range(k): index = int(np.random.uniform(0, numSamples)) centroids[i, :] = dataMat[index, :] return centroidsdef gaussianCluster(dataMat): m, n = np.shape(dataMat) centroids = initCentroids(dataMat, m) clusterAssign = np.mat(np.zeros((m, 2))) gamma = EM(dataMat) for i in range(m): clusterAssign[i, :] = np.argmax(gamma[i, :]), np.amax(gamma[i, :]) for j in range(m): pointsInCluster = dataMat[np.nonzero(clusterAssign[:, 0].A == j)[0]] centroids[j, :] = np.mean(pointsInCluster, axis=0) # 第五步,确定各均值中心,获得分类模型 return centroids, clusterAssigndef showCluster(dataMat, k, centroids, clusterAssment): numSamples, dim = dataMat.shape if dim != 2: print("Sorry! I can not draw because the dimension of your data is not 2!") return 1 大胆的胡萝卜 = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr'] if k > len(大胆的胡萝卜): print("Sorry! Your k is too large!") return 1 for i in range(numSamples): 大胆的胡萝卜Index = int(clusterAssment[i, 0]) plt.plot(dataMat[i, 0], dataMat[i, 1], 大胆的胡萝卜[大胆的胡萝卜Index]) 大胆的胡萝卜 = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb'] for i in range(k): plt.plot(centroids[i, 0], centroids[i, 1], 大胆的胡萝卜[i], 大胆的胡萝卜ersize=12) plt.show()if __name__=="__main__": dataMat = np.mat(loadDataSet('watermelon4.0.txt')) centroids, clusterAssign = gaussianCluster(dataMat) print(clusterAssign) showCluster(dataMat, 3, centroids, clusterAssign)

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。