基于鸢尾花数据集实施自组织神经网络聚类分析

基于鸢尾花数据集实施自组织神经网络聚类分析

  • 1. 自组织神经网络的基础知识
  • 2. 鸢尾花数据集的自组织分类
  • 3. SOM的无监督聚类

1. 自组织神经网络的基础知识

自组织神经网络也称自组织映射(SOM)或自组织特征映射(SOFM),是一种使用非监督式学习来产生训练样本的输入空间的一个低维(通常是二维)离散化的表示的人工神经网络(ANN)。自组织映射与其他人工神经网络的不同之处在于它使用一个邻近函数来保持输入空间的拓扑性质。
在这里插入图片描述
在这里插入图片描述

2. 鸢尾花数据集的自组织分类

# 导入必要的库
import numpy as np
from minisom import MiniSom
import matplotlib.pyplot as plt
from sklearn import datasets# 载入鸢尾花数据集
iris = datasets.load_iris()
data = iris.data
labels = iris.target# 数据归一化
data = (data - np.min(data, axis=0)) / (np.max(data, axis=0) - np.min(data, axis=0))# 定义 SOM 网络的参数
som_shape = (10, 10)  # SOM 网格的形状
som = MiniSom(som_shape[0], som_shape[1], data.shape[1], sigma=1.0, learning_rate=0.5)# 初始化权重并开始训练
som.random_weights_init(data)
som.train_random(data, 100)  # 100 次迭代
# 创建 U-matrix
umatrix = som.distance_map()
print(umatrix)
# 绘制 U-matrix
plt.figure(figsize=(4,4))
plt.pcolor(umatrix.T, cmap='bone_r', alpha=0.8)
plt.colorbar()# 绘制聚类中心
for i, target in enumerate(labels):x, y = som.winner(data[i])plt.text(x + 0.5, y + 0.5, str(target), color=plt.cm.rainbow(target / 2.0), fontdict={'weight': 'bold', 'size': 11})plt.xticks(np.arange(som_shape[0] + 1))
plt.yticks(np.arange(som_shape[1] + 1))
plt.grid()
plt.show()

聚类结果
在这里插入图片描述

新聚类

import math
import numpy as np
from minisom import MiniSom
from sklearn import datasets
from numpy import sum as npsum
from sklearn.metrics import classification_report
from sklearn.model_selection import train_test_splitimport matplotlib.pyplot as plt
from matplotlib.patches import Patch
from matplotlib.gridspec import GridSpec# 分类函数
def classify(som,data,winmap):default_class = npsum(list(winmap.values())).most_common()[0][0]result = []for d in data:win_position = som.winner(d)if win_position in winmap:result.append(winmap[win_position].most_common()[0][0])else:result.append(default_class)return result# 可视化
def show(som):""" 在输出层画标签图案 """plt.figure(figsize=(5, 5))# 定义不同标签的图案标记markers = ['o', 's', 'D']colors = ['C0', 'C1', 'C2']category_color = {'setosa': 'C0', 'versicolor': 'C1', 'virginica': 'C2'}# 背景上画U-Matrixheatmap = som.distance_map()# 画背景图plt.pcolor(heatmap, cmap='bone_r')for cnt, xx in enumerate(X_train):w = som.winner(xx)# 在样本Heat的地方画上标记plt.plot(w[0] + .5, w[1] + .5, markers[Y_train[cnt]], markerfacecolor='None',markeredgecolor=colors[Y_train[cnt]], markersize=12, markeredgewidth=2)plt.axis([0, size, 0, size])ax = plt.gca()# 颠倒y轴方向ax.invert_yaxis()legend_elements = [Patch(facecolor=clr, edgecolor='w', label=l) for l, clr in category_color.items()]plt.legend(handles=legend_elements, loc='center left', bbox_to_anchor=(1, .95))plt.show()# """ 在每个格子里画饼图,且用颜色表示类别,用数字表示总样本数量 """# plt.figure(figsize=(16, 16))# the_grid = GridSpec(size, size)# for position in winmap.keys():#     label_fracs = [winmap[position][label] for label in [0, 1, 2]]#     plt.subplot(the_grid[position[1], position[0]], aspect=1)#     patches, texts = plt.pie(label_fracs)#     plt.text(position[0] / 100, position[1] / 100, str(len(list(winmap[position].elements()))),#              color='black', fontdict={'weight': 'bold', 'size': 15}, va='center', ha='center')# plt.legend(patches, class_names, loc='center right', bbox_to_anchor=(-1, 9), ncol=3)# plt.show()if __name__ == '__main__':# 导入数据集iris = datasets.load_iris()# 提取iris数据集的标签与数据feature_names = iris.feature_namesclass_names = iris.target_namesX = iris.dataY = iris.target# 划分训练集、测试集  7:3X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)# 样本数量N = X_train.shape[0]# 维度/特征数量M = X_train.shape[1]# 最大迭代次数max_iter = 200# 经验公式:决定输出层尺寸size = math.ceil(np.sqrt(5 * np.sqrt(N)))print("训练样本个数:{}  测试样本个数:{}".format(N, X_test.shape[0]))print("输出网格最佳边长为:", size)# 初始化模型som = MiniSom(size, size, M, sigma=3, learning_rate=0.5, neighborhood_function='bubble')# 初始化权值som.pca_weights_init(X_train)# 模型训练som.train_batch(X_train, max_iter, verbose=False)# 利用标签信息,标注训练好的som网络winmap = som.labels_map(X_train, Y_train)# 进行分类预测y_pred = classify(som, X_test, winmap)print(y_pred)# 展示在测试集上的效果print(classification_report(Y_test, np.array(y_pred)))# 可视化show(som)

