当前位置: 首页 > article >正文

关联传播和 Python 和 Scikit-learn 实现

文章目录

  • 一、说明
  • 二、什么是 Affinity Propagation。
    • 2.1 先说Affinity 传播的工作原理
    • 2.2 更多细节
    • 2.3 传播两种类型的消息
    • 2.4 计算责任和可用性的分数
      • 2.4.1 责任
      • 2.4.2 可用性分解
      • 2.4.3 更新分数:集群是如何形成的
      • 2.4.4 估计集群本身的数量。
  • 三、亲和力传播的一些应用
  • 四、总结

关键词:
Affinity Propagation

一、说明

假设您有一个数据集,其中各个样本之间存在关系,您的目标是识别数据集中的相关样本组。聚类是无监督机器学习算法的一部分,可能是要走的路。但是,当您并不真正知道聚类的数量时,应该应用哪种聚类算法呢?

进入 Affinity Propagation,这是一种八卦风格的算法,它通过传递有关单个样本的受欢迎程度的信息来推断集群的数量,例如他们是否属于某个群体,甚至他们是否是一个群体的领导者。此算法可以估计数据集本身中的集群/组数量,是今天博客文章的主题。

首先,我们将从理论上了解 Affinity Propagation。它是什么 — 群体形成类比是如何运作的?它如何更详细地工作,即数学上?发送了哪些类型的消息,这些受欢迎程度指标是如何确定的?算法是如何收敛的?我们先来看这些问题。

接下来,我们提供使用 Scikit-learn 和 Python 的 Affinity Propagation 示例实现。我们一步一步地解释我们的模型代码,以便您可以逐个了解发生了什么。对于那些已经有一些经验并希望立即玩的人,也可以使用完整的模型代码。因此,今天的博客文章既是理论上的,也是实践的——我最喜欢的博客类型!

在本教程中,您将学习:如何使用 Scikit-learn 执行 Affinity Propagation 聚类。

二、什么是 Affinity Propagation。

2.1 先说Affinity 传播的工作原理

你还记得高中时,那里的学生团体聚集在一起——只有当某个团体的领导认为你很酷时,你才能成为该团体的成员吗?

虽然这个类比可能有点牵强,但我认为这就是用通俗易懂的英语解释聚类的 Affinity Propagation 的方式。对于一组数据点,开始一个 “组形成 ”过程,其中每个样本都与其他样本竞争以获得组成员资格。具有最多组大写的,组长被称为 exemplars (Scikit-learn, n.d.)。

这种机器学习技术的有趣之处在于,与 K-means 聚类 (Scikit-learn, n.d.) 不同,您不必提前配置集群的数量。主要缺点是复杂性:就所需的计算资源而言,它不是最便宜的机器学习算法之一 (Scikit-learn, n.d.)。因此,它是一种仅适用于 “中小型数据集” 的技术 (Scikit-learn, n.d.)。

2.2 更多细节

现在我们已经大致了解了 Affinity Propagation,是时候更详细地了解一下了。我们将看看几件事:

算法在高层次上是如何工作的;
传播的消息类型;
如何计算这些消息中的分数。
每次迭代后消息分数如何更新,从而如何形成真正的集群。
首先,与任何聚类分析算法一样,Affinity Propagation 是迭代的。这意味着它将完成多次迭代,直到完成。与 K-means 聚类相反,收敛性由某个阈值确定,而使用 Affinity Propagation (关联传播) 时,您可以配置要完成的迭代次数。之后,该算法假设收敛并将返回结果集群 (Scikit-learn, n.d.)。

2.3 传播两种类型的消息

在每次迭代期间,每个样本都会向其他样本广播两种类型的消息 (Scikit-learn, n.d.)。第一个称为责任 r(i,k) — 这是“样本 k 应该是样本 i 的示例的证据”(Scikit-learn, n.d.)。我一直记得是这样的:期望 k 的团队领导越大,对团队的责任就越大。这就是你如何知道,从 i 的角度来看,责任总是告诉你一些关于 k 对团队的重要性。

