【机器学习】聚类(三):原型聚类:高斯混合聚类

文章目录

  • 一、实验介绍
    • 1. 算法流程
    • 2. 算法解释
    • 3. 算法特点
    • 4. 应用场景
    • 5. 注意事项
  • 二、实验环境
    • 1. 配置虚拟环境
    • 2. 库版本介绍
  • 三、实验内容
    • 0. 导入必要的库
    • 1. 全局调试变量
    • 2. 调试函数
    • 3. 高斯密度函数(phi)
    • 4. E步(getExpectation)
    • 5. M步(maximize)
    • 6. 数据缩放函数
    • 7. 初始化参数
    • 8. GMM EM算法函数
    • 9. 主函数
  • 四、代码整合

  高斯混合聚类是一种基于概率模型的聚类方法,采用多个高斯分布的线性组合来表示数据的聚类结构。通过对每个样本的多个高斯分布进行加权组合,该算法能够更灵活地适应不同形状的聚类。

一、实验介绍

1. 算法流程

  1. 初始化:
      初始化高斯混合分布的模型参数,包括每个高斯混合成分的均值向量 μ i \mu_i μi、协方差矩阵 Σ i \Sigma_i Σi 和混合系数 π i \pi_i πi

{ ( μ 1 , Σ 1 , π 1 ) , ( μ 2 , Σ 2 , π 2 ) , . . . , ( μ k , Σ k , π k ) } \{(\mu_1, \Sigma_1, \pi_1), (\mu_2, \Sigma_2, \pi_2), ..., (\mu_k, \Sigma_k, \pi_k)\} {(μ1,Σ1,π1),(μ2,Σ2,π2),...,(μk,Σk,πk)}

  1. 迭代过程(EM算法):

    • Expectation (E) 步骤:
      对于每个样本 X j X_j Xj 计算其由各混合成分生成的后验概率 γ i j \gamma_{ij} γij,表示样本属于第 i i i 个混合成分的概率。

    γ i j = π i ⋅ N ( X j ∣ μ i , Σ i ) ∑ l = 1 k π l ⋅ N ( X j ∣ μ l , Σ l ) \gamma_{ij} = \frac{\pi_i \cdot \mathcal{N}(X_j | \mu_i, \Sigma_i)}{\sum_{l=1}^{k} \pi_l \cdot \mathcal{N}(X_j | \mu_l, \Sigma_l)} γij=l=1kπlN(Xjμl,Σl)πiN(Xjμi,Σi)

    • Maximization (M) 步骤:
      更新模型参数:
      • 新均值向量 μ i \mu_i μi 的更新: μ i = ∑ j = 1 m γ i j X j ∑ j = 1 m γ i j \mu_i = \frac{\sum_{j=1}^{m} \gamma_{ij} X_j}{\sum_{j=1}^{m} \gamma_{ij}} μi=j=1mγijj=1mγijXj
      • 新协方差矩阵 Σ i \Sigma_i Σi 的更新: Σ i = ∑ j = 1 m γ i j ( X j − μ i ) ( X j − μ i ) T ∑ j = 1 m γ i j \Sigma_i = \frac{\sum_{j=1}^{m} \gamma_{ij} (X_j - \mu_i)(X_j - \mu_i)^T}{\sum_{j=1}^{m} \gamma_{ij}} Σi=j=1mγijj=1mγij(Xjμi)(Xjμi)T
      • 新混合系数 π i \pi_i πi 的更新: π i = 1 m ∑ j = 1 m γ i j \pi_i = \frac{1}{m} \sum_{j=1}^{m} \gamma_{ij} πi=m1j=1mγij
  2. 停止条件:
      根据设定的停止条件,比如达到最大迭代轮数或模型参数的变化小于某一阈值。

  3. 簇划分:
      根据得到的后验概率 γ i j \gamma_{ij} γij 确定每个样本的簇标记,将样本划入概率最大的簇中。

    C i = { X j ∣ argmax i γ i j , 1 ≤ i ≤ k } C_i = \{X_j | \text{argmax}_i \gamma_{ij}, 1 \leq i \leq k\} Ci={Xjargmaxiγij,1ik}

  4. 输出:
      返回最终的簇划分 C = { C 1 , C 2 , . . . , C k } C = \{C_1, C_2, ..., C_k\} C={C1,C2,...,Ck}

  高斯混合聚类采用了迭代优化的方式,通过不断更新均值向量、协方差矩阵和混合系数,使得模型对数据的拟合更好。EM算法的E步骤计算后验概率,M步骤更新模型参数,整个过程不断迭代直至满足停止条件。最后,将每个样本划分到概率最大的簇中。

