Skip to content

Commit 5f1793a

Browse files
Merge pull request #7 from annaformaniuk/similarity_and_generalization
- Use of track similarity measures with generalized tracks - Change of matrix order (organized by "global" similarity") - Change of input for similarity measures (from vector or trajectories to trajectoryCollections)
2 parents d069d87 + 0c7c8ee commit 5f1793a

File tree

3 files changed

+3789
-73
lines changed

3 files changed

+3789
-73
lines changed

envirocar/__init__.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
from .client.request_param import BboxSelector, TimeSelector
55
from .trajectories.preprocessing import Preprocessing
66
from .trajectories.track_converter import TrackConverter
7-
from .trajectories.track_similarity import TrackSimilarity
87
from .trajectories.visualisation import Visualiser
98
from .trajectories.track_generalizer import MinDistanceGeneralizer, MaxDistanceGeneralizer, DouglasPeuckerGeneralizer
10-
from .trajectories.track_similarity import *
9+
from .trajectories.track_similarity import *

envirocar/trajectories/track_similarity.py

+56-27
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,6 @@ def track_similarity(trajA, trajB, method):
3131
similarity. Values close to 1 correspond to high similarity
3232
"""
3333

34-
# trajA_id = trajA.df['track.id'].unique()[0]
35-
# trajB_id = trajB.df['track.id'].unique()[0]
36-
37-
# print("Similarity between Track",trajA_id, "& Track",trajB_id,"using",
38-
# str(method),"method:")
39-
4034
methods = ['pcm', 'frechet_dist', 'area_between_two_curves',
4135
'curve_length_measure', 'dtw']
4236

@@ -61,9 +55,34 @@ def track_similarity(trajA, trajB, method):
6155
else:
6256
similarity = 1/(1+similarity_method(trajA_np, trajB_np))
6357
return similarity
58+
59+
def trajCollections_similarity(trajCollectionA,trajCollectionB,method):
60+
61+
n=len(trajCollectionA.trajectories)
62+
m=len(trajCollectionB.trajectories)
63+
64+
if(n != m):
65+
raise RuntimeError('Trajectory collections should be the same size !')
6466

67+
traj1_name = []
68+
traj2_name = []
69+
similarity = []
70+
71+
for i in range(n):
72+
73+
traj=trajCollectionA.trajectories[i]
74+
gen_traj=trajCollectionB.trajectories[i]
75+
76+
traj1_name.append(traj.df['track.id'].unique()[0])
77+
traj2_name.append(gen_traj.df['track.id'].unique()[0])
78+
simi = track_similarity(traj,gen_traj, method)
79+
similarity.append(simi)
80+
81+
df = pd.DataFrame(list(zip(traj1_name, traj2_name, similarity)),
82+
columns=['Trajectory_1', 'Trajectory_2', 'Similarity'])
83+
return(df)
6584

66-
def crossed_similarity(list_traj, method):
85+
def crossed_similarity(trajCollection, method):
6786

6887
""" Compute similarity measures of a list of trajectories
6988
@@ -80,14 +99,19 @@ def crossed_similarity(list_traj, method):
8099
81100
df{dataframe} -- Dataframe with summary of similarity
82101
measuresof all posible combinations from
83-
the trajectory list (list_traj)
102+
the trajectory list (list_traj)
103+
84104
"""
85105

86-
n = (len(list_traj))
87-
106+
n = (len(trajCollection.trajectories))
107+
88108
if(n <= 1):
89109
raise RuntimeError('More than 1 trajectory is required')
90-
110+
111+
trajVector=[]
112+
for i in (trajCollection.trajectories):
113+
trajVector.append(i)
114+
91115
number_comb = factorial(n)/(factorial(n-2)*factorial(2))
92116

93117
start = timer()
@@ -96,7 +120,7 @@ def crossed_similarity(list_traj, method):
96120
similarity = []
97121
i = 0
98122

99-
for combo in combinations(list_traj, 2):
123+
for combo in combinations(trajVector, 2):
100124
traj1_name.append(combo[0].df['track.id'].unique()[0])
101125
traj2_name.append(combo[1].df['track.id'].unique()[0])
102126
simi = track_similarity(combo[0], combo[1], method)
@@ -106,16 +130,24 @@ def crossed_similarity(list_traj, method):
106130
if (i % 10 == 0 or i == number_comb):
107131
print(round(i/number_comb*100, 1), "% of ", "calculations", sep='',
108132
end='\r')
109-
133+
110134
df = pd.DataFrame(list(zip(traj1_name, traj2_name, similarity)),
111-
columns=['Trajectory_1', 'Trajectory_2', 'Correlation'])
112-
df = df.sort_values(by=['Correlation'], ascending=False
135+
columns=['Trajectory_1', 'Trajectory_2', 'Similarity'])
136+
137+
df_2 = pd.DataFrame(list(zip(traj2_name, traj1_name, similarity)),
138+
columns=['Trajectory_1', 'Trajectory_2', 'Similarity'])
139+
140+
frames = [df, df_2]
141+
142+
df = pd.concat(frames, ignore_index=True)
143+
144+
df = df.sort_values(by=['Similarity'], ascending=False
113145
).reset_index(drop=True)
114-
115146
end = timer()
116147
time = end-start
117148

118149
print("\n%s similarity measures in %0.2f seconds" % (i, time))
150+
119151
return(df)
120152

121153

@@ -139,17 +171,14 @@ def get_similarity_matrix(df):
139171
similarity_diagonal = [1] * number_uniqtraj
140172
df_diagonal = pd.DataFrame(list(zip(uniq_traj, uniq_traj,
141173
similarity_diagonal)), columns=['Trajectory_1',
142-
'Trajectory_2', 'Correlation'])
174+
'Trajectory_2', 'Similarity'])
143175
frames = [df, df_diagonal]
144176
df = pd.concat(frames, ignore_index=True)
145177

146-
df = df.sort_values(by=['Correlation'], ascending=False).reset_index(
178+
df = df.sort_values(by=['Similarity'], ascending=False).reset_index(
147179
drop=True)
148-
df = df.pivot(index='Trajectory_1', columns='Trajectory_2',
149-
values='Correlation').copy()
150-
151-
df = df.transpose().fillna(0)+df.fillna(0)
152-
df = df.replace(2, 1)
180+
181+
df = df.pivot(index='Trajectory_1', columns='Trajectory_2',values='Similarity').copy()
153182

154183
return(df)
155184

@@ -162,10 +191,10 @@ def plot_similarity_matrix(df_similarity_matrix, title):
162191
df{dataframe} -- Similarity matrix of trajectories
163192
"""
164193

165-
sum_corr = list(df_similarity_matrix.sum().sort_values(
166-
ascending=True).index.values)
167-
df = df_similarity_matrix.sort_values(by=sum_corr).sort_index(
168-
axis=0, level=sum_corr)
194+
sum_corr = list(df_similarity_matrix.sum().sort_values(ascending=True).index.values)
195+
df_similarity_matrix=df_similarity_matrix[sum_corr]
196+
df=df_similarity_matrix.reindex(sum_corr)
197+
169198
f = plt.figure(figsize=(19, 15))
170199
plt.matshow(df, fignum=f.number)
171200
plt.title(title, y=1.2, fontsize=25)

0 commit comments

Comments
 (0)