波比较函数

使用了局部贪心算法加横向损失. 目前我认为是最好的时序比较函数.

def jisuan_diff(b,m):
  global cnt
  '''
  b,m是时序数列, 可以看做波的采集数字信号.
  b是被比配的波
  m是模板波.
  我们输出的结果是拿模板上每一个采集点去找b上对应的位置.
  模板上的采集点都对应结束之后,我们的计算就结束.这个逻辑能保证模板上所有的特征都进行了比较.我们用这个diff值来表示b和m的相似度.
   
  我们规定输入的b和m的 索引0位置互相对应上,这点需要在波b和波m输入
到这个函数之前预处理掉.否则起点在函数内部用逻辑遍历太过复杂不适合函数处理.
所以我们后续点都匹配上即可.
  '''
  maxy=max(max(b),max(m))
  maxx=max(len(b),len(m))
  changdu=0 # 横坐标的偏移 产生的diff
  gaodu=0  # 纵坐标的偏移 产生的diff
  kaishi=1
  saving=0
  jilu=0 # 记录上一个匹配成功的位置.
  saving_forpic=[0]
  for i in range(1,len(m)): # 模板第0个,跟被查数组0个假设已经对齐, 从索引1开始对齐.


      chagndu=7  # ========搜索范围超参数. 对于点多的也设置大一点.

      tmpjuli=float('inf')
      
      for j in range(kaishi,kaishi+chagndu+1):
       if j<len(b):
        gaodu=abs(m[i]-b[j])
        if i!=1:
          changdu=(abs(abs(j-kaishi)-1))*1
        diff=(gaodu/maxy)**2+(changdu/maxx)**2
        if diff<tmpjuli:
          tmpjuli=diff
          jilu=j

      # 加上横坐标偏移惩罚: 移动一个格作为0惩罚.
      # tmpjuli+=abs(jilu-kaishi-1)
      kaishi=jilu
      saving_forpic.append(jilu)
      # print(i,jilu,tmpjuli,kaishi)
      saving+=tmpjuli
  debugpic=1
  chaju=(saving+abs(b[0]-m[0]))/len(m)
  if debugpic:
    import matplotlib.pyplot as plt
    import matplotlib.pyplot as plt
    plt.clf()
    plt.rcParams["font.sans-serif"]=["SimHei"]
    plt.rcParams["axes.unicode_minus"]=False

    # plt.plot(m,c='r',label='模板')
    plt.scatter(range(len(m)),m,c='r',label='模板',s=1)
    # plt.plot(b,c='g',label='信号')
    plt.scatter(range(len(b)),b,c='g',label='信号',s=1)
    plt.text(50,4000,f"差距是:{chaju}",horizontalalignment='center',verticalalignment='top',)
    # change x internal size
    # plt.gcf().subplots_adjust(left=margin, right=1. - margin)
    # print(plt.gcf().get_size_inches()[0])
    # print(plt.gcf().get_size_inches()[1])
    #========图片横坐标放大2被.
    plt.gcf().set_size_inches(plt.gcf().get_size_inches()[0]*1.2, plt.gcf().get_size_inches()[1])


#==========加上各个点的折线:
    for dex,itm in enumerate(saving_forpic):
      plt.plot([dex,itm],[m[dex],b[itm]],linewidth=0.2,c='b')
      # break

    plt.legend()
    plt.savefig(f'debuggg{cnt}.png')

  print(f'第{cnt}个')
  cnt+=1

  return chaju

image

image

image

image

image

posted on 2024-03-02 09:36  张博的博客  阅读(14)  评论(0编辑  收藏  举报

导航