2. 算法解释

  • 通过EM算法的E步骤,计算每个样本属于每个混合成分的后验概率。
  • 通过EM算法的M步骤,更新每个混合成分的均值向量、协方差矩阵和混合系数,优化模型对数据的拟合。
  • 算法通过迭代过程,不断调整模型参数,使得混合分布更好地刻画数据的分布。

3. 算法特点

  • 通过多个高斯分布的组合,适用于不同形状的聚类结构。
  • 采用EM算法进行迭代优化,灵活适应数据的复杂分布。

4. 应用场景

  • 适用于数据具有多个分布的情况,且每个分布可以用高斯分布来描述。
  • 在图像分割、语音识别等领域广泛应用。

5. 注意事项

  • 初始参数的选择可能影响最终聚类效果,因此需要进行多次运行选择最优结果。
  • 算法对异常值不敏感,但在特定场景下可能需要考虑异常值的处理。

二、实验环境

1. 配置虚拟环境

conda create -n ML python==3.9
conda activate ML
conda install scikit-learn matplotlib

2. 库版本介绍

软件包本实验版本
matplotlib3.5.2
numpy1.21.5
python3.9.13
scikit-learn1.0.2

三、实验内容

0. 导入必要的库

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import multivariate_normal
from sklearn.datasets import load_iris

1. 全局调试变量

DEBUG = True
  • 该变量控制是否在执行过程中打印调试信息。

2. 调试函数

def debug(*args, **kwargs):
    global DEBUG
    if DEBUG:
        print(*args, **kwargs)
  • 用于打印调试信息的函数。在整个代码中都使用了它以进行调试。

3. 高斯密度函数(phi)

def phi(Y, mu_k, cov_k):
    # Check for and handle infinite or NaN values in Y
    norm = multivariate_normal(mean=mu_k, cov=cov_k)
    return norm.pdf(Y)
  • 计算多元高斯分布的概率密度函数。

4. E步(getExpectation)

def getExpectation(Y, mu, cov, alpha):
    N = Y.shape[0]
    K = alpha.shape[0]

    assert N > 1, "There must be more than one sample!"
    assert K > 1, "There must be more than one gaussian model!"

    gamma = np.mat(np.zeros((N, K)))

    prob = np.zeros((N, K))
    for k in range(K):
        prob[:, k] = phi(Y, mu[k], cov[k]) * alpha[k]

    prob = np.mat(prob)

    for k in range(K):
        gamma[:, k] = prob[:, k] / np.sum(prob, axis=1)

    return gamma
  • EM算法的E步骤,计算每个数据点属于每个簇的概率。主要步骤包括:
    • 初始化一个零矩阵 gamma 用于存储响应度。
    • 对于每个簇,计算每个数据点属于该簇的概率(通过 phi 函数计算),然后乘以该簇的混合系数。
    • 归一化概率以得到响应度矩阵 gamma

5. M步(maximize)

def maximize(Y, gamma):
    N, D = Y.shape
    K = gamma.shape[1]

    mu = np.zeros((K, D))
    cov = []
    alpha = np.zeros(K)

    for k in range(K):
        Nk = np.sum(gamma[:, k])
        mu[k, :] = np.sum(np.multiply(Y, gamma[:, k]), axis=0) / Nk

        diff = Y - mu[k]
        cov_k = np.dot(diff.T, np.multiply(diff, gamma[:, k])) / Nk
        cov_k += 1e-6 * np.identity(D)  # Adding a small value to the diagonal for stability
        cov.append(cov_k)

        alpha[k] = Nk / N

    cov = np.array(cov)
    return mu, cov, alpha

  • EM算法的M步骤,即更新模型参数,主要步骤包括:
    • 初始化均值 mu、协方差矩阵列表 cov 和混合系数 alpha
    • 对于每个簇,计算新的均值、协方差矩阵和混合系数。均值的更新是通过加权平均计算的,协方差矩阵的更新考虑了数据的权重(响应度),混合系数的更新是每个簇中数据点的权重之和。

