⚡自组织映射(SOM)神经网络⚡Python实现 |Python技能树征题

简介: ⚡自组织映射(SOM)神经网络⚡Python实现 |Python技能树征题

❤九月❤份了,车神哥又回归了校园

冬天❉还会远吗

♪推荐一首最近很⚡喜欢⚡的歌♪

No Fear In My Heart -朴树

image.png

由于最近在写一篇相关的论文,就说说其中遇到的一些问题吧~

Minisom

之前做过一个对minisom的第三方开源库的介绍,可以点击看这里

对相应的代码添加了注释:

导入各种库吧

# 导入库
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Patch
import pandas as pd
from minisom import MiniSom
import math
import xlrd
from icecream import ic
from tqdm import tqdm
from openpyxl import load_workbook
import openpyxl
from time import time

第一步是导入数据的Function,这很简单就不解释了

# 传入数据成DataFrame的矩阵格式
def loaddata(datafile, num_name):
    df = pd.read_excel(datafile, sheet_name=num_name, index_col=0)   # 导入数据
    return df  # 返回值

由于代码不是很长,就没有按照模块来写了

image.png

然后是导入源文件及其标签。

说实话,在现实项目中,想要找到不同特征的标签是真的真的真的太难了!!!

不要问为什么,当你实践你就知道了~

# 导入原始数据
# 1.导入训练和测试数据集
datafile = "*********.xls"  # 原始数据文件名
# 2.导入标签数据
y = pd.DataFrame(pd.read_csv('label****.csv'))    # 读取你的标签数据或者原有的标签是最好的
yy = []   # 设置空矩阵
# 循环将标签导入yy矩阵中
for iy in range(y.shape[0]):
    Uy = y.iloc[iy, 0]
    yy.append(int(Uy))
y = yy   # 赋值给y

再读取每个sheet中的不同特征名称,我的数据集是这样,如果你没有特征名称,最好对其进行标记,这样会更加有效。

# 3.读取特征标签
feature_names = pd.DataFrame(pd.read_excel(datafile, index_col=0)).columns   # 取数据的列:特征标签
class_names = [0, 1]  # 标签名称
feat = []   # 设置空矩阵
# 循环将特征名称添加到feat矩阵中
for tz in range(feature_names.shape[0]):
    tezh = feature_names[tz]
    feat.append(tezh)  # 逐步添加进feat
feature_names = feat   # 赋值给feature_names
print('特征名称:', feature_names)

由于我的源文件会有很多个sheet,所以需要对每一个sheet进行训练及测试,再进行保存操作,如果你只要一个数据表的话,可以对此进行相应的改进。

# 按照每一个数据Sheet读取每一层的数据
# 读取文件数据集
workbook = xlrd.open_workbook(datafile)  # 打开数据文件
sheets = workbook.sheet_names()   # 读取原始数据的数据表sheet名
SheetNames = []   # 设置空矩阵
# 循环输出
for sheetname in tqdm(sheets):
    print("表格的名称是:", sheetname)
    SheetNames.append(sheetname)   # 循环添加进空矩阵SheetNames中
print('原始数据表的表单名称为:', SheetNames)
num_n = pd.DataFrame(SheetNames).shape[0]  # 获取表单的个数
print('表单的个数为:', num_n)
# 设置空数据表1
dff = pd.DataFrame(columns=["title", "content"])    # 添加列名
dff.to_excel('SOM_Result.xlsx')   # 保存到'SOM_Result.xlsx'
## 设置空数据表2
dff2 = pd.DataFrame(columns=["title1", "content1"])   # 添加列名
dff2.to_excel('SOM_label_result.xlsx')  # 保存到'SOM_label_result.xlsx'
start_time = time()    # 记录设置开始的时间

接下来也是对我的每一个表单进行循环遍历训练及其测试的过程,如果只需要进行一次,那么只需要取消循环过程,更改其中的一些变量即可。

其中包含SOM的训练及测试,权值矩阵、map、聚类结果的可视化,精确度等操作。

