DL | Embedded Reber Grammar原理简述及一种python实现

1. Reber Grammar

在这里插入图片描述
如上图所示,它基本是个‘有环的有向图’。从B开始经过各种可能的有向边(所代表的字母)到达E组成的字符串,就是满足Reber Grammar的字符串。例如 BTSXSE,BPTVVE等。

2. Embedded Reber Grammar

在这里插入图片描述
把满足Reber Grammar的字符串Embed到一定的格式中得到的字符串满足Embedded Reber Grammar,有两种格式。

上图中的上方的路径的格式:
在这里插入图片描述
上图中的下方的路径的格式:
在这里插入图片描述
例如BTBTSXSETE或BPBTSXSEPE都是满足Embedded Reber Grammar的。

如果要判断字符串满足Embedded Reber Grammar,需要确定第二个字母和倒数第二个字母相同。对于一个学习模型,需要有某种记忆(第2个字母和倒数第2个字母相同)才能正确判断一个字符串是否满足Embedded Reber Grammar。如下图格式则不满足
在这里插入图片描述

3. Embedded Reber Grammar代码实现

下面的代码是计算n个满足Embedded Reber Grammar的字符串,基本思路就是用dict来刻画Reber Grammar图中边的前后关系,遇到多个后续的边可以选择的时候,用均匀概率来随机选取。

import random
import pandas as pd
import numpy as np

def ReberGrammar(n):
    '''
    :param n:
        how many reber string to generate
    :return:
        a list of unembedded reber strings
    '''
    graph={"B":["T1","P1"],
             "T1":["S1","X1"],
             "P1":["T1","V1"],
             "S1":["S1","X1"],
             "T2":["T2","V1"],
             "X1":["X2","S2"],
             "X2":["T2","V1"],
             "V1":["P2","V2"],
             "P2":["X2","S2"],
             "S2":["E"],
             "V2":["E"],
             "E":["end"]}
    rebers=[]
    for i in range(n):
        str_i=""
        edge_ = "B"
        while edge_ != "end":
            str_i+=edge_[0]
            sub_edge_=graph[edge_]
            edge_=random.sample(sub_edge_,1)[0]
        rebers.append(str_i)
    return(rebers)

def EmbeddedReberGrammar(rebers):
    '''
    :param rebers:
        unembedded reber strings
    :return:
        embedded reber strings
    '''
    newRebers=[]
    for _,str_ in enumerate(rebers):
        type=random.randint(0,1)
        if type==0:
            newRebers.append("BT"+str_+"TE")
        else:
            newRebers.append("BP"+str_+"PE")
    return(newRebers)

4. illegal Embedded Reber Grammar代码实现

用一个机器学习模型来判断一个字符串是否满足Embedded Reber Grammar时,需要一些不满足该法则的字符串作为负样本。
这个实现方法有很多,我用的方法是:
(1)0.5的概率篡改第2个字母,P改成T或者T改成P;
(2)0.5的概率篡改第3个~倒数第3个字母中的随机的一个,改成不合法的一个。

def illegalReberGrammarString(rebers):
    '''
    :param rebers:
        a list of legal reber strings
    :return:
        a list of illegal reber strings
    '''
    graph={"B":["T1","P1"],
             "T1":["S1","X1"],
             "P1":["T1","V1"],
             "S1":["S1","X1"],
             "T2":["T2","V1"],
             "X1":["X2","S2"],
             "X2":["T2","V1"],
             "V1":["P2","V2"],
             "P2":["X2","S2"],
             "S2":["E"],
             "V2":["E"],
             "E":["end"]}
    all_edges=["B","T","P","S","X","V","E"]
    illegalRebers=[]
    for i in range(len(rebers)):
        str_i=rebers[i]
        type=random.randint(0,1)
        if type==0:
            if str_i[1]=="P":
                str_i=str_i[0]+"T"+str_i[2:]
            else:
                str_i=str_i[0]+"P"+str_i[2:]
            illegalRebers.append(str_i)
        if type==1:
            L=len(str_i)
            edge_index=random.sample(range(2,L-2),1)[0]
            edge_=str_i[edge_index]
            if edge_ in ["B","E"]:
                sub_edge_=["P","T"]
            else:
                sub_edge_=graph[edge_+"1"]+graph[edge_+"2"]
            wrong_edge_=set(all_edges)-set([_[0] for _ in sub_edge_])
            replace=random.sample(wrong_edge_,1)[0]
            str_i=str_i[0:edge_index]+replace+str_i[edge_index+1:]
            illegalRebers.append(str_i)
    return(illegalRebers)

以下代码为生成一个csv文件:
第1列为标签y:1表示满足,0表示不满足;
第2列为是否满足Embed Reber Grammer的字符串x;

num=5000
####生成 num 个 Reber Grammar String
rebers=ReberGrammar(num)
####将Reber Grammar String嵌入格式中
embeddedRebers=EmbeddedReberGrammar(rebers)
####根据篡改规则,生成num个illegal Embed Reber Grammer
illegalRebers=illegalReberGrammarString(embeddedRebers)
####生成dataframe,写入csv
labels=[1]*num+[0]*num
strings=embeddedRebers+illegalRebers
####
index=np.random.permutation(2*num)

df=pd.DataFrame()
df['y']=labels
df['x']=strings
df=df.iloc[index,:]
df.to_csv('chapter14/reberStings.csv',index=0)

5. 参考资料

一个简洁的说明网页

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab二维查表原理: 二维查表是一种常见的数据处理方式,可以通过查表的方式快速地获取数据。在Matlab中,可以通过使用二维数组来实现二维查表。以一个简单的例子来说明二维查表的原理: 假设有一个二维数组A,其中包含一些数据,如下所示: A = [1 2 3; 4 5 6; 7 8 9]; 现在我们需要查找A中第2行第3列的数据,即6。可以使用A(2,3)来获取这个数据。这个过程就是一个简单的二维查表。 Simulink一维查表功能实现: Simulink中提供了一维查表的功能,可以通过使用Lookup Table块来实现一维查表。下面是一维查表的实现步骤: 1. 创建一个Lookup Table块,并将其输出端口连接到需要进行查表操作的模块。 2. 在Lookup Table块中设置查表数据。可以手动输入查表数据,也可以通过读取外部文件来获取查表数据。 3. 设置输入端口类型和数值范围。 4. 设置输出端口类型和数值范围。 5. 在模拟过程中输入相应的数据,Lookup Table块会自动输出查表结果。 代码生成: Simulink中的一维查表功能可以通过使用Embedded Coder进行代码生成。生成的代码可以直接在嵌入式系统中运行。下面是代码生成的实现步骤: 1. 在Simulink中创建查表模块,并设置查表数据和输入输出端口。 2. 在Embedded Coder中设置代码生成选项,包括目标硬件和编译器信息等。 3. 进行代码生成,生成的代码可以直接在目标硬件上运行。 以上就是Matlab二维查表原理、Simulink一维查表功能实现以及代码生成的相关介绍,希望对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值