6. 数据缩放函数

def scale_data(Y):
    for i in range(Y.shape[1]):
        max_ = Y[:, i].max()
        min_ = Y[:, i].min()
        Y[:, i] = (Y[:, i] - min_) / (max_ - min_)
    debug("Data scaled.")
    return Y
  • 将数据集中的每个特征缩放到 [0, 1] 范围内。

7. 初始化参数

def init_params(shape, K):
    N, D = shape
    mu = np.random.rand(K, D)
    cov = np.array([np.eye(D)] * K)
    alpha = np.array([1.0 / K] * K)
    debug("Parameters initialized.")
    debug("mu:", mu, "cov:", cov, "alpha:", alpha, sep="\n")
    return mu, cov, alpha

  • 初始化GMM的参数(均值、协方差和混合系数)。

在这里插入图片描述

8. GMM EM算法函数

def GMM_EM(Y, K, times):
    Y = scale_data(Y)
    mu, cov, alpha = init_params(Y.shape, K)
    for i in range(times):
        gamma = getExpectation(Y, mu, cov, alpha)
        mu, cov, alpha = maximize(Y, gamma)
    debug("{sep} Result {sep}".format(sep="-" * 20))
    debug("mu:", mu, "cov:", cov, "alpha:", alpha, sep="\n")
    return mu, cov, alpha

在这里插入图片描述

9. 主函数

if __name__ == '__main__':
    # Load Iris dataset
    iris = load_iris()
    Y = iris.data

    # Model parameters
    K = 3  # number of clusters
    iterations = 100

    # Run GMM EM algorithm
    mu, cov, alpha = GMM_EM(Y, K, iterations)

    # Clustering based on the trained model
    N = Y.shape[0]
    gamma = getExpectation(Y, mu, cov, alpha)
    category = gamma.argmax(axis=1).flatten().tolist()[0]

    # Plotting the results
    for i in range(K):
        cluster_data = np.array([Y[j] for j in range(N) if category[j] == i])
        plt.scatter(cluster_data[:, 0], cluster_data[:, 1], label=f'Cluster {i + 1}')

    plt.legend()
    plt.title("GMM Clustering By EM Algorithm")
    plt.xlabel("Feature 1")
    plt.ylabel("Feature 2")
    plt.show()

在这里插入图片描述

四、代码整合

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import multivariate_normal
from sklearn.datasets import load_iris

DEBUG = True


def debug(*args, **kwargs):
    global DEBUG
    if DEBUG:
        print(*args, **kwargs)


def phi(Y, mu_k, cov_k):
    # Check for and handle infinite or NaN values in Y
    norm = multivariate_normal(mean=mu_k, cov=cov_k)
    return norm.pdf(Y)


def getExpectation(Y, mu, cov, alpha):
    N = Y.shape[0]
    K = alpha.shape[0]

    assert N > 1, "There must be more than one sample!"
    assert K > 1, "There must be more than one gaussian model!"

    gamma = np.mat(np.zeros((N, K)))

    prob = np.zeros((N, K))
    for k in range(K):
        prob[:, k] = phi(Y, mu[k], cov[k]) * alpha[k]

    prob = np.mat(prob)

    for k in range(K):
        gamma[:, k] = prob[:, k] / np.sum(prob, axis=1)

    return gamma


def maximize(Y, gamma):
    N, D = Y.shape
    K = gamma.shape[1]

    mu = np.zeros((K, D))
    cov = []
    alpha = np.zeros(K)

    for k in range(K):
        Nk = np.sum(gamma[:, k])
        mu[k, :] = np.sum(np.multiply(Y, gamma[:, k]), axis=0) / Nk

        diff = Y - mu[k]
        cov_k = np.dot(diff.T, np.multiply(diff, gamma[:, k])) / Nk
        cov_k += 1e-6 * np.identity(D)  # Adding a small value to the diagonal for stability
        cov.append(cov_k)

        alpha[k] = Nk / N

    cov = np.array(cov)
    return mu, cov, alpha



def scale_data(Y):
    for i in range(Y.shape[1]):
        max_ = Y[:, i].max()
        min_ = Y[:, i].min()
        Y[:, i] = (Y[:, i] - min_) / (max_ - min_)
    debug("Data scaled.")
    return Y


