学习日记_20241126_聚类方法(自组织映射Self-Organizing Maps, SOM)

news2025/1/16 2:40:03

前言

提醒:
文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。
其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展及意见建议,欢迎评论区讨论交流。

文章目录

  • 前言
  • 聚类算法
    • 经典应用场景
    • 自组织映射(Self-Organizing Maps, SOM)
      • 优点:
      • 缺点:
      • 简单实例(函数库实现)
      • 数学表达
    • 。。。。。。。


聚类算法

聚类算法在各种领域中有广泛的应用,主要用于发现数据中的自然分组和模式。以下是一些常见的应用场景以及每种算法的优缺点:

经典应用场景

  1. 市场细分:根据消费者的行为和特征,将他们分成不同的群体,以便进行有针对性的营销。

  2. 图像分割: 将图像划分为多个区域或对象,以便进行进一步的分析或处理。

  3. 社交网络分析:识别社交网络中的社区结构。

  4. 文档分类:自动将文档分组到不同的主题或类别中。

  5. 异常检测识别数据中的异常点或异常行为。

  6. 基因表达分析:在生物信息学中,根据基因表达模式对基因进行聚类。

自组织映射(Self-Organizing Maps, SOM)

Self-Organizing Maps (SOM),也称为自组织映射或Kohonen网络,是一种无监督的机器学习方法,主要用于降维和聚类。以下是SOM聚类方法的优缺点:

优点:

  1. 降维:SOM能够将高维数据映射到低维空间(通常是二维),同时保持数据的拓扑结构,这使得数据可视化变得更加容易。
  2. 拓扑保持:SOM在映射过程中努力保持原始数据中相似性关系的拓扑结构,即相似的输入向量在映射后仍然接近。
  3. 无监督学习:SOM不需要预先标记的数据,可以自动发现数据中的结构和模式。
  4. 可解释性:SOM的输出是一个网格,每个网格节点代表一个聚类中心,这种结构使得聚类结果具有一定的可解释性。
  5. 灵活性:SOM可以适应不同形状和密度的聚类。
  6. 噪声鲁棒性:SOM对噪声数据有一定的鲁棒性,能够在一定程度上忽略小的数据扰动。

缺点:

  1. 参数敏感:SOM的性能对初始参数(如网格大小、学习率、邻域函数等)非常敏感,需要仔细选择和调整。
  2. 计算复杂度:SOM的训练过程可能比较耗时,特别是对于大型数据集和复杂的网格结构。
  3. 缺乏全局优化:SOM的训练过程是局部的,可能导致无法达到全局最优解。
  4. 边界效应:SOM的边界节点可能没有足够的邻居,这可能导致边界区域的映射不够准确。
  5. 难以确定最佳网格大小:选择合适的网格大小是一个挑战,过小可能无法捕捉数据的复杂性,过大则可能导致过度拟合。
  6. 对初始化敏感:SOM的最终结果可能受到初始权重随机化的影响,不同的初始化可能导致不同的聚类结果。
  7. 不适合非凸聚类:SOM在处理非凸形状的聚类时可能表现不佳,因为其本质上是基于距离的聚类方法。
    总的来说,SOM是一种强大的工具,适用于多种数据分析和聚类任务,但也需要仔细考虑其参数设置和适用场景。在实际应用中,可能需要结合其他方法或技术来克服其局限性。

简单实例(函数库实现)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from minisom import MiniSom

# 生成示例数据
n_samples = 500
n_centers = 3
X, _ = make_blobs(n_samples=n_samples, centers=n_centers, cluster_std=0.7, random_state=42)

# 自组织映射的参数
som_size = 7  # SOM的网格大小
som = MiniSom(som_size, som_size, X.shape[1], sigma=1.0, learning_rate=0.9)

# 初始化并训练SOM
som.random_weights_init(X)
som.train_random(X, num_iteration=100)

# 获取SOM的输出
win_map = som.win_map(X)
labels = np.zeros(X.shape[0])

# 将每个数据点分配给最近的SOM节点
for i in range(som_size):
    for j in range(som_size):
        if (i, j) in win_map:
            for x in win_map[(i, j)]:
                # 使用SOM的网格位置来标记
                index = np.argmin(np.linalg.norm(X - x, axis=1))
                labels[index] = (i * som_size + j)
# 可视化结果
plt.figure(figsize=(8, 6))
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', marker='o', edgecolor='k', s=50)
plt.title('Self-Organizing Map Clustering Result')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.grid(True)
plt.show()