for i_c in range(num_n):
    if i_c < num_n:
        print('程序目前处在第%r层数.' % SheetNames[i_c])
        XMat = loaddata(datafile, num_name=SheetNames[i_c])  # 返回得到浮点型矩阵
        # 设置空数据表1
        dff = pd.DataFrame(columns=["title", "content"])  # 添加列名
        dff.to_excel('SOM_Result_'+ SheetNames[i_c] +'.xlsx')  # 保存到'SOM_Result.xlsx'
        ## 设置空数据表2
        dff2 = pd.DataFrame(columns=["title1", "content1"])  # 添加列名
        dff2.to_excel('SOM_label_result_'+ SheetNames[i_c] +'.xlsx')  # 保存到'SOM_label_result.xlsx'
        X =  XMat.values    # 将DataFrame格式改为np.array矩阵
        # 划分训练集、测试集  7:3
        X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)  # X为原始数据,y为标签数据,test_size为训练集和测试集划分比例,random_state为选择随机打乱的方式,可设置为0或1方式
        N = X_train.shape[0]  #样本数量
        M = X_train.shape[1]  #维度/特征数量
        '''
        设置超参数
        '''
        size = math.ceil(np.sqrt(5 * np.sqrt(N)))  # 经验公式:决定输出层尺寸
        print("训练样本个数:{}  测试样本个数:{}".format(N, X_test.shape[0]))
        print("输出网格最佳边长为:", size)
        max_iter = 1000  # 迭代次数
        # Initialization and training(初始化及其训练) size为神经元数,M为输入维度/特征数量, learning——rate为学习率
        som = MiniSom(size, size, M, sigma=3, learning_rate=0.5,
                      neighborhood_function='bubble')    # Neighborhood_function’近邻函数‘可选的设置有'gaussian'、'mexican_hat'、'bubble'. 调参的时候可以都试一遍,看效果
        '''
        初始化权值,有2个API
        '''
        som.pca_weights_init(X_train)   # PCA降维初始化
        som.train_batch(X_train, max_iter, verbose=False)  # train_batch 每次按顺序取一个样本,用过最后一个样本后跳回第一个样本,循环直到迭代次数满足max_iter
        winmap = som.labels_map(X_train, y_train)   # 求取获胜神经元
        # 判断样本的类别
        def classify(som,data,winmap):
            from numpy import sum as npsum   # 导入库
            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])  # 将其添加进空矩阵result中
                else:
                    result.append(default_class)   # 若不满足上面的条件则将default_class添加进result中
            print('输出result结果:', result)
            return result   # 返回值
        # 输出混淆矩阵
        y_pred = classify(som, X_test, winmap)   # 调用classify函数
        print(classification_report(y_test, np.array(y_pred)))   # 输出混淆矩阵
        # 绘制各种图
        # U-Matrix
        heatmap = som.distance_map()  #生成U-Matrix
        plt.imshow(heatmap, cmap='bone_r')      #miniSom案例中用的pcolor函数,需要调整坐标
        plt.colorbar()   # 颜色卡
        plt.figure(figsize=(9, 9))   # 设置图像大小
        # 背景上画U-Matrix
        heatmap = som.distance_map()  # 热力图
        plt.pcolor(heatmap, cmap='bone_r')  # plotting the distance map as background 设置样式
        # 定义不同标签的图案标记
        markers = ['o', 's']   # 设置图案样式
        colors = ['C0', 'C1']   # 定义不同标签图案的颜色
        category_color = {'Normal': 'C0',
                          'fault': 'C1',
                          }   # 设置对应字典
        for cnt, xx in enumerate(X_train):  # 迭代获取X_train训练数据
            w = som.winner(xx)  # getting the winner
            # 在样本Heat的地方画上标记
            plt.plot(w[0]+.5, w[1]+.5, markers[y_train[cnt]], markerfacecolor='None',
                     markeredgecolor=colors[y_train[cnt]], markersize=12, markeredgewidth=2) # plot绘制图像,markerfacecolor:标记颜色,markersize:标记尺寸,markeredgewidth:标记宽度
        plt.axis([0, size, 0, size])  # 设置坐标系
        ax = plt.gca()    # 进行坐标轴的移动,gca就是get current axes
        ax.invert_yaxis() #颠倒y轴方向
        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()  # 显示图
        label_name_map_number = {"Normal":0,"Fault":1}
        # 神经元占比饼图
        from matplotlib.gridspec import GridSpec
        plt.figure(figsize=(9, 9))    # 设置图像界面大小
        the_grid = GridSpec(size, size)   # 神经元个数
        for position in winmap.keys():   # 迭代获取获胜神经元位置
            label_fracs = [winmap[position][label] for label in [0,1]]  # 获取标签
            plt.subplot(the_grid[position[1], position[0]], aspect=1)    # 表示把显示界面分割成the_grid[position[1]*position[0]的网格
            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()   # 输出显示图像
        # 权重热力图
        plt.figure(figsize=(10, 10))   # 设置图像大小
        for i, f in enumerate(feature_names):  # 迭代循环获取feature_names特征
            plt.subplot(4, 4, i+1)    # 表示把显示界面分割成 4*4 的网格
            plt.title(f)   # 设置标题
            W = som.get_weights()  # 获得权重数据
            plt.imshow(W[:,:,i], cmap='coolwarm')   # 输出热力图,W[:,:,i]变量存储图像,可以是浮点型数组、unit8数组以及PIL图像,参数cmap用于设置热图的Colormap,代表热力块的样式颜色
            plt.colorbar()   # colorbar,颜色卡尺
            plt.xticks(np.arange(size+1))   # 设置主图的横坐标的刻度字体大小
            plt.yticks(np.arange(size+1))   # 设置主图的纵坐标的刻度字体大小
        # plt.show()  # 输出显示图像
        # 保存result——label
        print('开始SOM标签Result保存!')
        df_winmap = pd.DataFrame.from_dict(winmap, orient='index')  # 读取转换winmap
        ic(df_winmap)  # 输出显示df_winmap
        writer1 = pd.ExcelWriter('SOM_label_result_'+ SheetNames[i_c] +'.xlsx', engine='openpyxl')   # 读取'SOM_label_result.xlsx'
        book1 = load_workbook(writer1.path)  # 获取文件路径
        writer1.book = book1  # 赋值
        df_winmap.to_excel(excel_writer=writer1, sheet_name=str(SheetNames[i_c]))  # 建立为数据表
        writer1.save()   # 保存数据表
        writer1.close()  # 关闭数据表
        print('SOM标签Result保存结束!')
        # 保存result_data
        print('开始SOM最终Result坐标保存!')
        winner = som.win_map(X_train, return_indices=True)   # 获取SOM的获胜神经元结果
        my_df = pd.DataFrame.from_dict(winner, orient='index')  # 转换输出赋值给my_df
        ic(my_df)   # 显示输出
        writer = pd.ExcelWriter('SOM_Result_'+ SheetNames[i_c] +'.xlsx', engine='openpyxl')   # 建立数据表'SOM_Result.xlsx'
        book = load_workbook(writer.path)   # 获取文件路径
        writer.book = book   # 赋值
        my_df.to_excel(excel_writer=writer, sheet_name=str(SheetNames[i_c]))   # 保存数据表
        writer.save()   # 保存操作
        writer.close()  # 关闭操作
        print('SOM最终Result坐标保存结束!')