在这里插入图片描述

3. SOM的无监督聚类

from minisom import MiniSom
import numpy as np
import pandas as pd
from sklearn import datasets
import matplotlib.pyplot as plt# 加载鸢尾花数据
iris = datasets.load_iris()
data = iris.data
ds = pd.DataFrame(data)
dt=ds.values
som_shape = (1,3)
som = MiniSom(som_shape[0], som_shape[1], dt.shape[1], sigma=.5, learning_rate=.5,neighborhood_function='gaussian', random_seed=42)
som.train_batch(dt, 1000, verbose=True)
winner_coordinates = np.array([som.winner(x) for x in dt]).T
cluster_index = np.ravel_multi_index(winner_coordinates, som_shape)
## 可视化聚类结果
import matplotlib.pyplot as plt 
from matplotlib import rcParams
from matplotlib.pyplot import MultipleLocatorconfig = {"font.family": 'serif', # 衬线字体"font.size": 10, # 相当于小四大小"font.serif": ['SimSun'], # 宋体"mathtext.fontset": 'stix', # matplotlib渲染数学字体时使用的字体,和Times New Roman差别不大'axes.unicode_minus': False # 处理负号,即-号
}
rcParams.update(config)fig = plt.figure(figsize=(5,5))
ax = plt.subplot(1,1,1,projection='3d')
# plotting the clusters using the first 2 dimentions of the data
for c in np.unique(cluster_index):ax.scatter3D(dt[cluster_index == c, 0],dt[cluster_index == c, 1], dt[cluster_index == c, 2], label='cluster='+str(c), alpha=.7)# plotting centroids
for centroid in som.get_weights():ax.scatter3D(centroid[:, 0], centroid[:, 1],centroid[:, 2], marker='x', alpha=.7,s=10, linewidths=10, color='k', label='centroid')
ax.set_xlabel('Production Function')		
ax.set_ylabel('Economy Function')
ax.set_zlabel('Social Function')
ax.set_title('SOM clustering result')
plt.legend()
# plt.margins(0,0,0)
plt.show()
# plt.savefig('./result.png',dpi=600)

在这里插入图片描述

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

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

相关文章

限流算法深度解析与实用指南

1. 限流概述 在现代软件开发中,服务的高可用性和稳定性是至关重要的,而限流正是确保这一点的有效技术手段之一。限流可以防止过多的请求在短时间内涌向服务,从而引发服务过载并最终导致崩溃。这一部分,我们将探讨限流的必要性、应…

Coze扣子开发指南:用免费API自己创建插件

虽然Coze扣子现在插件商店已经有几百个插件了,但相对于海量人群的众多差异化需求,还是远远不够的。如果插件商店没有合适的插件,其实完成可以自己创建,过程也很简单,不需要编写任何代码。 首先打开个人空间&#xff0…

mybatis的xml配置文件以及mybatis使用

数据库配置文件.db(放在resource下)&#xff1a; Mb.driver com.mysql.cj.jdbc.Driver Mb.url jdbc:mysql://127.0.0.1:3306/数据库名 Mb.username root Mb.password 密码 mybatis-config的xml文件&#xff08;放在resource下&#xff09;&#xff1a; <?xml versio…

速盾cdn在企业网站和小微企业网站中表现如何?

速盾CDN&#xff08;Content Delivery Network&#xff09;是一种通过分布式网络将内容快速传递给用户的技术解决方案。在企业网站和小微企业网站中&#xff0c;速盾CDN提供了许多好处和优势。 首先&#xff0c;速盾CDN可以大大提高网站的访问速度。由于CDN采用分布式的方式&a…

Pytorch基础:torch.expand() 和 torch.repeat()

在torch中&#xff0c;如果要改变某一个tensor的维度&#xff0c;可以利用view、expand、repeat、transpose和permute等方法&#xff0c;这里对这些方法的一些容易混淆的地方做个总结。 expand和repeat函数是pytorch中常用于进行张量数据复制和维度扩展的函数&#xff0c;但其…

AcWing 835:Trie字符串统计 ← 字典树(Trie树)模板题

【题目来源】https://www.acwing.com/problem/content/837/【题目描述】 维护一个字符串集合&#xff0c;支持两种操作&#xff1a; ● I x 向集合中插入一个字符串 x&#xff1b; ● Q x 询问一个字符串在集合中出现了多少次。 共有 N 个操作&#xff0c;所有输入的字符…