代码运行结果:
学习效果不是很好,是很不好,原因以后再说吧
在这里插入图片描述

数学表达

自组织映射(Self-Organizing Maps, SOM)是一种基于神经网络的无监督学习算法,旨在通过无监督的方式对高维数据进行降维和聚类。其核心思想是通过竞争学习使得相似的数据点在低维空间中尽可能靠近。下面我们将结合数学公式详细讲解SOM的工作原理。

  1. 网络结构
    SOM通常由一个二维的神经元网格组成,每个神经元都有一个权重向量 w j ∈ R n \mathbf{w}_j \in \mathbb{R}^n wjRn,与输入数据的维度相同。设网络中有 m × n m \times n m×n 个神经元,权重向量表示为:
    W = { w 1 , w 2 , … , w m × n } \mathbf{W} = \{ \mathbf{w}_1, \mathbf{w}_2, \ldots, \mathbf{w}_{m \times n} \} W={w1,w2,,wm×n}
  2. 输入信号
    给定一个输入样本 x ∈ R n \mathbf{x} \in \mathbb{R}^n xRn,SOM的目标是找到一个最接近的神经元,即最佳匹配单元(Best Matching Unit, BMU),其位置为 b \mathbf{b} b
    b = arg ⁡ min ⁡ j ∥ x − w j ∥ 2 \mathbf{b} = \arg\min_{j} \|\mathbf{x} - \mathbf{w}_j\|^2 b=argjminxwj2
    这里, ∥ ⋅ ∥ \|\cdot\| 表示欧几里得距离。
  3. 更新权重
    一旦确定了BMU,下一步是更新BMU及其邻域神经元的权重,以使它们更接近输入向量 x \mathbf{x} x。权重更新规则如下:
    w j ( t + 1 ) = w j ( t ) + α ( t ) ⋅ h b , j ( t ) ⋅ ( x − w j ( t ) ) \mathbf{w}_j(t + 1) = \mathbf{w}_j(t) + \alpha(t) \cdot h_{b,j}(t) \cdot (\mathbf{x} - \mathbf{w}_j(t)) wj(t+1)=wj(t)+α(t)hb,j(t)(xwj(t))
    其中:
    • t t t 表示当前的训练迭代次数。
    • α ( t ) \alpha(t) α(t) 是学习率,随着时间的推移通常会逐步降低。
    • h b , j ( t ) h_{b,j}(t) hb,j(t) 是邻域函数,表示与BMU相邻的神经元的影响程度,一般定义为:
      h b , j ( t ) = { exp ⁡ ( − d b , j 2 2 σ ( t ) 2 ) if  j  is a neighbor of  b 0 otherwise h_{b,j}(t) = \begin{cases} \exp\left(-\frac{d_{b,j}^2}{2\sigma(t)^2}\right) & \text{if } j \text{ is a neighbor of } b \\ 0 & \text{otherwise} \end{cases} hb,j(t)={exp(2σ(t)2db,j2)0if j is a neighbor of botherwise
      这里 d b , j d_{b,j} db,j 是BMU和神经元 j j j 之间的距离, σ ( t ) \sigma(t) σ(t) 是邻域范围,通常也随着时间衰减。
  4. 学习率和邻域函数
    • 学习率 α ( t ) \alpha(t) α(t):通常定义为:
      α ( t ) = α 0 ⋅ ( 1 − t T ) \alpha(t) = \alpha_0 \cdot \left(1 - \frac{t}{T}\right) α(t)=α0(1Tt)
      其中 α 0 \alpha_0 α0 是初始学习率, T T T 是总训练迭代次数。
    • 邻域范围 σ ( t ) \sigma(t) σ(t):通常定义为:
      σ ( t ) = σ 0 ⋅ ( 1 − t T ) \sigma(t) = \sigma_0 \cdot \left(1 - \frac{t}{T}\right) σ(t)=σ0(1Tt)
      其中 σ 0 \sigma_0 σ0 是初始邻域范围。
  5. 算法步骤
    SOM算法的主要步骤如下:
    1. 初始化权重向量 W \mathbf{W} W
    2. 对于每个输入样本 x \mathbf{x} x:
      • 找到BMU b \mathbf{b} b
      • 更新BMU及其邻域的权重。
    3. 重复步骤2,直到达到设定的训练次数或收敛条件。
  6. 结果与聚类
    训练完成后,SOM将高维数据映射到低维网格上,具有相似特征的数据点会被映射到相邻的神经元。通过分析每个神经元的权重向量,可以识别出数据的聚类结构。

总结
自组织映射(SOM)是一种强大且直观的聚类和可视化方法。通过竞争学习和权重更新机制,SOM能够有效地将高维数据映射到低维空间,同时保持数据的拓扑结构。其数学基础包括欧几里得距离计算、权重更新规则以及邻域函数的设计,是理解SOM算法的关键。

。。。。。。。

学习日记_20241110_聚类方法(K-Means)
学习日记_20241115_聚类方法(层次聚类)
学习日记_20241115_聚类方法(DBSCAN)
学习日记_20241117_聚类方法(高斯混合模型)
学习日记_20241123_聚类方法(高斯混合模型)续
学习日记_20241123_聚类方法(MeanShift)
学习日记_20241126_聚类方法(谱聚类Spectral Clustering)
学习日记_20241126_聚类方法(聚合聚类Agglomerative Clustering)
学习日记_20241126_聚类方法(Affinity Propagation)

九个聚类算法终于搞完了,终于。
我要刷视频放松去了。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

吉客云数据集成技巧:智能实现MySQL物料信息查询

吉客云数据集成技巧:智能实现MySQL物料信息查询 吉客云数据集成到MySQL:物料信息查询案例分享 在企业的数据管理和分析过程中,数据的高效集成与处理至关重要。本文将聚焦于一个具体的系统对接集成案例——吉客云物料信息查询到BI拉伯塔的物料…

Flink cdc同步增量数据timestamp字段相差八小时(分析|解决)不是粘贴复制的!

问题 我使用flink cdc同步mysql到mysql遇到了timestamp字段缺少八小时的问题。很少无语,flink ,cdc,debezium时区都设置了,没有任何效果! 分析 问题出现在mysql binlog身上!!! 因为默认mysql会使用UTC来…

QUICK 调试camera-xml解析

本文主要介绍如何在QUICK QCS6490使能相机模组。QCS6490的相机基于CameraX的框架,只需通过配置XML文件,设置相机模组的相关参数,就可以点亮相机。本文主要介绍Camera Sensor Module XML和Camera Sensor XML配置的解析,这中间需要c…

ArcGIS 软件中路网数据的制作

内容导读 路网数据是进行网络分析的基础,它是建立网络数据集的数据来源。 本文我们以OSM路网数据为例,详细介绍OSM路网数据从下载,到数据处理,添加属性,完成符合网络分析的网络数据集的全部过程。 01 数据获取 比较…

Flink双流Join

在离线 Hive 中,我们经常会使用 Join 进行多表关联。那么在实时中我们应该如何实现两条流的 Join 呢?Flink DataStream API 为我们提供了3个算子来实现双流 join,分别是: join coGroup intervalJoin 下面我们分别详细看一下这…

【Python-Open3D学习笔记】005Mesh相关方法

TriangleMesh相关方法 文章目录 TriangleMesh相关方法1. 查看mesh三角形面信息2. 可视化三角形3. 上采样4. 计算mesh形成的面积和体积 1. 查看mesh三角形面信息 def view_hull_triangles(hull: o3d.geometry.TriangleMesh):"""查看mesh三角形面信息&#xff08…

【LeetCode热题100】优先级队列

这盘博客记录了关于优先级队列的几道题&#xff0c;包括最后一块石头的重量、数据流中的第K大元素、前K个高频单词、数据流的中位数。 class Solution { public:int lastStoneWeight(vector<int>& stones) {priority_queue<int> heap;for(auto s : stones) hea…

node.js基础学习-cheerio模块-简单小爬虫(五)

学习cheerio模块&#xff0c;简单做一个爬取图片网站的图片&#xff0c;并且将这些图片下载到本地指定的文件夹下&#xff0c;很多图片网站都有一些反爬取的机制&#xff0c;找的好几个都会报302错误&#xff0c;所以我找了一个小的图片网站&#xff0c;这个没有反爬取机制&…

技术创新与人才培养并重 软通动力子公司鸿湖万联亮相OpenHarmony人才生态大会

11月27日&#xff0c;由开放原子开源基金会指导&#xff0c;OpenHarmony项目群工作委员会主办的OpenHarmony人才生态大会2024在武汉隆重举办。软通动力子公司鸿湖万联作为OpenHarmony项目群A类捐赠人应邀出席。大会期间&#xff0c;鸿湖万联不仅深度参与了OpenHarmony人才生态年…

FFmpeg 推流给 FreeSWITCH

FFmpeg 推流&#xff0c;貌似不难&#xff0c;网上有很多资料, 接到一个任务&#xff0c;推流给 FreeSWITCH&#xff0c;最开始以为很容易&#xff0c; 实则不然&#xff0c;FreeSWITCH uuid_debug_media <uuid>&#xff0c; 一直没人任何反应 仔细一查&#xff0c;Fr…

彻底理解quadtree四叉树、Octree八叉树 —— 点云的空间划分的标准做法

1.参考文章&#xff1a; &#xff08;1&#xff09;https://www.zhihu.com/question/25111128 这里面的第一个回答&#xff0c;有一幅图&#xff1a; 只要理解的四叉树的构建&#xff0c;对于八叉树的构建原理类比方法完全一样&#xff1a;对于二维平面内的随机分布的这些点&…

【工具变量】上市公司企业数字化转型指数(甄红线版本,战略引领、技术驱动、环境支撑、数字化成果及应用)2011-2022年

一、测算方式&#xff1a;参考《经济研究》甄红线&#xff08;2023&#xff09;老师研究的做法&#xff0c;本文采用 &#xff23;&#xff33;&#xff2d;&#xff21;&#xff32; 数据库中国上市公司数字化转型研究数据库中企业数字化转型指数来衡量企业数字化转型水平。 数…

长短期记忆网络 (LSTM) 简介

文章目录 一、说明二、传统 RNN 的问题三、为什么梯度消失&#xff1f;四、长短期记忆网络简介五、忘记门六、Update Gate (Input Gate)七、Output Gate八、数学上的内存九、从 LSTM 到 Transformer十、总结 一、说明 机器学习取得进步的领域之一是自然语言处理。对于用于机器…

安卓悬浮窗应用外无法穿透事件问题

现象&#xff1a; 应用内悬浮窗如何设置了 WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE在自己应用内事件穿透正常&#xff0c;但到应用外就无法点击。 原因&#xff1a; 解决方法&#xff1a; layoutParams.alpha 0.8f …

linux minio安装

安装minio&#xff08;Centos&#xff09; 1. 查看服务器版本uname -a 2. 到minio官网下载对应的版本 官网地址&#xff1a;minio官网下载 根据上面查看的信息是x86_64系统所以我们下载linu-amd64 3. 上传到服务器 新建minioServer目录 上传至该目录下 赋权 chmod x mi…

JavaScript字符串

这张图片主要介绍了JavaScript中的字符串类型&#xff08;string&#xff09;。 字符串 1. 字符串的定义 在JavaScript中&#xff0c;通过单引号&#xff08;&#xff09;、双引号&#xff08;"&#xff09;或反引号&#xff08;&#xff09;包裹的数据都叫字符串。单引…

Linq中的投影运算 (C#):Select、SelectMany、Zip

投影是指将对象转换为一种新形式的操作&#xff0c;该形式通常只包含那些将随后使用的属性。 通过使用投影&#xff0c;您可以构造从每个对象生成的新类型。 可以投影属性&#xff0c;并对该属性执行数学函数。 还可以在不更改原始对象的情况下投影该对象。 1、Select 下面的…

RabbitMQ在手动消费的模式下设置失败重新投递策略

最近在写RabbitMQ的消费者&#xff0c;因为业务需求&#xff0c;希望失败后重试一定次数&#xff0c;超过之后就不处理了&#xff0c;或者放入死信队列。我这里就达到重试次数后就不处理了。本来以为很简单的&#xff0c;问了kimi&#xff0c;按它的方法配置之后&#xff0c;发…

Maven install java heap space

Maven install java heap space 打包报错 Maven install java heap space 解决&#xff1a; vm option: -Xms1024m -Xmx1024m如果 vm配置了&#xff0c;还是一样报错&#xff0c;就重新选择JRE看看是否正确&#xff0c;idea会默认自己的环境&#xff0c;导致设置vm无效&…

OpenCV_Code_LOG

孔洞填充 void fillHole(const Mat srcBw, Mat &dstBw) {Size m_Size srcBw.size();Mat TempMat::zeros(m_Size.height2,m_Size.width2,srcBw.type());//延展图像srcBw.copyTo(Temp(Range(1, m_Size.height 1), Range(1, m_Size.width 1)));cv::floodFill(Temp, Point(…