疑问:是否有必要normalize?(待解决)
import math
import numpy as np
import pandas as pd
import torch
from matplotlib import pyplot as plt
from shapesimilarity import shape_similarity, procrustes_normalize_curve, find_procrustes_rotation_angle, rotate_curve, \
frechet_distance, curve_length, euclidean_distance
from torch import sigmoid
def curve_length_mine(curve):
'''
Args:
points: type arrays two values [[x, y], [x, y]]
Returns:
acc_length: curve length
Descriptions:
Calculate the length of the curve
'''
acc_length = 0
for i in range(0, len(curve) - 1):
acc_length += euclidean_distance(curve[i], curve[i + 1])
return acc_length
def normalize(arr, t_min, t_max):
norm_arr = []
diff = t_max - t_min
diff_arr = max(arr) - min(arr)
for i in arr:
temp = (((i - min(arr)) * diff) / diff_arr) + t_min
norm_arr.append(temp)
return norm_arr
def Frechet(CarA, CarB):
return shape_similarity(CarA, CarB)
def DTWDistance(s1, s2):
DTW = {}
for i in range(len(s1)):
DTW[(i, -1)] = float('inf')
for i in range(len(s2)):
DTW[(-1, i)] = float('inf')
DTW[(-1, -1)] = 0
for i in range(len(s1)):
for j in range(len(s2)):
dist = (s1[i] - s2[j]) ** 2
DTW[(i, j)] = dist + min(DTW[(i - 1, j)], DTW[(i, j - 1)], DTW[(i - 1, j - 1)])
return np.sqrt(DTW[len(s1) - 1, len(s2) - 1])
def get_data(path):
df = pd.read_excel(path, header=None)
df = df.iloc[:, [i % step == 0 for i in range(len(df.columns))]]
data = df.values
data = data.reshape(2, -1)
range_to_normalize = (minn, maxx)
return data.T
def getpath(scen, tra):
return "../track/Scen" + str(scen) + "Tra" + str(tra) + ".xlsx"
def move(data, data2):
dx = data2[0][0] - data[0][0]
dy = data2[0][1] - data[0][1]
for i in range(0, int(data.shape[1])):
data[i][0] += dx
data[i][1] += dy
return data, data2
def print_similarity_graph():
for i in range(1, 3):
for j in range(1, 4):
for k in range(1, 4):
if j >= k:
continue
path1 = getpath(i, j)
path2 = getpath(i, k)
data = get_data(path1)
print(data)
data2 = get_data(path2)
plt.plot(data[:, 0], data[:, 1], 'D:', color="red", linewidth=2.0)
plt.plot(data2[:, 0], data2[:, 1], 'D:', color="blue", linewidth=2.0)
similarity = Frechet(data, data2)
plt.title(f'scen{i} Car{j} and Car{k}\'s similarity is: {similarity}', fontsize=14, fontweight='bold')
plt.show()
step = 50
minn = 0
maxx = 3
print_similarity_graph()