使用高斯混合模型进行聚类

一、说明

        高斯混合模型 (GMM) 是一种基于概率密度估计的聚类分析技术。它假设数据点是由具有不同均值和方差的多个高斯分布的混合生成的。它可以在某些结果中提供有效的聚类结果。

二、Kmean算法有效性

        K 均值聚类算法在每个聚类的中心周围放置一个圆形边界。当数据具有圆形时,此方法非常有效。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeansnp.random.seed(42)def generate_circular(n_samples=500):X = np.concatenate((np.random.normal(0, 1, (n_samples, 2)),np.random.normal(5, 1, (n_samples, 2)),np.random.normal(10, 1, (n_samples, 2))))return XX = generate_circular()kmeans = KMeans(n_clusters=3, random_state=42)
kmeans_labels = kmeans.fit_predict(X)# boundaries of the cluster spheres
radii = [np.max(np.linalg.norm(X[kmeans_labels == i, :] - kmeans.cluster_centers_[i, :], axis=1))for i in range(3)]# plot
fig, ax = plt.subplots(ncols=2, figsize=(10, 4))ax[0].scatter(X[:, 0], X[:, 1])
ax[0].set_title("Data")ax[1].scatter(X[:, 0], X[:, 1], c=kmeans_labels)
ax[1].scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1],marker='x', s=200, linewidth=3, color='r')
for i in range(3):ax[1].add_artist(plt.Circle(kmeans.cluster_centers_[i, :], radius=radii[i], color='r', fill=False, lw=2))
ax[1].set_title("K Means Clustering")plt.show()
K 表示具有圆形聚类的聚类。 

        但是,当数据具有不同的形状(如长方形或椭圆形)时,此方法可能无效。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeansnp.random.seed(42)def generate_elliptic(n_samples=500):X = np.concatenate((np.random.normal([0, 3], [0.3, 1], (n_samples, 2)),np.random.normal([2, 4], [0.3, 1], (n_samples, 2)),np.random.normal([4, 6], [0.4, 1], (n_samples, 2))))return XX = generate_elliptic()kmeans = KMeans(n_clusters=3, random_state=42)
kmeans_labels = kmeans.fit_predict(X)
kmeans_cluster_centers = kmeans.cluster_centers_# the radius of each cluster
kmeans_cluster_radii = [np.max(np.linalg.norm(X[kmeans_labels == i, :] - kmeans.cluster_centers_[i, :], axis=1))for i in range(3)]# plot
fig, ax = plt.subplots(ncols=2, figsize=(10, 4))ax[0].scatter(X[:, 0], X[:, 1])
ax[0].set_title("data")ax[1].scatter(X[:, 0], X[:, 1], c=kmeans_labels)
ax[1].scatter(kmeans_cluster_centers[:, 0], kmeans_cluster_centers[:, 1],marker='x', s=200, linewidth=3, color='r')
for i in range(3):circle = plt.Circle(kmeans_cluster_centers[i], kmeans_cluster_radii[i], color='r', fill=False)ax[1].add_artist(circle)
ax[1].set_title("k-means clustering")
plt.xlim(-4, 10) 
plt.ylim(-4, 10)
plt.show()
K 表示具有椭圆形状聚类的聚类

三、比K-mean更进步的GMM

        GMM 通过使用高斯分布表示聚类来扩展 K 均值模型。与 K 均值不同,GMM 不仅捕获聚类的均值,还捕获协方差,允许对其椭圆体形状进行建模。为了拟合GMM,我们使用期望最大化(EM)算法,该算法最大化了观察到的数据的可能性。EM 类似于 K 均值,但将数据点分配给具有软概率的聚类,而不是硬赋值。

        在高层次上,GMM 结合了多个高斯分布来对数据进行建模。不是根据最近的质心来识别聚类,而是将一组 高斯拟合到数据中,并为每个聚类估计平均值、方差和权重等参数。了解每个数据点的参数后,可以计算概率以确定该点属于哪个聚类。

        每个分布都按权重因子 (π) 加权,以考虑聚类中不同的样本数量。例如,如果我们只有来自红色聚类的 1000 个数据点,但来自绿色聚类的 100,000 个数据点,我们将对红色聚类分布进行更严格的权衡,以确保它对整体分布产生重大影响。

