首页 > 编程语言 >KMeans算法与GMM混合高斯聚类

KMeans算法与GMM混合高斯聚类

时间:2023-04-16 22:57:33浏览次数:47  
标签:plt GMM 样本 KMeans centroids 聚类 np

一、K-Means

K-Means是GMM的特例(硬聚类,基于原型的聚类)。假设多元高斯分布的协方差为0,方差相同。   K-Means算法思想 对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。 0 N个d维样本,时间复杂度 O(kLNd)
  1. 初始K个类(簇心)
  2. E步:对每个样本,计算到K个类的欧式距离,并分配类标签 O(kNd)
  3. M步:基于类内的样本,以样本均值更新类(均值最小化,类到类内样本的误差) O(Nd)
  4. 重复2-3步,直到聚类结果不变化或收敛
迭代次数为L   收敛性证明:   聚类处理: 特征归一化,缺失值,异常值   K-Means的主要优点有:   1)基于原型的聚类,实现简单收敛速度快。   2)聚类效果较优。   3)算法的可解释度比较强。   4)主要需要调参的参数仅仅是簇数k。 K-Means的主要缺点有:   1)K值的选取不好把握   2)对于不是凸的数据集比较难收敛   3)如果各隐含类别的数据不平衡,比如各隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。   4) 采用迭代方法,得到的结果只是局部最优(本身是个NP-hard问题,组合优化,多项式系数)   5) 对噪音和异常点比较的敏感。  
# 基于Cursor生成的代码
import numpy as np

def k_means(X, k, max_iters=100):
    # randomly initialize centroids
    centroids = X[np.random.choice(range(len(X)), k, replace=False)]
    
    for i in range(max_iters):
        # calculate distances between each point and each centroid
        distances = np.sqrt(((X - centroids[:, np.newaxis])**2).sum(axis=2))
        
        # assign each point to the closest centroid
        labels = np.argmin(distances, axis=0)
        
        # update centroids to be the mean of the points assigned to them
        for j in range(k):
            centroids[j] = X[labels == j].mean(axis=0)
    
    return centroids, labels

d = 3
k = 3
X = np.random.rand(100, 3)
centroids, labels = k_means(X, k, max_iters=100)

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10, 7))
ax = fig.add_subplot(111, projection='3d')

ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=labels, cmap='viridis')
ax.scatter(centroids[:, 0], centroids[:, 1], centroids[:, 2], marker='*', s=300, c='r')

ax.set_xlabel('X Label')
ax.set_ylabel('Y Label')
ax.set_zlabel('Z Label')

plt.show()

二、GMM

⾼斯分布的线性组合可以给出相当复杂的概率密度形式。 通过使⽤⾜够多的⾼斯分布,并且调节它们的均值和⽅差以及线性组合的系数,⼏乎所有的连续概率密度都能够以任意的精度近似。 0 对3个高斯分布的概率密度函数进行加权。考虑K个⾼斯概率密度的叠加,形式为: 0 0 混合⾼斯(mixture of Gaussians),每⼀个⾼斯概率密度N (x | µk, Σk)被称为混合分布的⼀个成分(component),并且有⾃⼰的均值µk和协⽅差Σk。 0 具有3个成分的混合⾼斯分布的轮廓线。参数πk被称为混合系数。GMM   可把πk = p(k)看成选择第k个成分的先验概率, 把 密度N (x | µk, Σk) = p(x | k)看成以k为条件的x的概率。 ⾼斯混合分布的形式由参数π, µ和Σ控制,其中令π ≡ {π1, . . . , πK}, µ ≡ {µ1, . . . , µK}且Σ ≡ {Σ1, . . . , Σk}。⼀种确定这些参数值的⽅法是使⽤最⼤似然法。根据公式),对数似然函数为: 0 因为对数中存在⼀个求和式,导致参数的最⼤似然解不再有⼀个封闭形式的解析解:
  • ⼀种最⼤化这个似然函数的⽅法是使⽤迭代数值优化⽅法。
  • 另⼀种是使⽤EM期望最⼤化算法(对包含隐变量的似然进行迭代优化)。
  样本x为观测数据,混合系数为隐变量,高斯分布的参数。 当成分为多元高斯分布时(d维),相当于从混合多元高斯分布中生成了样本,通过EM算法迭代地学习模型参数(均值和方差以及混合系数)。
  1. 期望:根据参数,更新样本关于类的响应度(隶属度,相当于分别和K个类计算距离并归一化)。确定响应度,就可以确定EM算法的Q函数(完全数据的对数似然关于 分布的期望),原始似然的下界。
  2. 最大化:根据响应度,计算均值、方差。
EM算法收敛后,直接求每个样本关于成分的响应度即可得到聚类结果(可软,可硬argmax)   当多元高斯分布的方差相同时,且每个样本只能指定给一个类时(one-hot响应度,argmax),GMM退化成K-means算法。 0
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
from sklearn.cluster import KMeans

# 创建数据,并可视化
X, y = datasets.make_blobs(n_samples=1500,
                             cluster_std=[1.0, 2.5, 0.5],
                             random_state=170)
plt.figure(figsize=(12,4))
plt.rcParams['font.family'] = 'STKaiti'
plt.rcParams['font.size'] = 20
plt.subplot(1,3,1)
plt.scatter(X[:,0],X[:,1],c = y)
plt.title('原始数据',pad = 20)
Kmeans聚类
kmeans = KMeans(3)
kmeans.fit(X)
y_ = kmeans.predict(X)
plt.subplot(1,3,2)
plt.scatter(X[:,0],X[:,1],c = y_)
plt.title('KMeans聚类效果',pad = 20)
GMM高斯混合模型聚类
gmm = GaussianMixture(n_components=3)
y_ = gmm.fit_predict(X)
plt.subplot(1,3,3)
plt.scatter(X[:,0],X[:,1],c = y_)
plt.title('GMM聚类效果',pad = 20)
 
