自组织映射Python实现

自组织映射(Self-organizing map)Python实现。仅供学习。

#!/usr/bin/env python3

"""
Self-organizing map
"""

from math import exp

import toolz

import numpy as np
import numpy.linalg as LA

from sklearn.base import ClusterMixin
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()


class Node:
    """Node
    
    Attributes:
        location (np.ndarray): location of the node
        weight (np.ndarray): weight of the node, in the data sp.
    
    """
    def __init__(self, weight, location=None):
        self.weight = weight
        self.location = location

    def normalize(self):
        return self.weight / LA.norm(self.weight)

    def output(self, x):
        # similarity between the node and the input `x`
        return LA.norm(x - self.weight)

    def near(self, other, d=0.2):
        # judge the neighborhood of the nodes by locations
        if self.location is not None and other.location is not None:
            return LA.norm(self.location - other.location) < d
        else:
            return 0

    def update(self, x, eta=0.1):
        """update the weight of the node
        w += r (x-w)
        """
        self.weight += eta *(x - self.weight)

    @staticmethod
    def random(n=2):
        weight = np.random.random(n)
        location = np.random.random(2)
        node = Node(weight, location)
        node.normalize()
        return node

    def plot(self, axes, i1=0, i2=1, *args, **kwargs):
        x1, x2 = self.weight[i1], self.weight[i2]
        axes.plot(x1, x2, *args, **kwargs)


class Layer(ClusterMixin):
    """
    Layer of SOM

    A Grid of nodes
    """

    def __init__(self, nodes):
        self.nodes = list(nodes)

    @staticmethod
    def random(n_nodes=100, *args, **kwargs):
        return Layer([Node.random(*args, **kwargs) for _ in range(n_nodes)])

    def output(self, x):
        # all outputs(similarity to x) of the nodes
        return [node.output(x) for node in self.nodes]

    def champer(self, x):
        """champer node: best matching unit (BMU)
        """
        return self.nodes[self.predict(x)]

    def predict(self, x):
        """the index of best matching unit (BMU)
        """
        return np.argmin(self.output(x))

    def update(self, x, eta=0.5, d=0.5):
        # update the nerighors of the best node
        c = self.champer(x)
        for node in self.nodes:
            if node.near(c, d):
                node.update(x, eta)

    def plot(self, axes, i1=0, i2=1, *args, **kwargs):
        x1 = [node.weight[i1] for node in self.nodes]
        x2 = [node.weight[i2] for node in self.nodes]
        axes.scatter(x1, x2, *args, **kwargs)

    def fit(self, data, eta=0.2, d=0.2, max_iter=100):
        data = scaler.fit_transform(data)
        for t in range(max_iter):
            for x in data:
                self.update(x, eta=eta*exp(-t/10), d=d*exp(-t/10))