大体的流程就是这样了,minisom的库训练起来比Matlab快了不知道多少倍,⚡yyds⚡!!!

目录
打赏
0
0
0
0
25
分享
相关文章
神经网络深度剖析:Python带你潜入AI大脑,揭秘智能背后的秘密神经元
【8月更文挑战第1天】在当今科技飞速发展的时代,AI已成为日常生活中不可或缺的一部分。神经网络作为AI的核心,通过模拟人脑中的神经元连接方式处理复杂数据模式。利用Python及其强大的库TensorFlow,我们可以轻松构建神经网络模型。示例代码展示了如何建立一个含有两层隐藏层的简单神经网络,用于分类任务。神经网络通过反向传播算法不断优化权重和偏置,从而提高预测准确性。随着技术的进步,神经网络正变得越来越深、越来越复杂,能够应对更加艰巨的挑战,推动着AI领域向前发展。
71 2
神经网络深度剖析:Python带你潜入AI大脑,揭秘智能背后的秘密神经元
【9月更文挑战第12天】在当今科技飞速发展的时代,人工智能(AI)已深入我们的生活,从智能助手到自动驾驶,从医疗诊断到金融分析,其力量无处不在。这一切的核心是神经网络。本文将带领您搭乘Python的航船,深入AI的大脑,揭秘智能背后的秘密神经元。通过构建神经网络模型,我们可以模拟并学习复杂的数据模式。以下是一个使用Python和TensorFlow搭建的基本神经网络示例,用于解决简单的分类问题。
67 10
构建高效Web应用:掌握Python中的ORM映射技术
在Web开发中,数据库操作至关重要,但直接编写SQL语句会增加代码复杂度并降低效率。对象关系映射(ORM)技术通过将对象模型映射为数据库表,使开发者能以面向对象的方式处理数据,提升开发效率和代码可维护性。本文以Python和SQLAlchemy为例,介绍ORM的基本概念、安装方法及使用技巧,并展示其在提升Web应用性能方面的优势。通过ORM,开发者可以简化数据库操作,专注于业务逻辑实现,提高开发效率和代码质量。
90 1
【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow
眼疾识别系统,使用Python作为主要编程语言进行开发,基于深度学习等技术使用TensorFlow搭建ResNet50卷积神经网络算法,通过对眼疾图片4种数据集进行训练('白内障', '糖尿病性视网膜病变', '青光眼', '正常'),最终得到一个识别精确度较高的模型。然后使用Django框架开发Web网页端可视化操作界面,实现用户上传一张眼疾图片识别其名称。
167 9
【眼疾病识别】图像识别+深度学习技术+人工智能+卷积神经网络算法+计算机课设+Python+TensorFlow
|
8月前
|
Python模块是其代码组织和重用的基本方式。
【8月更文挑战第18天】Python模块是其代码组织和重用的基本方式。
55 1
神经网络入门到精通:Python带你搭建AI思维,解锁机器学习的无限可能
【9月更文挑战第10天】神经网络是开启人工智能大门的钥匙,不仅是一种技术,更是模仿人脑思考的奇迹。本文从基础概念入手,通过Python和TensorFlow搭建手写数字识别的神经网络,逐步解析数据加载、模型定义、训练及评估的全过程。随着学习深入,我们将探索深度神经网络、卷积神经网络等高级话题,并掌握优化模型性能的方法。通过不断实践,你将能构建自己的AI系统,解锁机器学习的无限潜能。
140 0
如何可视化神经网络的神经元节点之间的连接?附有Python预处理代码
该博客展示了如何通过Python预处理神经网络权重矩阵并将其导出为表格,然后使用Chiplot网站来可视化神经网络的神经元节点之间的连接。
110 0
如何可视化神经网络的神经元节点之间的连接?附有Python预处理代码
神经网络入门到精通:Python带你搭建AI思维,解锁机器学习的无限可能
【8月更文挑战第3天】踏入人工智能领域,神经网络是开启智慧之门的钥匙。它不仅是一种技术,更是模仿人脑学习与推理的思维方式。从理解神经元间的连接到构建神经网络的基本概念,再到使用Python与TensorFlow搭建手写数字识别模型,每一步都揭示着机器学习的奥秘。随着深入学习,我们将探索更高级的主题,比如深度神经网络、卷积神经网络和循环神经网络,以及如何优化模型性能。掌握背后的数学原理,将帮助我们设计更高效准确的模型。在这个旅程中,Python将是我们的得力助手,引领我们探索AI世界的无限可能。
93 2
神经网络不再是黑魔法!Python带你一步步拆解,让AI学习看得见
【8月更文挑战第3天】神经网络,曾被视为难以触及的黑魔法,现已在Python的助力下变得平易近人。以TensorFlow或PyTorch为“魔法杖”,仅需几行Python代码即可构建强大的AI模型。从零开始,我们将教导AI识别手写数字,利用经典的MNIST数据集。通过数据加载、预处理至模型训练与评估,每个步骤都如精心编排的舞蹈般清晰可见。随着训练深入,AI逐渐学会辨认每个数字,其学习过程直观展现。这不仅揭示了神经网络的奥秘,更证明了任何人都能借助Python创造AI奇迹,共同探索未来的无限可能。
75 2

热门文章

最新文章

目录
目录
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等