如何在Python中实现文本相似度比较?

在Python中实现文本相似度比较可以通过多种方法&#xff0c;每种方法都有其适用场景和优缺点。以下是一些常见的文本相似度比较方法&#xff1a; 1. 余弦相似度&#xff08;Cosine Similarity&#xff09; 余弦相似度是通过计算两个向量之间夹角的余弦值来确定它们之间的相似…

Linux sudo 指令

sudo命令 概念&#xff1a; sudo是linux下常用的允许普通用户使用超级用户权限的工具&#xff0c;允许系统管理员让普通用户执行一些或者全部的root命令&#xff0c;如halt&#xff0c;reboot&#xff0c;su等。这样不仅减少了root用户的登录和管理时间&#xff0c;同样也提高…

解决Windows下共享文件夹的再三访问失败问题

今天遇到一个奇葩的情况&#xff0c; 明明局域网的两台电脑可以ping通&#xff0c; 明明共享文件夹的Everyone权限设置妥当&#xff0c; 明明高级网络共享中的文件共享&#xff0c;密码保护都已经开启了&#xff0c; 明明防火墙也关闭了&#xff0c; 明明输入连接地址后也…

22、Flink 背压下的 Checkpoint处理

1.概述 通常&#xff0c;对齐 Checkpoint 的时长主要受 Checkpointing 过程中的同步和异步两个部分的影响&#xff1b;但当 Flink 作业正运行在严重的背压下时&#xff0c;Checkpoint 端到端延迟的主要影响因子将会是传递 Checkpoint Barrier 到 所有的算子/子任务的时间&…

线程与进程

进程 进程是程序的一次执行过程&#xff0c;系统程序的基本单位。有自己的main方法&#xff0c;并且主要由主方法运行起来的基本上就是进程。 线程 线程与进程相似&#xff0c;但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是…

vty、带内/带外管理、带内/带外ip简介

1、vty是什么&#xff1f; (virtual teletype)虚拟电传打字机 漫谈VTY (qq.com) 视频链接&#xff1a;使用20世纪30年代的电传打字机作为Linux系统的终端 https://hackaday.com/2020/04/15/logging-into-linux-with-a-1930s-teletype/ 2、console端口和vty端口的区别&#xf…

局域网语音对讲系统_IP广播对讲系统停车场解决方案

局域网语音对讲系统_IP广播对讲系统停车场解决方案 需求分析&#xff1a; 随着国民经济和社会的发展&#xff0c; 选择坐车出行的民众越来越多。在保护交通安全的同时&#xff0c;也给停车场服务部门提出了更高的要求。人们对停车场系统提出了更高的要求与挑战&#xff0c; 需要…

部分设计模式概述

单例模式 工厂模式 适配器模式 模板方法模式 策略模式 责任链 观察者模式&#xff08;又叫发布订阅模式&#xff09;

容器化Jenkins远程发布java应用(方式一:pipline+ssh)

1.创建pipline工程 2.准备工程Jenkinsfile文件&#xff08;java目录&#xff09; 1.文件脚本内容 env.fileName "planetflix-app.jar" env.configName "planetflix_prod" env.remoteDirectory "/data/project/java" env.sourceFile "/…

LangChain基本概念

概述 LangChain是一个为大型语言模型&#xff08;LLMs&#xff09;应用程序开发设计的框架&#xff0c;它包含一些关键的基本概念&#xff0c;理解这些概念对于使用LangChain至关重要&#xff1a; 组件&#xff08;Components&#xff09;&#xff1a; LangChain的构建块&…

Leetcode - 周赛396

目录 一&#xff0c;3136. 有效单词 二&#xff0c;3137. K 周期字符串需要的最少操作次数 三&#xff0c;3138. 同位字符串连接的最小长度 四&#xff0c;3139. 使数组中所有元素相等的最小开销 一&#xff0c;3136. 有效单词 本题就是一道阅读理解题&#xff1a; 字符串长…

NSSCTF | [SWPUCTF 2021 新生赛]easy_sql

打开题目&#xff0c;提示输入一些东西&#xff0c;很显眼的可以看到网站标题为“参数是wllm” 首先单引号判断闭合方式 ?wllm1 报错了&#xff0c;可以判断为单引号闭合。 然后判断字节数&#xff08;注意‘--’后面的空格&#xff09; ?wllm1 order by 3-- 接着输入4就…

Linux呈现数据

目录 一、理解输入和输出 1.1 标准文件描述符 1.1.1 STDIN 1.1.2 STDOUT 1.1.3 STDERR 1.2 重定向错误 二、在脚本中重定向输出 2.1 临时重定向 2.2 永久重定向 三、在脚本中重定向输入 四、创建自己的重定向 4.1 创建输出文件描述符 4.2 重定向文件描述符 4.3 关…

vue多选功能

废话不多说&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; <template><div class"duo-xuan-page"><liv-for"(item, index) in list":key"index"click"toggleSelection(item)":class"{ active: sel…