if __name__ == '__main__':
    try:
        import pandas as pd
        df = pd.read_csv('heart.csv')  # input your data
    except Exception as e:
        printe(e)
        raise Exception('Please input your data!')

    def _grid(size=(5, 5), *args, **kwargs):
        grid = []
        r, c = size
        for k in range(1,r):
            row = []
            for l in range(1,c):
                weight = np.array((k/r, l/c))
                # weight = np.random.random(kwargs['dim']) # for randomly generating
                location = np.array((k/r, l/c))
                node = Node(weight=weight, location=location)
                row.append(node)
            grid.append(row)
        return grid

    df = df[['trestbps', 'chol']]
    N, p = df.shape
    X = df.values.astype('float')
    
    import matplotlib.pyplot as plt
    fig = plt.figure()
    ax = fig.add_subplot(111)
    X_ = scaler.fit_transform(X)
    ax.plot(X_[:,0], X_[:,1], 'o')
    g = _grid(size=(5,5), dim=p)

    for row in g:
        x = [node.weight[0] for node in row]
        y = [node.weight[1] for node in row]
        ax.plot(x, y, 'g--')
    for col in zip(*g):
        x = [node.weight[0] for node in col]
        y = [node.weight[1] for node in col]
        ax.plot(x, y, 'g--')

    l = Layer(nodes=toolz.concat(g))
    l.plot(ax, marker='s', color='g', alpha=0.2)

    l.fit(X[:N//2,:], max_iter=50)
    l.plot(ax, marker='+', color='r')
    for row in g:
        x = [node.weight[0] for node in row]
        y = [node.weight[1] for node in row]
        ax.plot(x, y, 'r')
    for col in zip(*g):
        x = [node.weight[0] for node in col]
        y = [node.weight[1] for node in col]
        ax.plot(x, y, 'r')

    ax.set_title('Demo of SOM')
    ax.legend(('Data', 'Initial nodes', 'Terminal nodes'))
    plt.show()

在这里插入图片描述

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

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

相关文章

Vue 项目进行 SEO 优化

SSR 服务器渲染 服务端渲染, 在服务端 html 页面节点, 已经解析创建完了, 浏览器直接拿到的是解析完成的页面解构 关于服务器渲染&#xff1a;Vue 官网介绍 &#xff0c;对 Vue 版本有要求&#xff0c;对服务器也有一定要求&#xff0c;需要支持 nodejs 环境。 优势: 更好的 …

如何避免阿里云对象储存OSS被盗刷

网站app图片的云端存储离不开对象存储oss,而最难为的问题就是app做的出名了&#xff0c;少不了同行的攻击&#xff0c;包含ddos&#xff0c;cc攻击以及oss外链被盗刷&#xff01; 防盗链功能通过设置Referer白名单以及是否允许空Referer&#xff0c;限制仅白名单中的域名可以访…

【嵌入式项目应用】__cJSON在单片机的使用

目录 前言 一、JSON和cJson 二、cJSON是如何表示JSON数据的 三、如何封装完整的JSON数据 1. 先将串口打通&#xff0c;方便电脑查看log日志。 2. 增加cjson.c文件&#xff0c;已经在main.c中 3. 准备打包如下的JSON包 4. 代码部分&#xff0c;先将几个部分初始化指针 …

rust学习——智能指针

智能指针 在各个编程语言中&#xff0c;指针的概念几乎都是相同的&#xff1a;指针是一个包含了内存地址的变量&#xff0c;该内存地址引用或者指向了另外的数据。 在 Rust 中&#xff0c;最常见的指针类型是引用&#xff0c;引用通过 & 符号表示。不同于其它语言&#xf…

量子革新加速!法国量子即服务公司ColibriTD完成100万欧元融资

​&#xff08;图片来源&#xff1a;网络&#xff09; 法国量子即服务初创公司ColibriTD已完成100万欧元的种子轮融资&#xff0c;此次融资由Earlybird-X基金以及一群天使投资人领投&#xff0c;这笔资金将用于开发量子即服务平台。 ColibriTD的创始人有两位。创始人Laurent …

线性代数-Python-03:矩阵的变换 - 手写Matrix Transformation及numpy中的用法

文章目录 一、代码仓库二、旋转矩阵的推导及图形学中的矩阵变换2.1 让横坐标扩大a倍&#xff0c;纵坐标扩大b倍2.2 关于x轴翻转2.3 关于y轴翻转2.4 关于原点翻转&#xff08;x轴&#xff0c;y轴均翻转&#xff09;2.5 沿x方向错切2.6 沿y方向错切2.7 旋转2.8 单位矩阵2.9 矩阵的…

使用el-tree问题之清空勾数据不生效

一、问题场景描述 在做角色菜单按钮权限时&#xff0c;多数采用树结构勾选数据&#xff0c;这里使用了element中的el-tree。如下图&#xff1a; 1、我给角色1勾选了权限列表数据的前三行&#xff0c; 点击弹框的确定 2、紧接着点击角色2的权限按钮&#xff0c;给角色2分配修…

分享一款基于 AI 的 Chrome 插件

最近使用大模型比较多&#xff0c;公司虽然提供了免费的 ChatGPT 但是需要跳转特定页面才能访问&#xff0c;比较麻烦&#xff0c;于是就想到是否可以开发一款类似于有道词典一样的 Chrome 插件&#xff0c;可以在任意页面使用&#xff0c;虽然市面上也有类似的插件&#xff0c…

12.4 组播鼠标批量执行

组播模式相比单播模式可以提高网络的效率和带宽利用率&#xff0c;因为组播数据包只需要发送一次&#xff0c;就可以被多个接收者接收&#xff0c;而不需要每个接收者都单独发送一份数据包。这在需要同时向多个接收者发送相同数据的场景下特别有用&#xff0c;如视频会议、在线…

ubuntu tools

1 cloc calculate lines of your code sudo apt-get install cloccloc ./file

C算法:写一个用于找出数组的最大值和最小值的函数

需求&#xff1a; 写一个用于找出数组的最大值和最小值的函数。 示例&#xff1a;int array[9] {5, 9, 3, 1, 2, 8, 4, 7, 6}; 该数组最大值的下标为1&#xff0c;最小值的小标为3。 代码实现&#xff1a; #include <stdio.h>int getNum(int *array,int len,int (*…

kubernates 集群实战-安装K3s集群

安装K3s集群 安装K3s集群环境准备安装 docker主节点安装work 节点验证环境 安装K3s集群 K3S是一种轻量级的Kubernetes发行版&#xff0c;安装和运行只需要一个二进制文件。相比之下&#xff0c;K8S需要更多的步骤和资源来安装和部署&#xff0c;例如设置etcd集群、安装控制平面…

【JavaEE重点知识归纳】第11节:认识异常

目录 一&#xff1a;异常的概念和体系结构 1.概念 2.体系结构 3.异常分类 二&#xff1a;异常的处理 1.防御式编程 2.异常的抛出 3.异常的捕获 4.异常的处理流程 三&#xff1a;自定义异常 一&#xff1a;异常的概念和体系结构 1.概念 &#xff08;1&#xff09;在…

ArrayList与List的层级关系及ArrayList解析

List与ArrayList的关系 List List是一个接口&#xff0c;不能直接实例化。如果要使用必须去实例化List的实现类——ArrayList和LinkedList站在数据结构的角度看&#xff0c;List就是一个线性表。常见的线性表&#xff1a;顺序表、链表、栈、队列等 线性表 线性表是n个具有相…

关于nacos的配置获取失败及服务发现问题的排坑记录

nacos配置更新未能获取到导致启动报错 排查思路&#xff1a; 1、是否添加了nacos的启动pom依赖 参考&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><…

一种基于HTTPS实现的Web账号登录Linux桌面系统的实现方案

问题由来 客户需求计划列入支持第三方帐号系统&#xff0c;包括Web账号。需求来源是用户想要用它们的帐号直接登录Linux Deepin操作系统。一个失败的实现方案是用户以较小的成本改造帐号管理系统发布HTTP服务&#xff0c;我们开发一个PAM模块与Web服务器交互&#xff0c;数据格…

PX4-Autopilot下载与编译

文章目录 1 Git clone 代码2 下载子模块3 编译4 可能遇到的问题参考 1 Git clone 代码 Github Repository 链接&#xff1a;PX4-Autopilot 查看现有版本&#xff1a; 在终端用命令下载&#xff0c;-b表示branch git clone -b v1.14.0 https://github.com/PX4/PX4-Autopilot.…

基于epoll封装非阻塞的reactor框架(附源码)

C++常用功能源码系列 文章目录 C++常用功能源码系列前言一、reactor架构二、client端reactor代码三、server端reactor代码四、单reactor架构可以实现百万并发总结前言 本文是C/C++常用功能代码封装专栏的导航贴。部分来源于实战项目中的部分功能提炼,希望能够达到你在自己的项…

伊始:「深入浅出」的学习

深入浅出是一种有效的学习原则。这种学习原则基于最新的认知科学、神经生物学及教育心理学研究结果&#xff0c;通过使用元认知&#xff0c;采用不同的方法展示信息并加速学习过程。 图形结合统一思想 与单纯的文字相比较&#xff0c;图形结合&#xff08;当然&#xff0c;你也…

【算法|动态规划No.29】leetcode132. 分割回文串 II

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…