def init_params(shape, K):
    N, D = shape
    mu = np.random.rand(K, D)
    cov = np.array([np.eye(D)] * K)
    alpha = np.array([1.0 / K] * K)
    debug("Parameters initialized.")
    debug("mu:", mu, "cov:", cov, "alpha:", alpha, sep="\n")
    return mu, cov, alpha


def GMM_EM(Y, K, times):
    Y = scale_data(Y)
    mu, cov, alpha = init_params(Y.shape, K)
    for i in range(times):
        gamma = getExpectation(Y, mu, cov, alpha)
        mu, cov, alpha = maximize(Y, gamma)
    debug("{sep} Result {sep}".format(sep="-" * 20))
    debug("mu:", mu, "cov:", cov, "alpha:", alpha, sep="\n")
    return mu, cov, alpha


if __name__ == '__main__':
    # Load Iris dataset
    iris = load_iris()
    Y = iris.data

    # Model parameters
    K = 3  # number of clusters
    iterations = 100

    # Run GMM EM algorithm
    mu, cov, alpha = GMM_EM(Y, K, iterations)

    # Clustering based on the trained model
    N = Y.shape[0]
    gamma = getExpectation(Y, mu, cov, alpha)
    category = gamma.argmax(axis=1).flatten().tolist()[0]

    # Plotting the results
    for i in range(K):
        cluster_data = np.array([Y[j] for j in range(N) if category[j] == i])
        plt.scatter(cluster_data[:, 0], cluster_data[:, 1], label=f'Cluster {i + 1}')

    plt.legend()
    plt.title("GMM Clustering By EM Algorithm")
    plt.xlabel("Feature 1")
    plt.ylabel("Feature 2")
    plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/220582.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

class文件结构

文章目录 1. 常量池集合2. 访问标志3. 字段表集合4. 方法表集合5. 属性表集合 成员变量(非静态)的赋值过程:1. 默认初始化 2. 显示初始化/代码块中初始化 3. 构造器中初始化 4. 有了对象后对象。属性或者对象。方法的方式对成员变量进行赋值 …

JVM之四种引用类型(五)

JVM 系列吊打面试官:说一下 Java 的四种引用类型 四种引种类型 1.强引用 在 Java 中最常见的就是强引用,把一个对象赋给一个引用变量,这个引用变量就是一个强引用。当一个对象被强引用变量引用时,它处于可达状态,它是…

RPG项目01_UI面板Game

基于“RPG项目01_技能释放”,将UI包导入Unity场景中, 将图片放置 拖拽 取消勾选(隐藏攻击切片) 对技能添加蒙版 调节父子物体大小一致 将子类蒙版复制 执行5次 运行即可看到技能使用完的冷却条 在Scripts下创建UI文件夹 写代码&am…

设计模式——七大设计原则

设计模式——七大设计原则 1、单一职责原则(SRP)2、开放封闭原则(OCP)3、依赖倒转原则(DIP)4、里氏替换原则 (LSP)5、接口隔离原则 (ISP)6、合成/聚合复用原则 (CARP)7、迪米特法则 (LoD) 了解 设计模式 的…

使用C语言创建高性能网络爬虫IP池

目录 一、引言 二、IP池的设计 1、需求分析 2、架构设计 3、关键技术 三、IP池的实现 1、存储实现 2、调度实现 3、通信实现 4、异常处理实现 四、代码示例 五、性能优化 六、测试与分析 七、结论 一、引言 随着互联网的快速发展,网络爬虫成为了获取…

2-1、地址加法器CS:IP

