独热码one-hot code

      1.独热码概念     

       独热码,在英文文献中称做 one-hot code, 直观来说就是有多少个状态就有多少比特,而且只有一个比特为1,其他全为0的一种码制。通常,在通信网络协议栈中,使用八位或者十六位状态的独热码,且系统占用其中一个状态码,余下的可以供用户使用。

       例如,有6个状态的独热码状态编码为:000001,000010,000100,001000,010000,100000。

再如,有十六个状态的独热码状态编码应该是:0000000000000001,0000000000000010,0000000000000100,0000000000001000,0000000000010000,0000000000100000 ,……,10000000000000000。但是通常我们为了方便书写,将二进制简化为十六进制表示(从右往左每四位二进制位用一位十六进制数表示),那么,以上十六状态的独热码可以表示成0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, ……, 0x8000(其中的0x是十六进制的前缀表示,在诸如PLC等程序中也有其他表示方法)。
2.码制和数制
码制和数制不一样。制,是表示“方法”:码制就是编码方法;数制,就是计数方法。
编码可以表示任何人为赋予的含义,可以是逻辑的,也可以是非逻辑的,编码没有大小之分,也可称作代码。 编码没有位权,或者说每位是平等的,每个位上数字比较大小是没有意义的。数码(编码)就是利用数字或字母来做记号的一串编码或者指其中某位编码数。这里应该注意,编码对应的数字其值也可以是有大小的数或者其他量。
数制,也称计数制度,计数方法(注意这里计数不是记数),数有大小之分,每一位有权重。常见的数制有:二进制,十进制,十六进制,六十进制等。
利用某种特定数制形式来编码,称作某进制编码,但是这个编码并不一定等同于该进制的数(计数)。二进制编码也可称连续编码,也就是码元值的大小是连续变化的,逢二进一。比如000,001,010,011,100,101。
数和码也有联系,通常用在数字逻辑中的码制有,格雷码(就是两个码之间只差1位不同,000,001,011,010,110,100)、BCD码、8421BCD码、余三码、ASCII码等。
3. Binary(二进制编码)、gray-code(格雷码)和one-hot(独热码)编码对比

二进制编码、格雷码编码使用最少的触发器,消耗较多的组合逻辑,而独热码编码反之。独热码编码的最大优势在于状态比较时仅仅需要比较一个位,从而一定程度上简化了译码逻辑。虽然在需要表示同样的状态数时,独热编码占用较多的位,也就是消耗较多的触发器,但这些额外触发器占用的面积可与译码电路省下来的面积相抵消。

Binary(二进制编码)、gray-code(格雷码)编码使用最少的触发器,较多的组合逻辑,而one-hot(独热码)编码反之。one-hot 编码的最大优势在于状态比较时仅仅需要比较一个bit,一定程度上从而简化了比较逻辑,减少了毛 刺产生的概率。由于CPLD更多地提供组合逻辑资源,而FPGA更多地提供触 发器资源,所以CPLD多使用gray-code,而FPGA多使用one-hot编码。另一 方面,对于小型设计使用gray-code和binary编码更有效,而大型状态机使用 one-hot更高效。


在Python中,我们可以使用pandas库来处理CSV文件,并结合numpy库进行one-hot编码。首先,确保已安装了这两个库,如果未安装,可以使用pip install pandas numpy命令进行安装。 以下是完成这个任务的代码示例: ```python import pandas as pd import numpy as np # 加载数据 data = pd.read_csv('peptide.csv') # 获取所有不同的氨基酸种类 unique_amino_acids = data['amino_acid'].unique() # 初始化一个20行(对应20种最常见的氨基酸)、33列(假设最多有33个位置)的零矩阵 encoded_matrix = np.zeros((len(unique_amino_acids), 33)) # 将one-hot编码应用到每条肽链上 for index, row in data.iterrows(): amino_acid_code = row['amino_acid'] position = row['position'] # 确保索引在有效范围内 if amino_acid_code < len(encoded_matrix): encoded_matrix[amino_acid_code, position - 1] = 1 # 减一是因为数组索引从0开始计数 # 防止所有元素为1或0的情况,加入一些随机噪声 (这里仅为演示,实际项目中可能会选择其他方式) np.random.seed(42) # 设置随机种子为了保持结果一致 noise_level = 0.01 encoded_matrix += noise_level * (np.random.rand(*encoded_matrix.shape) - 0.5) # 输出编码后的矩阵 print(encoded_matrix) ``` 请注意,这段代码假设'peptide.csv'文件的第一列是氨基酸类型,第二列是位置。如果实际情况不同,请根据实际列名进行调整。同时,这里的`20`和`33`是假设值,你需要根据实际数据更新它们。最后部分添加随机噪声是为了满足“不全为1或0”的条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值