首页 > 其他分享 >质谱数据,二分类,bp神经网络

质谱数据,二分类,bp神经网络

时间:2023-07-09 20:44:06浏览次数:52  
标签:21 质谱 神经网络 bp weight2 value1 weight1 np value2

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split

data=pd.read_pickle('ICC_rms.pkl')
df=pd.DataFrame(data)
X = df.iloc[:, 0:510].values #所有样本的x值,0-510列 矩阵(1544,510)由此得出样本个数1544个,特征510
y = df.iloc[:, 511].values #所有样本的标签,511列 矩阵(1544,)
#把y转成1-0形式,Neurons对应0,Astrocytes对应1
Y=np.array([-1.0] * 1544)
for i in range(len(y)):
    if y[i] =='Neurons':
        Y[i]=0
    if y[i] =='Astrocytes':
        Y[i]=1
# y=['Neurons' 'Neurons' 'Neurons' ... 'Astrocytes' 'Astrocytes' 'Astrocytes']
# Y=[0. 0. 0. ... 1. 1. 1.]

# x为输入层神经元个数,y为隐层神经元个数,z输出层神经元个数
# 创建的是参数初始化函数,参数有各层间的权重weight和阈值即偏置value就是b
# 本例的x,y=len(dataset[0])=22,z=1
def parameter_initialization(x, y, z):
    # 隐层阈值
    value1 = np.random.randint(-5, 5, (1, y)).astype(np.float64)  # 随机生成(-5,5)之间的整数组成(1,y)的数组,然后再将其转为浮点数显示

    # 输出层阈值
    value2 = np.random.randint(-5, 5, (1, z)).astype(np.float64)

    # 输入层与隐层的连接权重
    weight1 = np.random.randint(-5, 5, (x, y)).astype(np.float64)

    # 隐层与输出层的连接权重
    weight2 = np.random.randint(-5, 5, (y, z)).astype(np.float64)

    return weight1, weight2, value1, value2


# 创建激活函数sigmoid
def sigmoid(z):
    return 1 / (1 + np.exp(-z))


'''
weight1:输入层与隐层的连接权重
weight2:隐层与输出层的连接权重
value1:隐层阈值
value2:输出层阈值
权重和阈值的个数和神经网络的隐层层数有关,若隐层为n,则权重和阈值的个数为n+1
'''


# 创建训练样本的函数,返回训练完成后的参数weight和value,这里的函数是经过一次迭代后的参数,即所有的样本经过一次训练后的参数
# 具体参数的值可以通过设置迭代次数和允许误差来进行确定
def trainning(dataset, labelset, weight1, weight2, value1, value2):
    # x为步长
    x = 0.01  # 学习率
    for i in range(len(dataset)):  # 依次读取数据特征集中的元素,一个元素即为一个样本所含有的所有特征数据

        # 输入数据
        # (1,21)
        inputset = np.mat(dataset[i]).astype(np.float64)  # 每次输入一个样本,将样本的特征转化为矩阵,以浮点数显示

        # 数据标签
        # (1,1)
        outputset = np.mat(labelset[i]).astype(np.float64)  # 输入样本所对应的标签

        # 隐层输入,隐层的输入是由输入层的权重决定的,wx
        # input1:(1,21).(21,21)=(1,21)
        input1 = np.dot(inputset, weight1).astype(np.float64)

        # 隐层输出,由隐层的输入和阈值以及激活函数决定的,这里的阈值也可以放在输入进行计算
        # sigmoid((1,21)-(1,21))=(1,21)
        output2 = sigmoid(input1 - value1).astype(np.float64)

        # 输出层输入,由隐层的输出
        # (1,21).(21,1)=(1,1)
        input2 = np.dot(output2, weight2).astype(np.float64)

        # 输出层输出,由输出层的输入和阈值以及激活函数决定的,这里的阈值也可以放在输出层输入进行计算
        # (1,1).(1,1)=(1,1)
        output3 = sigmoid(input2 - value2).astype(np.float64)

        # 更新公式由矩阵运算表示
        # a:(1,1)
        a = np.multiply(output3, 1 - output3)  # 输出层激活函数求导后的式子,multiply对应元素相乘,dot矩阵运算
        # g:(1,1)
        g = np.multiply(a, outputset - output3)  # outputset - output3:实际标签和预测标签差
        # weight2:(21,1),np.transpose(weight2):(1,21),b:(1,21)
        b = np.dot(g, np.transpose(weight2))
        # (1,21)
        c = np.multiply(output2, 1 - output2)  # 隐层输出激活函数求导后的式子,multiply对应元素相乘,dot矩阵运算
        # (1,21)
        e = np.multiply(b, c)

        value1_change = -x * e  # (1,21)
        value2_change = -x * g  # (1,1)
        weight1_change = x * np.dot(np.transpose(inputset), e)  # (21,21)
        weight2_change = x * np.dot(np.transpose(output2), g)  # (21,1)

        # 更新参数,权重与阈值的迭代公式
        value1 += value1_change
        value2 += value2_change
        weight1 += weight1_change
        weight2 += weight2_change
    return weight1, weight2, value1, value2