语雀原文链接 文章目录 1、CPU组成2、通用寄存器16位寄存器的存储16位寄存器兼容8位word 和 byte进位问题 3、地址加法器不同的段地址和偏移地址表示同一个物理地址偏移地址的范围一个段的起始地址一定是16的倍数 4、CS:IPCS IP工作过程jmp修改CS:IP 5、DS和[address]DS和[add…

高级搜索——伸展树Splay详解

文章目录 伸展树Splay伸展树Splay的定义局部性原理Splay的伸展操作逐层伸展双层伸展zig-zig/zag-zagzig-zag/zag-zigzig/zag双层伸展的效果与效率 伸展树的实现动态版本实现递增分配器节点定义Splay类及其接口定义伸展操作左单旋右单旋右左/左右双旋伸展 查找操作删除操作插入操…

Spring 保姆级带你认识,让你如何轻松应对面试官

Spring 保姆级带你认识,让你如何轻松应对面试官 1.Spring是什么?作用是什么? Spring是一个轻量级的JavaEE框架,它主要解决企业应用中的复杂性问题。Spring框架有三个核心部分:IoC容器、AOP和数据访问/集成层。Spring…

java--抽象类

1.什么是抽象类 ①在java中有一个关键字叫:abstract,它就是抽象的意思,可以用它修饰类、成员方法。 ②abstract修饰类,这个类就是抽象类;修饰方法,这个方法就是抽象方法。 2.抽象类的注意事项、特点 ①抽…

Vue3-ElementPlus按需导入

1.安装 pnpm add element-plus 2.配置按需导入: 官方文档:快速开始 | Element Plus 按照官网按需导入中的自动导入步骤来进行 pnpm add -D unplugin-vue-components unplugin-auto-import 观察Vite代码与原vite文件的差别,将原vite文件中没…

[数据结构]-map和set

前言 作者:小蜗牛向前冲 名言:我可以接受失败,但我不能接受放弃 如果觉的博主的文章还不错的话,还请点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、键值对…

【数据结构】二叉树的实现

目录 1. 前言2. 二叉树的实现2.1 创建一棵树2.2 前序遍历2.2.1 分析2.2.2 代码实现2.2.3 递归展开图 2.3 中序遍历2.3.1 分析2.3.2 代码实现2.3.3 递归展开图 2.4 后序遍历2.4.1 分析2.4.2 代码实现2.4.3 递归展开图 2.5 求节点个数2.5.1 分析2.5.2 代码实现 2.6 求叶子节点个数…

Linux 环境下的性能测试——top与stress

对于Linux 环境,top命令是使用频繁且信息较全的命令, 它对于所有正在运行的进行和系统负荷提供实时更新的概览信息。stress是个简单且全面的性能测试工具。通过它可以模拟各种高负载情况。 通过top与stress这两个命令的结合使用,基本可以达到…

解决:ModuleNotFoundError: No module named ‘exceptions’

解决:ModuleNotFoundError: No module named ‘exceptions’ 文章目录 解决:ModuleNotFoundError: No module named exceptions背景报错问题翻译:报错位置代码报错原因解决方法今天的分享就到此结束了 背景 在使用之前的代码时,报…

报表控件Stimulsoft 操作演示:访问编译的报告

使用编译计算模式的报告能够执行使用报告脚本语言实现的各种脚本。然而,这些场景并不总是安全的,从网络安全的角度来看,可能会导致负面情况。经过分析情况,我们决定加强有关编译模式报告的安全策略。但让我们一步一步来。顺便说一…

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Mybatis核心配置详解

第一章 Mybatis核心配置详解【mybatis-config.xml】 1.1 核心配置文件概述 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 1.2 核心配置文件根标签 没有实际语义,主要作用:所有子标签均需要设置在跟标签内部 1.3 核心配置文件…

【数电笔记】17-具体函数的卡诺图填入

目录 说明: 用卡诺图表示逻辑函数 1. 基本步骤 2. 例题 2.1 例1-真值表转换卡诺图 2.2 例2-标准与或式画卡诺图 2.3 例3-非标准与或式画卡诺图(常见,重点掌握) 说明: 笔记配套视频来源:B站;本系列笔…

学生档案管理系统研究

摘 要 学生档案管理系统是一个教育单位不可缺少的部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生档案管理系统应该能够为用户提供充足的信息和快捷的查询手段。但一直以来人们使用传统人工的方式管理文件档案,这种管理方式存在着许多缺点,如:效率低…

gpt阅读论文利器

1. txyz.ai 读论文 严伯钧 3. consensus 两亿科学论文的资源库. 用英文. 中国经济发展, 美国加州没有,减肥没有. 2. chrome插件 gpt sidebar 3. gpt academic 论文润色和学术翻译 ,一键输出公式. 英语口语8000句. 托福备考计划表. 百词斩托福. 薄荷外刊. 分区笔记精读法.…

java--接口的其他细节

1.jdk8开始,接口新增了三种形式的方法 ①默认方法(实例方法):使用用default修饰,默认会被加上public修饰。注意:只能使用接口的实现类对象调用 ②私有方法:必须用private修饰(jdk9开始才支持) ③类方法(静态方法)&a…