发送的另一种类型的消息是可用性。这与责任相反:i 应该选择 k 作为示例的确定性如何,即加入特定组的可用性如何 (Scikit-learn, n.d.)。在高中的情况下,假设你想加入一个半酷的小组(一些空闲),而你更愿意加入真正酷的小组。对于真正酷的那个,你的可用性要高得多。该责任告诉你需要接受谁才能加入小组,即最有可能的小组负责人或榜样。

2.4 计算责任和可用性的分数

现在让我们更仔细地了解一下责任和可用性的概念。现在我们知道了它们在高层次上代表什么,是时候详细研究它们了 — 这意味着从数学上。

2.4.1 责任

这是责任的公式 (Scikit-learn, n.d.):
在这里插入图片描述

现在让我们把这个公式分解成简单的英语。我们从左边开始。这里,r(i,k) 再次负责样本 k 是样本 i 的范例。但是什么决定了它呢?两个分量:
s(i, k) 和 max[ a(i, k’) + s(i, k’)∀ k’≠ k]。

首先是样本 i 和 k 之间的相似性。如果它们高度相似,则 k 应该是 i 的示例的几率非常高。然而,这并不是全部,因为我们不能只看相似性——因为其他样本也会试图说服它们是更适合 i 的示例。因此,相似性是相对的,这就是为什么我们需要减去那个大的 max 值。它看起来很复杂,但简单地归结为“所有其他样本 k’ 的最大可用性和相似性,其中 k’ 永远不会是 k”。我们简单地减去 k 的“最大竞争对手”的相似性和意愿,以作为示例来显示它的相对强度。

2.4.2 可用性分解

责任看起来很复杂,但实际上相对容易。可用性的公式也是如此 (Scikit-learn, n.d.):
在这里插入图片描述
在这里插入图片描述

正如我们所看到的,可用性被确定为介于 0 和 k 到 k 的责任(即它认为自己是示例或组长的重要性)和所有其他样本 i’ 到 k 的责任之和,其中 i’ 既不是 i 也不是 k。因此,就组形成而言,如果样本本身认为它非常重要,那么它就会更容易被潜在的样本所利用。

2.4.3 更新分数:集群是如何形成的

现在我们已经了解了责任和可用性的公式,让我们看看每次迭代后分数是如何更新的 (Scikit-learn, n.d.):
在这里插入图片描述
在这里插入图片描述

很简单:每次更新,我们取旧值的 λ 并将其与新值的 (1-λ) 合并。这个 lambda,也称为“阻尼值”,是确保平滑过渡的平滑因子;它避免了优化过程中的大振荡。

总而言之,Affinity Propagation 是一种算法,它:

2.4.4 估计集群本身的数量。

考虑到计算成本,对于中小型数据集非常有用。
通过四处“八卦”来工作,就好像它试图组建高中学生团体一样。
通过对单个样本随时间变化的 “吸引力” 进行小而平滑的更新,即在每次迭代之后。
确定样本的吸引力,回答问题“这可以是我想属于的小组的领导者吗”和样本本身(“有什么证据证明我是小组领导者?
现在让我们看看如何使用 Python 和 Scikit-learn 实现它!😃

使用 Python 和 Scikit-learn 实现 Affinity Propagation
我们又来了,我们在博客abou t K-means 聚类中看到的聚类,尽管我们今天的样本较少:
在这里插入图片描述

图片由作者提供
还记得我们是如何生成它们的吗?打开一个 Python 文件并将其命名为 ‘affinity.py’,添加导入(即 Scikit-learn、Numpy 和 Matplotlib)。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.cluster import AffinityPropagation

然后,我们添加一些配置选项:我们生成的样本总数、集群的中心以及我们将为其生成样本的类的数量。这些都将在 中使用,它会生成集群并分别将它们分配给 X 和 targets。make_blobs

我们使用 Numpy 保存它们,然后加载它们并再次将它们分配给 X。这两行代码对于您的模型运行不是必需的,但如果您想跨设置进行比较,您可能不希望每次都随机生成样本。通过保存一次,然后注释掉 和 ,您将一次又一次地从文件中加载它们:)savemake_blobs