# 创建测试样本数据的函数
def testing(dataset1, labelset1, weight1, weight2, value1, value2):
    # 记录预测正确的个数
    rightcount = 0
    for i in range(len(dataset1)):
        # 计算每一个样例的标签通过上面创建的神经网络模型后的预测值
        inputset = np.mat(dataset1[i]).astype(np.float64)
        outputset = np.mat(labelset1[i]).astype(np.float64)
        output2 = sigmoid(np.dot(inputset, weight1) - value1)
        output3 = sigmoid(np.dot(output2, weight2) - value2)

        # 确定其预测标签
        if output3 > 0.5:
            flag = 1
        else:
            flag = 0
        if labelset1[i] == flag:
            rightcount += 1
        # 输出预测结果
        print("预测为%d   实际为%d" % (flag, labelset1[i]))
    # 返回正确率
    return rightcount / len(dataset1)


def main():
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.20, random_state=0)
    weight1, weight2, value1, value2 = parameter_initialization(len(X_train[0]), len(X_train[0]), 1)
    for i in range(100):
        # 获得对所有训练样本训练迭代一次后的待估参数
        weight1, weight2, value1, value2 = trainning(X_train, Y_train, weight1, weight2, value1, value2)
        print("epoch:%d/100",i+1)
    # 对测试样本进行测试,并且得到正确率
    rate = testing(X_test, Y_test, weight1, weight2, value1, value2)
    print("正确率为%f" % (rate))


if __name__ == '__main__':
    main()

迭代了100次之后的正确率为0.440129

标签:21,质谱,神经网络,bp,weight2,value1,weight1,np,value2
From: https://www.cnblogs.com/jiezstudy/p/17539338.html

相关文章

  • ABP.VNext 数据迁移问题
    1.数据库兼容性问题本地安装的是MySQL5.6的版本,结果一直报"indexcolumnsizetoolarge.themaximumcolumnsizeis767bytes"和数据表一直存在的问题解决办法:卸载5.6,重新安装5.7.9问题解决期间尝试 mysql报indexcolumnsizetoolarge.themaximumcolumnsize......
  • 怎样优雅地增删查改(一):从0开始搭建Volo.Abp项目
    @目录项目介绍模块化由框架实现的需要实现的创建项目创建业务模块配置引用和依赖配置DbContext创建实体和Dto配置AutoMapper软件系统中数据库或者持久层的基本操作功能可以用Curd描述,Curd即增加(Create)、更新(Update)、读取查询(Retrieve)和删除(Delete),这4个单词的首字母。在常见的......
  • 如何实现pso优化神经网络pytorch的具体操作步骤
    PSO优化神经网络(PyTorch)实现流程介绍本文将介绍如何使用粒子群优化(ParticleSwarmOptimization,PSO)算法来优化神经网络模型,并使用PyTorch框架来实现。PSO算法是一种基于群体智能的优化算法,通过模拟鸟群觅食行为,来搜索最优解。在神经网络中,我们可以将待优化的参数作为粒子,利用......
  • Vue + Volo.Abp 实现Auth2.0客户端授权模式认证
    @目录注册ClientAuth2.0授权创建vue-oidc-client创建Auth2.0认证跳转获取令牌创建回调页面创建退出登录最终效果Volo.Abp的身份服务器模块默认使用IdentityServer4实现身份认证。IdentityServer4是一个开源的OpenIDConnect和OAuth2.0框架,它实现了这些规范中的所有必需功能。......
  • Python中os.system()、subprocess.run()、call()、check_output()的用法
    1.os.system()os.system()是对C语言中system()系统函数的封装,允许执行一条命令,并返回退出码(exitcode),命令输出的内容会直接打印到屏幕上,无法直接获取。示例:#test.pyimportosos.system("ls-l|greptest")#允许管道符#测试执行$ll<=======......
  • 深入理解ASEMI整流桥KBP210特性及其应用
    编辑-Z在电子工程领域,整流器是一种重要的元件,它能将交流电(AC)转换为直流电(DC)。其中,整流桥KBP210是一种常见的整流器,因其优秀的性能和广泛的应用,受到了工程师们的青睐。本文将深入探讨整流桥KBP210的特性、工作原理以及应用。 首先,我们来了解一下整流桥KBP210的基本特性。KBP210......
  • 解决画神经网络图 工具的具体操作步骤
    如何实现画神经网络图工具1.概述在本文中,我将指导你如何使用Python编程语言实现一个简单的神经网络图工具。神经网络图是一种用于可视化神经网络结构的图形表示方法,它可以帮助我们更好地理解和调试神经网络模型。2.实现步骤下表列出了实现画神经网络图工具的整个流程,以及每一......
  • 基于vue-cli 5 和webpack 5实现微前端
    有这么一个需求,项目里有很多业务模块,它们都有引用一些公共组件,每个业务模块打包后都是一个独立的应用,当公共组件修改时,单独打包公共组件,其他应用能够不需要重新构建,就能直接使用最新的公共组件,要怎么实现?一开始我想到的是使用网络资源,就是把公共组件打包后的js文件放到服务器,其他......
  • ABP的版本升级,从7.2.2升级到7.2.3
    1、升级ABPCLI见前面的文章:ABP开发需要用到的命令更新最新版本:~~~dotnettoolupdate-gVolo.Abp.Cli~~~2、升级ABPSuite见前面的文章:ABP开发需要用到的命令更新abpsuite~~~abpsuiteupdate~~~第一步和第二步的截图命令行效果如下***********************************......
  • Vue3学习-01_前端工程化与webpack
    背景最近在学习Vue知识,参照的教程是黑马程序员官网提供的免费前端教程,这里记录一下自己的学习笔记以及遇到的相关问题。前端工程化的概念及优点前端工程化指的是:在企业级的前端项目开发中,把前端开发所需的工具、技术、流程、经验等进行规范化、标准化。最终落实到细节上,就是实......