组件。源

        GMM算法由两个步骤组成:期望(E)和最大化(M)。

        第一步称为期望步骤或 E 步骤,包括计算给定模型参数 πk μk 和 σk 的每个数据点 xi∈X 的组件分配 Ck 的期望。

        第二步称为最大化步骤或M步骤,它包括最大化E步骤中相对于模型参数计算的期望。此步骤包括更新值 πk、μk 和 σk。

        整个迭代过程重复,直到算法收敛,给出最大似然估计。直观地说,该算法之所以有效,是因为知道每个 xi 的分量赋值 Ck 使得求解 πk μk 和 σk 变得容易,而知道 πk μk σk 使得推断 p(Ck|xi) 变得容易。

        期望步骤对应于后一种情况,而最大化步骤对应于前一种情况。因此,通过在假定固定值或已知值之间交替,可以有效地计算非固定值的最大似然估计值。

算法

  1. 使用随机或预定义值初始化平均值 (μk)、协方差矩阵 (σk) 和混合系数 (πk)。
  2. 计算所有群集的组件分配 (Ck)。
  3. 使用当前组件分配 (Ck) 估计所有参数。
  4. 计算对数似然函数。
  5. 设置收敛标准。
  6. 如果对数似然值收敛到特定阈值,或者所有参数都收敛到特定值,请停止算法。否则,请返回到步骤 2。

需要注意的是,此算法保证收敛到局部最优值,但不能确保此局部最优值也是全局最优值。因此,如果算法从不同的初始化开始,则可能会导致不同的配置。

四、python代码

 from sklearn.mixture import GaussianMixture

参数:

  • n_components是聚类数。
  • covariance_type确定 GMM 使用的协方差矩阵的类型。它可以采用以下值: :每个混合分量都有其通用协方差矩阵。:所有混合分量共享相同的一般协方差矩阵。:每个混料分量都有其对角协方差矩阵。:每个混合分量都有其单个方差值,从而生成球形协方差矩阵。fulltieddiagspherical
  • tol控制 EM 算法的收敛阈值。当对数可能性的改进低于此阈值时,它将停止。
  • reg_covar在协方差矩阵的对角线中添加正则化项,以确保计算过程中的数值稳定性。它有助于防止条件不佳或奇异协方差矩阵的潜在问题。
  • max_iter是 EM 迭代的次数。
  • n_init控制模型参数的初始化。它可以采用以下值:“kmeans:初始均值是使用 K 均值算法估计的。random“:从数据中随机选择初始均值,并初始化协方差和混合系数。
  • weights_init手动指定每个组分的初始权重(混合系数)。
  • means_init手动指定每个分量的初始平均向量。
  • precision_init手动指定每个分量的初始精度矩阵(协方差矩阵的逆)。
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.mixture import GaussianMixturedef generate_elliptic(n_samples=500):X = np.concatenate((np.random.normal([0, 3], [0.3, 1], (n_samples, 2)),np.random.normal([2, 4], [0.3, 1], (n_samples, 2)),np.random.normal([4, 6], [0.4, 1], (n_samples, 2))
))return XX = generate_elliptic()# k-means clustering
kmeans = KMeans(n_clusters=3, random_state=0).fit(X)
kmeans_labels = kmeans.labels_# Gaussian mixture clustering
gmm = GaussianMixture(n_components=3, random_state=0).fit(X)
gmm_labels = gmm.predict(X)# Plot the clustering results
fig, axs = plt.subplots(1, 2, figsize=(10, 5))axs[0].scatter(X[:, 0], X[:, 1], c=kmeans_labels)
axs[0].set_title('K-means clustering')axs[1].scatter(X[:, 0], X[:, 1], c=gmm_labels)
axs[1].set_title('Gaussian mixture clustering')plt.show()

K-means vs Gaussian. Image by the author.

