使用 PyTorch 的高效大型自组织映射

原文:towardsdatascience.com/efficient-large-dimensional-self-organising-maps-with-pytorch-8f5c2b4c66e2

自组织映射(或 Kohonen 映射)是一种有趣的神经网络类型:它们不遵循相同的架构,并且肯定与通常的反向传播方法不同地训练。这有一个很好的原因:它们旨在用于无监督学习。它们对于常规的多层神经网络来说,就像 K-Means 对于 SVM 一样。它们创建聚类;它们对数据空间进行离散化。但它们有一个使它们与其他聚类方法不同的特点:它们创建的聚类形成了一个数据映射(一个聚类网格),在该映射中,聚类之间的距离代表了数据空间中这些聚类的平均成员之间的距离。

由于它们略微不同寻常,因此在创建自组织映射(SOMs)的高效实现方面所做的努力并没有像其他形式的神经网络那样多,特别是在使它们能够处理 GPU 上的高维数据方面(即,它们通常用于具有不超过几十个特征的 数据)。真遗憾,因为这正是我所需要的项目:在具有数千个特征的数据上进行快速 SOM 训练。我已经尝试了现有的库,包括基于 PyTorch 的库,但并不完全满意,所以我制作了自己的:ksom(诚然,这也很有趣,尤其是作为一种提高使用 PyTorch 能力的方式)。

为了说明它是如何工作的,让我们考虑一个简单的例子(这远非高维,但很容易理解):通过颜色对图像像素进行聚类(已在前一篇文章中用来说明 K-Means 算法)。

让我们从结尾开始!下面是一张用作示例的图片(我的狗 Chica),以及该图像中像素颜色的 6×6 映射。您可以在 ksom 的 GitHub 仓库中找到代码来训练这个映射。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/d5abbe082b36f8f1b26f659693619d71.png

Chica 的照片,以及从该照片包含的像素中训练出的颜色 SOM(图像由作者提供)。

地图的训练基本上包括依次展示所有数据点(图像的像素),可能需要多次迭代(在这里,我们只使用一个 epoch,因为图像中有足够的像素以获得良好的结果)。在开始之前,地图被初始化(随机、用零或从数据集随机选择的数据点)。在我们的例子中,它是一个 6x6x3 的张量,代表正方形地图(我们也可以有矩形地图,一些库允许其他形状,甚至 3D 地图),每个单元(细胞、簇)由与数据点相同维度的向量表示(因此在这里,像素颜色的红色、绿色和蓝色分量)。

在训练过程中,对于每个数据点,地图首先根据给定的距离度量(BMU,最佳匹配单元)识别最接近数据点的单元。然后更新该单元以更接近数据点,并且根据给定的邻域函数(高斯、线性等)在给定半径内(随着训练的进行而减小),对邻域中的其他单元也进行更新,程度较小。

因此,在我们的例子中,将数据加载到张量x后,初始化和训练 SOM 的代码如下:

from ksom import SOM, cosine_distance, nb_gaussian
...
smodel = SOM(6, 6, 3, # size of the map and dimension of units
             sample_init=samples, # initialised with samples
             dist=cosine_distance, # using cosine distance for BMU
             alpha_init=0.01, # learning rate
             alpha_drate=1e-7, # decay of learning rate
             neighborhood_fct=nb_gaussian, # neighboorhood function
             neighborhood_init=som_size, # initial neighbourhood radius
             neighborhood_drate=0.0001) # decay of neighbourhood radius

perm = torch.randperm(x.size(0)) # to shuffle the data
for i in range(int(x.size()[0]/1000)):
    idx = perm[i*1000:(i+1)*1000] 
    time1 = time.time()
    dist,count = smodel.add(x[idx]) # feed the SOM a batch of 1000 pixels
    print(f"{(i+1):06d}K - {dist:.4f} - {(time.time()-time1)*1000:05.2f}ms")