plt.figtext(x = 0.51,y = 1.1,s = 'KMeans VS GMM',ha = 'center',fontsize = 30)
plt.savefig('./GMM高斯混合模型.png',dpi = 200)
0 优点:
  • 可以完成大部分形状的聚类
  • 大数据集时,对噪声数据不敏感
  • 对于距离或密度聚类,更适合高维特征
缺点:
  • 计算复杂高,速度较慢
  • 难以对圆形数据聚类
  • 需要在测试前知道类别的个数(成分个数,超参数)
  • 初始化参数会对聚类结果产生影响
参考 1.https://www.jianshu.com/p/2c42c567e893 2. PRML

标签:plt,GMM,样本,KMeans,centroids,聚类,np
From: https://www.cnblogs.com/justLittleStar/p/17324344.html

相关文章

  • MATLAB代码:基于改进K-means算法的含电动汽车负荷源荷场景聚类
    MATLAB代码:基于改进K-means算法的含电动汽车负荷源荷场景聚类关键词:有序聚类 改进k-means聚类电动汽车负荷聚类风光场景聚类 仿真平台:MATLAB主要内容:代码主要做的是基于改进k-means算法的场景生成,具体为含有电动汽车负荷的场景聚类问题,其中,光电和电负荷用有序聚类方法,风......
  • 基于ISODATA改进算法的负荷场景曲线聚类(适用于风光场景生成)
    基于ISODATA改进算法的负荷场景曲线聚类(适用于风光场景生成)摘要:代码主要做的是一种基于改进ISODATA算法的负荷场景曲线聚类,代码中,主要做了四种聚类算法,包括基础的K-means算法、ISODATA算法、L-ISODATA算法以及K-L-ISODATA算法,并且包含了对聚类场景以及聚类效果的评价,通过DBI的计......
  • 复杂网络社区发现算法聚类分析全国电梯故障数据和可视化:诊断电梯“安全之殇”|附代码
    参考原文:http://tecdat.cn/?p=2186最近我们被客户要求撰写关于复杂网络社区发现算法的研究报告,包括一些图形和统计输出。物业工程肩负着维持项目各类设施设备的正常运作,保障全体业主的正常生活,令物业保值升值,是项目的心脏部门。拓端数据(tecdat)研究人员根据全国电梯故障上报汇总......
  • MATLAB代码:基于DBSCAN密度聚类的风电-负荷场景削减方法
    MATLAB代码:基于DBSCAN密度聚类的风电-负荷场景削减方法关键词:密度聚类场景削减DBSCAN场景生成与削减kmeans 参考文档:《氢能支撑的风-燃气耦合低碳微网容量优化配置研究》第3章:完美复现仿真平台:MATLAB主要内容:代码主要做的是一个基于DBSCAN密度聚类的风电-负荷场景生成与......
  • 数据挖掘中聚类和分类有什么区别
         分类(classification)是这样的过程:它找出描述并区分数据类或概念的模型(或函数),以便能够使用模型预测类标记未知的对象类。分类分析在数据挖掘中是一项比较重要的任务,目前在商业上应用最多。分类的目的是学会一个分类函数或分类模型(也常常称作分类器),该模型能把......
  • 聚类与分类区别2
       在分类中,对于目标数据库中存在哪些类是知道的,要做的就是将每一条记录分别属于哪一类标记出来。聚类需要解决的问题是将已给定的若干无标记的模式聚集起来使之成为有意义的聚类,聚类是在预先不知道目标数据库到底有多少类的情况下,希望将所有的记录组成不同的类或者说聚类,并且......
  • 机器学习(五):混合高斯聚类(求聚类标签)+PCA降维(3维降2维)习题
    使用混合高斯模型GMM,计算如下数据点的聚类过程:\(Data=np.array([1,2,6,7])\)均值初值为:\(\mu_1,\mu_2=1,5\)权重初值为:\(w_1,w_2=0.5,0.5\)方差:\(std_1,std_2=1,1\)\(K=2\)10次迭代后数据的聚类标签是多少?采用python代码实现:fromscipyimport......
  • 聚类算法
    1.概念聚类->无监督学习(无分类、分组信息)实现->距离、相似性系数目的->数据预处理->复杂数据结构(多维)->标准化发现数据之间的依赖关系,删除或合并有密切依赖关系的数据2.分类1.基于划分的聚类方法自顶向下概念:n个元素组成的数据集D,将数据分成k(k<=n)个簇......
  • 基于凸集上投影(POCS)的聚类算法
    POCS:ProjectionsontoConvexSets。在数学中,凸集是指其中任意两点间的线段均在该集合内的集合。而投影则是将某个点映射到另一个空间中的某个子空间上的操作。给定一个凸集合和一个点,可以通过找到该点在该凸集合上的投影来进行操作。该投影是离该点最近的凸集内的点,可以通过最小......
  • R语言Kmeans聚类、PAM、DBSCAN、AGNES、FDP、PSO粒子群聚类分析iris数据结果可视化比
    全文链接:http://tecdat.cn/?p=32007原文出处:拓端数据部落公众号本文以iris数据和模拟数据为例,帮助客户了比较R语言Kmeans聚类算法、PAM聚类算法、DBSCAN聚类算法、AGNE......