print("Weights: ", gmm.weights_)
print("Means: ", gmm.means_)
print("Covariances: ", gmm.covariances_)
print("Precisions: ", gmm.precisions_)"""
Weights:  [0.33300331 0.33410451 0.33289218]
Means:  [[ 1.98104152e+00  3.95197560e+00][ 3.98369464e+00  5.93920471e+00][-4.67796574e-03  2.97097723e+00]]
Covariances:  [[[ 0.08521068 -0.00778594][-0.00778594  1.01699345]][[ 0.16066983 -0.01669341][-0.01669341  1.0383678 ]][[ 0.09482093  0.00709653][ 0.00709653  1.03641711]]]
Precisions:  [[[11.74383346  0.08990895][ 0.08990895  0.98397883]][[ 6.23435734  0.10022716][ 0.10022716  0.9646612 ]][[10.55160153 -0.07224865][-0.07224865  0.96535719]]]
"""

奥坎·耶尼根 

五、结论

        GMM 在处理复杂的数据分布、异构数据集或涉及密度估计的任务时特别有用。它们在建模和捕获数据底层结构方面提供了灵活性,使其成为各种机器学习和数据分析任务中的宝贵工具。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Neo4j图数据库实践——基于知识图谱方法开发构建猪类养殖疾病问答查询系统

Neo4j是一个开源的、高性能的图形数据库。它被设计用于存储、检索和处理具有复杂关系的大规模数据。与传统的关系型数据库不同,Neo4j使用图形结构来表示数据,其中节点表示实体,边表示实体之间的关系。这使得Neo4j在处理关系密集型数据时非常强…

【GNN 03】PyG

工具包安装: 不要pip安装 https://github.com/pyg-team/pytorch_geometrichttps://github.com/pyg-team/pytorch_geometric import torch import networkx as nx import matplotlib.pyplot as pltdef visualize_graph(G, color):plt.figure(figsize(7, 7))plt.xtic…

企业架构LNMP学习笔记14

默认官方模块: Gzip压缩: 压缩文件,使文件变小了,传输更快了,目前大部分市场浏览器都支持Gzip。 传输的时候省流量。 目的是为了提高用户的加载速度。 #开启gzip压缩 gzip on; #http协议版本 gzip_http_version 1.0…

Maven 知识点总结

文章目录 Maven1、Maven 坐标2、Maven 仓库3、Maven 依赖依赖配置依赖范围依赖调解原则排除依赖 4、Maven 生命周期5、Maven 聚合与继承 Maven Maven是一个项目管理工具,它包含了项目对象模型(POM:Project Object Model)&#xf…

无人机通信协议MAVLink简介

Micro Air Vehicle Link(简称MAVLink)用于无人系统(例如,机器人、无人机、无人车、无人船和无人潜航器)。它定义了一组无人系统和地面站之间的消息交换规则。此协议广泛用于无人驾驶系统中,特别是ArduPilot和PX4无人驾驶系统,MAVLink协议提供了强大的功能,不仅用于监视…

Linux安装Redis(详细教程)

Linux安装Redis 注:希望将redis安装到此目录 /usr/local/redis 希望将安装包下载到此目录 /usr/local/src 可自己选择 1.创建安装目录/usr/local/redis mkdir /usr/local/redis 2.进入安装包目录 cd /usr/local/redis 3.进行下载安装包 wget https://download…

用python实现基本数据结构【03/4】

说明 如果需要用到这些知识却没有掌握,则会让人感到沮丧,也可能导致面试被拒。无论是花几天时间“突击”,还是利用零碎的时间持续学习,在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢?列表、字典、集…

JDK8新特性--函数式接口--(Consumer的概念理解,模拟练习,企业实战)全流程彻底搞懂

背景,起因是因为在项目开发过程中,发现了一处代码的写法觉得很新奇看不懂,了解后发现是用到了函数式接口的知识。特此学习记录,整体过程梳理在本文。如果你不满足就会写个CURD,业务代码只会new来new去,代码…

软件工程评级B-,有大量调剂名额。北京联合大学考情分析