# Configuration options
num_samples_total = 50
cluster_centers = [(20,20), (4,4)]
num_classes = len(cluster_centers)# Generate data
X, targets = make_blobs(n_samples = num_samples_total, centers = cluster_centers, n_features = num_classes, center_box=(0, 1), cluster_std = 1)np.save('./clusters.npy', X)
X = np.load('./clusters.npy')

然后,我们在加载数据后将数据拟合到 Affinity Propagation 算法中,这只需要两行代码。在另外两行中,我们得出了示例等特征,因此得出了聚类的数量:

# Fit AFfinity Propagation with Scikit
afprop = AffinityPropagation(max_iter=250)
afprop.fit(X)
cluster_centers_indices = afprop.cluster_centers_indices_
n_clusters_ = len(cluster_centers_indices)

最后,通过使用我们拟合的算法,我们预测所有样本属于哪个集群:

# Predict the cluster for all the samples
P = afprop.predict(X)

最后可视化结果:

# Generate scatter plot for training data
colors = list(map(lambda x: '#3b4cc0' if x == 1 else '#b40426', P))
plt.scatter(X[:,0], X[:,1], c=colors, marker="o", picker=True)
plt.title(f'Estimated number of clusters = {n_clusters_}')
plt.xlabel('Temperature yesterday')
plt.ylabel('Temperature today')
plt.show()

在这里的结果
在这里插入图片描述

完整型号代码
如果您希望立即获得完整的模型代码,以便您可以立即开始使用 — 开始吧!它也在我的 Github 存储库中可用。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_blobs
from sklearn.cluster import AffinityPropagation# Configuration options
num_samples_total = 50
cluster_centers = [(20,20), (4,4)]
num_classes = len(cluster_centers)# Generate data
X, targets = make_blobs(n_samples = num_samples_total, centers = cluster_centers, n_features = num_classes, center_box=(0, 1), cluster_std = 1)np.save('./clusters.npy', X)
X = np.load('./clusters.npy')# Fit AFfinity Propagation with Scikit
afprop = AffinityPropagation(max_iter=250)
afprop.fit(X)
cluster_centers_indices = afprop.cluster_centers_indices_
n_clusters_ = len(cluster_centers_indices)# Predict the cluster for all the samples
P = afprop.predict(X)# Generate scatter plot for training data
colors = list(map(lambda x: '#3b4cc0' if x == 1 else '#b40426', P))
plt.scatter(X[:,0], X[:,1], c=colors, marker="o", picker=True)
plt.title(f'Estimated number of clusters = {n_clusters_}')
plt.xlabel('Temperature yesterday')
plt.ylabel('Temperature today')
plt.show()Summary

三、亲和力传播的一些应用

Affinity Propagation 是一种强大的聚类算法,已在各个领域得到应用。它能够自动确定集群数量,使其在集群数量未知或难以确定的情况下特别有用。以下是 Affinity Propagation (AP) 算法的一些关键应用:

图像和视频分析:Affinity Propagation 已成功应用于图像和视频分析任务,例如对象识别、图像分割和视频摘要。通过将图像或视频中的相似区域或对象聚集起来,它可以帮助识别和分类不同的对象或场景。
自然语言处理:Affinity Propagation 已用于自然语言处理任务,例如文档聚类、主题建模和情感分析。它可以根据内容将类似的文档分组在一起,从而更轻松地组织和分析大型文本数据集。
生物信息学:AP 算法已应用于生物信息学中,用于基因表达分析、蛋白质结构预测和蛋白质相互作用网络聚类等任务。它可以帮助识别生物数据中的模式和关系,从而在基因组学和蛋白质组学领域获得见解和发现。
社交网络分析:Affinity Propagation 已用于社交网络分析,以识别网络中的社区或组。通过根据个人的社交关系或互动对个人进行聚类,它可以帮助理解社交网络的结构和动态。
市场划分:Affinity Propagation (AP) 已用于市场细分研究,根据客户的偏好、行为或人口统计数据对客户进行分组。这可以帮助企业针对特定的客户群并相应地定制他们的营销策略。