数据点以批处理形式提供(尽管它们随后被独立处理)。随着训练的进行,每个单元的向量(其权重)接近于它是 BMU 的所有数据点的平均值,具有相似向量的单元倾向于在地图上彼此靠近。这种效果的好坏当然取决于所有参数:邻域函数、地图大小、邻域半径、距离度量、学习率等,所有这些参数相互依赖。换句话说,要使其工作良好,需要进行一些试错。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/2acae165e7f83b955ca36d52dbd71a49.png

像素/颜色 SOM 在训练过程中的演变(图片由作者提供)。

这里有一个例子,使用一个主要由二进制属性描述的奶酪数据集,使用以下 SOM 初始化并在 7 个 epoch 上对其进行训练(参见完整代码):

smodel = ksom.SOM(6, 6, len(df.T), 
                  zero_init=True,
                  dist=ksom.cosine_distance)

for epoch in range(7):
    for b in range(math.ceil(len(df)/BATCHSIZE)):
        dist,count = smodel.add(torch.Tensor(df.iloc[b*BATCHSIZE:(b+1)*BATCHSIZE].to_numpy()))
        print(f"{epoch+1:02d}.{b:02d}: distance {dist:.4f} out of {count} objects")
        freqmap = torch.zeros(SOMSIZE*SOMSIZE)
        bmu,dists = smodel(torch.Tensor(df.to_numpy()))
        for i in bmu: freqmap[i[0]*SOMSIZE+i[1]] += 1

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/49d33a8052c50c6d5196699a286aa513.png

干酪 SOM 的演变。在左边,用颜色表示的单元权重(将 PCA 应用于 3 个维度,并将这些成分解释为颜色的红、绿和蓝值)。在右边,单元种群地图(对于每个单元是 BMU 的干酪数量)和每个单元的最显著属性(图片由作者提供)。

现在一切都很好,但我最初说的是我想找一种能够很好地扩展到高维数据的工具。这里是一个在随机数据上训练 10×10 地图的比较(见代码),使用了几个其他库,一些在 CPU 上工作(在 i5–1335U 上运行)和一些在 GPU 上工作(在 RTX A6000 上运行)。简而言之,在低维度下,ksom 有更好的替代品,但随着数据点/权重向量的规模增加,CPU 上的 ksom 变得显著更快,而 GPU 上的 ksom 则保持非常快(需要更大的地图和更多的维度才能看到其速度上升)。

https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/01435be1289f51b5073becc825f868bb.png

使用 ksom、quicksom、minisom 或 sklearn_som 在不同维度上训练 10×10 SOM 的训练时间比较(图片由作者提供)。

当然,ksom 仍然是一个小项目。并不是所有内容都经过测试,而且可能还有很多在我自己使用它时还没有出现的 bug(如果你发现一些,请告诉我),但作为一种在 Python 中创建大型自组织地图的方法,它似乎正在发挥作用。

内容概要:本文介绍了一个基于Matlab的综合能源系统优化调度仿真资源,重点实现了含光热电站、有机朗肯循环(ORC)和电含光热电站、有机有机朗肯循环、P2G的综合能源优化调度(Matlab代码实现)转气(P2G)技术的冷、热、电多能互补系统的优化调度模型。该模型充分考虑多种能源形式的协同转换与利用,通过Matlab代码构建系统架构、设定约束条件并求解优化目标,旨在提升综合能源系统的运行效率与经济性,同时兼顾灵活性供需不确定性下的储能优化配置问题。文中还提到了相关仿真技术支持,如YALMIP工具包的应用,适用于复杂能源系统的建模与求解。; 适合人群:具备一定Matlab编程基础和能源系统背景知识的科研人员、研究生及工程技术人员,尤其适合从事综合能源系统、可再生能源利用、电力系统优化等方向的研究者。; 使用场景及目标:①研究含光热、ORC和P2G的多能系统协调调度机制;②开展考虑不确定性的储能优化配置与经济调度仿真;③学习Matlab在能源系统优化中的建模与求解方法,复现高水平论文(如EI期刊)中的算法案例。; 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码和案例文件,按照目录顺序逐步学习,重点关注模型构建逻辑、约束设置与求解器调用方式,并通过修改参数进行仿真实验,加深对综合能源系统优化调度的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值