北京联合大学(B-) 考研难度(☆) 内容:23考情概况(拟录取和复试分析)、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1239字,预计阅读:3分钟 2023考情概况 北京…

从零开始-与大语言模型对话学技术-gradio篇(4)

前言 本文介绍「星火杯」认知大模型场景创新赛中的落选项目- AI命理分析系统,属于个人娱乐练手。总结提炼了往期文章精华并发掘出新的知识。 包括本地部署版本和Web在线版本,两种打包方式基于 半自动化使用.bat手动打包迁移python项目 如何把 Gradio …

Java——》synchronized互斥性

推荐链接: 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

你应该知道的几个国产化平台-行云管家

近年来我国国产化加速发展,国产化平台也越来越多。但还有很多小伙伴不知道有哪些,这里就给大家汇总几个,大家应该知道的国产化平台。 你应该知道的几个国产化平台 1、cpu:龙芯、飞腾、鲲鹏、兆芯、海光、申威 2、浏览器&#xf…

Vercel的下一件大事:AI SDK和开发人员加速器

Vercel CEO Guillermo Rauch说,构建AI应用程序是开发人员注册Vercel的第二大原因。Ergo:Vercel AI SDK和加速器。 在 2020 年代,很少有公司比流行的 React 框架 Next.js 的管理者 Vercel 对前端开发人员生态系统产生更大的影响。当我在 2020…

骨传导耳机怎么听到声音?骨传导耳机是否会对听力造成损害?

其实骨传导耳机让我们听到的的传声原理很简单,而且骨传导现象很常见,简单的来说,就是像我们平时吃薯片或者挠头发,无论声音再小,自己也能听见,这就是骨传导的现象,也是为啥骨传导耳机不需要入耳…

GitHubGiteeGitlab极狐(JihuLab)同时生成并配置SSH公私钥详细过程

GitHub-微软-github.com Gitee-开源中国- gitee.com Gitlab-乌克兰GitLab 公司-gitlab.com 极狐(JihuLab)-中国代理商运营的Gitlab -gitlab.cn或者jihulab.com 使用SSH公钥可以让你在你的电脑和GitHub等平台通讯的时候使用更安全的连接(Git的Remote要使用SSH地址&a…

计算机竞赛 大数据疫情分析及可视化系统

文章目录 0 前言2 开发简介3 数据集4 实现技术4.1 系统架构4.2 开发环境4.3 疫情地图4.3.1 填充图(Choropleth maps)4.3.2 气泡图 4.4 全国疫情实时追踪4.6 其他页面 5 关键代码最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 大数据疫…

vue应用全局音乐(自动播放)

这里写自定义目录标题 1.从同事哪里白嫖过来的&#xff0c;主要是jq写的&#xff0c;需要单独引入jq cdn 2.打开index.html 将代码放到里面 <!DOCTYPE html> <html><head><meta charset"utf-8" /><metaname"viewport"content…

软件设计——面向对象的七大原则

前言 软件设计模式和设计原则是成为一个软件架构师的基本功&#xff0c;较好的理解这些基础知识无疑是十分重要的。在这篇文章中荔枝将会比较详细梳理一下面向对象的七大原则&#xff0c;大家可以先看看这部分内容再去学习设计模式会比较好哈哈哈哈~~~ 在软件开发中&#xff0c…

Linux RPM JDK升级

以JDK1.8升级JDK17为例 上传jdk17安装包到linux服务器 检查jdk版本 rpm -qa|grep jdk 删除查询到的jdk rpm -e --nodeps jdk1.8-1.8.0_201-fcs.x86_64 删除完毕后安装新的jdk rpm -ivh jdk-17_linux-x64_bin.rpm 检查jdk版本 java -version

深入探讨基于python的SGBM参数影响效果

什么是SGBM SGBM&#xff08;Semi-Global Block Matching&#xff09;是一种用于计算双目视觉中视差&#xff08;disparity&#xff09;的半全局匹配算法&#xff0c;在OpenCV中的实现为semi-global block matching&#xff08;SGBM&#xff09;。它是基于全局匹配算法和局部匹…