四、总结

在此博客文章中,我们了解了 Affinity Propagation 算法。这种聚类算法允许机器学习工程师通过 “消息传递” 来聚类他们的数据集。类似于高中时的小组组建方式,小组领导决定谁进入,谁必须选择另一个,拉动游戏也由算法玩。

通过查看传播的消息、与这些消息一起发送的责任和可用性指标,以及它们如何迭代收敛,我们首先了解了 Affinity Propagation 算法的理论部分。接下来是一个使用 Python 和 Scikit-learn 的实际示例,我们在其中逐步解释了如何实现 Affinity Propagation。对于那些感兴趣的人,上面也可以找到整个模型。

相关文章:

关联传播和 Python 和 Scikit-learn 实现

文章目录 一、说明二、什么是 Affinity Propagation。2.1 先说Affinity 传播的工作原理2.2 更多细节2.3 传播两种类型的消息2.4 计算责任和可用性的分数2.4.1 责任2.4.2 可用性分解2.4.3 更新分数:集群是如何形成的2.4.4 估计集群本身的数量。 三、亲和力传播的一些…...

CMAKE工程编译好后自动把可执行文件传输到远程开发板

# 设置 CMake 最低版本要求 cmake_minimum_required(VERSION 3.10)# 设置项目名称 project(MyProject)# 添加可执行文件,这里以项目名作为可执行文件的名称 add_executable(${PROJECT_NAME} main.cpp)# 设置开发板信息 set(DEVELOPMENT_BOARD_IP "192.168.1.10…...

【etcd】二进制安装etcd

由于生产服务器不能使用yum 安装 etcd ,或者 安装的etcd 版本比较老,这里介绍一个使用二进制安装的方式。 根据安装文档编写一个下载脚本即可 : 指定 etcd 的版本 提供了两个下载地址 一个 Google 一个 Github, 不过都需要外网 注释掉删除保…...

企业知识管理平台助力企业创新与竞争力提升的有效策略探讨

内容概要 在当今快速发展的商业环境中,企业知识管理平台的构建显得至关重要。它不仅为企业的知识资源提供了一个整合与分享的空间,还为企业的创新与竞争力提升提供了策略支持。本文将深入探讨企业知识管理平台的关键要素,包括知识获取、存储…...

Java多线程——线程安全性

