波比较函数
使用了局部贪心算法加横向损失. 目前我认为是最好的时序比较函数.
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