线程安全性 当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的 public class A {public void test(){//....} }无状态对象是线程安全的,其不包含任何域,也不包含任何对其他类中域的引用&#…...

Windows安装Miniconda和PySide6以及配置PyCharm

目录 1. 选择Miniconda 2. 下载Miniconda 3. 安装Miniconda 4. 在base环境下创建pyside6环境 5. 安装pyside6环境 6. 配置PyCharm环境 7. 运行第一个程序效果 1. 选择Miniconda 选择Miniconda而没有选择Anaconda,是因为它是一个更小的Anaconda发行版&#x…...

C++传送锚点的内存寻址:内存管理

文章目录 1.C/C内存分布回顾2.C内存管理2.1 内存申请2.2 operator new与operator delete函数2.3 定位new表达式 3.关于内存管理的常见知识点3.1 malloc/free和new/delete的区别3.2 内存泄漏 希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 继C语…...

两种交换排序算法--冒泡,快速

目录 1.冒泡排序原理 2.快速排序原理 3.冒泡代码实现 4.快速排序代码实现 1.冒泡排序原理 冒泡排序(Bubble Sort)是一种简单的排序算法,基本思想是通过反复交换相邻的元素,直到整个序列有序。它的名字来源于较大的元素像气泡…...

循序渐进kubernetes-RBAC(Role-Based Access Control)

文章目录 概要Kubernetes API了解 Kubernetes 中的 RBACRoles and Role Bindings:ClusterRoles and ClusterRoleBindings检查访问权限:外部用户结论 概要 Kubernetes 是容器化应用的强大引擎,但仅仅关注部署和扩展远远不够,集群的安全同样至…...

《从因果关系的角度学习失真不变表示以用于图像恢复》学习笔记

paper:2303.06859 GitHub:lixinustc/Causal-IR-DIL: Distortion invariant feature learning for image restoration from a causality perspective 2023 CVPR 目录 摘要 1、介绍 1.1 图像修复任务 1.2 失真不变表示学习 1.3 因果效应估计的挑战…...

亚博microros小车-原生ubuntu支持系列:16 机器人状态估计

本来想测试下gmapping建图,但是底层依赖了yahboomcar_bringup做底层的数据处理,所以先把依赖的工程导入。 程序启动后,会订阅imu和odom数据,过滤掉一部分的imu数据后,然后与odom数据进行融合,最后输出一个…...

Greenplum临时表未清除导致库龄过高处理

1.问题 Greenplum集群segment后台日志报错 2.回收库龄 master上执行 vacuumdb -F -d cxy vacuumdb -F -d template1 vacuumdb -F -d rptdb 3.回收完成后检查 仍然发现segment还是有库龄报警警告信息发出 4.检查 4.1 在master上检查库年龄 SELECT datname, datfrozen…...

【Unity3D】实现横版2D游戏角色二段跳、蹬墙跳、扶墙下滑

目录 一、二段跳、蹬墙跳 二、扶墙下滑 一、二段跳、蹬墙跳 GitHub - prime31/CharacterController2D 下载工程后直接打开demo场景:DemoScene(Unity 2019.4.0f1项目环境) Player物体上的CharacterController2D,Mask添加Wall层…...

mybatis(134/134)完结

一级缓存(默认情况下开启)同一个sqlsession中执行相同的查询语句走一级缓存 二级缓存 :同一个sqlsessionfactory,sqlsession关闭了才会将一级缓存提交到二级缓存中 外部编写的缓存 PageHelper插件:方便进行分页&#x…...

PaddleSeg 从配置文件和模型 URL 自动化运行预测任务

git clone https://github.com/PaddlePaddle/PaddleSeg.git# 在ipynb里面运行 cd PaddleSegimport sys sys.path.append(/home/aistudio/work/PaddleSeg)import os# 配置文件夹路径 folder_path "/home/aistudio/work/PaddleSeg/configs"# 遍历文件夹,寻…...

人工智能丨视觉识别在自动化测试中的应用

视觉识别:自动化测试的新纪元 在当今快速发展的科技时代,软件测试正面对着日益复杂的挑战。作为其中一个关键领域,自动化测试不断寻求创新的方法,以提高测试效率和准确性。在这一背景下,视觉识别技术的引入为自动化测…...

lambda 表达式:Python中的极简艺术

lambda 表达式:Python中的极简艺术 — 让你的代码更简洁、更高效! 引言 在 Python 中,lambda 表达式是一种简洁的定义匿名函数的方式。它通常用于需要函数对象的场景,但又不需要显式定义一个完整函数的场合。本文将详细介绍 la…...

BLE透传方案,IoT短距无线通信的“中坚力量”

在物联网(IoT)短距无线通信生态系统中,低功耗蓝牙(BLE)数据透传是一种无需任何网络或基础设施即可完成双向通信的技术。其主要通过简单操作串口的方式进行无线数据传输,最高能满足2Mbps的数据传输速率&…...

无用知识研究:对std::common_type以及问号表达式类型的理解

先说结论:如果问号表达式能编译通过,那么std::common_type就能通过。因为common_type的底层依赖的就是?: common_type的实现里,利用了问号表达式:ternary conditional operator (?:) https://stackoverflow.com/questions/1432…...

苍穹外卖—订单模块

该模块分为地址表的增删改查、用户下单、订单支付三个部分。 第一部分地址表的增删改查无非就是对于单表的增删改查,较基础,因此直接导入代码。 地址表 一个用户可以有多个地址,同时有一个地址为默认地址。用户还可为地址添加例如&q…...

「 机器人 」扑翼飞行器的数据驱动建模核心方法

前言 数据驱动建模可充分利用扑翼飞行器的已有运行数据,改进动力学模型与控制策略,并对未建模动态做出更精确的预测。在复杂的非线性飞行环境中,该方法能有效弥补传统解析建模的不足,具有较高的研究与应用价值。以下针对主要研究方向和实现步骤进行整理与阐述。 1. 数据驱动…...

openeuler 22.03 lts sp4 使用 cri-o 和 静态 pod 的方式部署 k8s-v1.32.0 高可用集群

前情提要 整篇文章会非常的长…可以选择性阅读,另外,这篇文章是自己学习使用的,用于生产,还请三思和斟酌 静态 pod 的部署方式和二进制部署的方式是差不多的,区别在于 master 组件的管理方式是 kubectl 还是 systemctl有 kubeadm 工具,为什么还要用静态 pod 的方式部署?…...

Helm Chart 实战指南

Helm 是 Kubernetes 的包管理工具,而 Helm Chart 是 Helm 的核心概念,用于定义、安装和升级 Kubernetes 应用。本文将带你从零开始,通过实战演练,掌握 Helm Chart 的创建、配置和部署,帮助你高效管理 Kubernetes 应用。 1. 环境准备 在开始之前,确保你已经具备以下环境:…...

【数据结构】_顺序表经典算法OJ(力扣版)

目录 1. 移除元素 1.1 题目描述及链接 1.2 解题思路 1.3 程序 2. 合并两个有序数组 1.1 原题链接及题目描述 1.2 解题思路 1.3 程序 1. 移除元素 1.1 题目描述及链接 原题链接:27. 移除元素 - 力扣(LeetCode) 题目描述&#xff1a…...

目前市场主流的AI PC对于大模型本地部署的支持情况分析-Deepseek

以下是目前市场主流AI PC对**大模型本地部署支持情况**的综合分析,结合硬件能力、软件生态及厂商动态进行总结: --- ### **一、硬件配置与算力支持** 1. **核心处理器架构** - **异构计算方案(CPUGPUNPU)**:主流…...

Vue3 v-bind 和 v-model 对比

1. 基本概念 1.1 v-bind 单向数据绑定从父组件向子组件传递数据简写形式为 : 1.2 v-model 双向数据绑定父子组件数据同步本质是 v-bind 和 v-on 的语法糖 2. 基础用法对比 2.1 表单元素绑定 <!-- v-bind 示例 --> <template><input :value"text&quo…...

MySQL分表自动化创建的实现方案(存储过程、事件调度器)

《MySQL 新年度自动分表创建项目方案》 一、项目目的 在数据库应用场景中&#xff0c;随着数据量的不断增长&#xff0c;单表存储数据可能会面临性能瓶颈&#xff0c;例如查询、插入、更新等操作的效率会逐渐降低。分表是一种有效的优化策略&#xff0c;它将数据分散存储在多…...

接口技术-第6次作业

目录 作业内容 解答 1.假设在一个系统中&#xff0c;8255A的端口地址为184H-187H&#xff0c;A口工作于方式1输出&#xff0c;B口工作于方式1输入&#xff0c;禁止中断&#xff0c;C口剩余的两根线PC5&#xff0c;PC4位输入&#xff0c;如下图所示&#xff0c;试编写初始化…...

计算机网络之计算机网络体系结构

一、定义与概述 计算机网络体系结构是计算机网络及其部件所应该完成功能的精确定义&#xff0c;这些功能由何种硬件或软件完成是遵循这种体系结构的。体系结构是抽象的&#xff0c;实现是具体的&#xff0c;是运行在计算机软件和硬件之上的。 二、主流模型 目前&#xff0c;…...

(1)Linux高级命令简介

Linux高级命令简介 在安装好linux环境以后第一件事情就是去学习一些linux的基本指令&#xff0c;我在这里用的是CentOS7作演示。 首先在VirtualBox上装好Linux以后&#xff0c;启动我们的linux&#xff0c;输入账号密码以后学习第一个指令 简介 Linux高级命令简介ip addrtou…...