Чета набори от данни от файл в numpy
масиви като този:
def read_data(filename):
data = np.empty(shape=[0, 65], dtype=int)
with open(filename) as f:
for line in f:
data = np.vstack((data, np.array(list(map(int, line.split(','))), dtype=int)))
return data
Използвам numpy
за изчисляване на евклидовото разстояние между два списъка:
def euclidean_distance(x, z):
return np.linalg.norm(x-z)
След това изчислявам евклидовите разстояния по следния начин:
for data in testing_data:
for data2 in training_data:
dist = euclidean_distance(data, data2)
Проблемът ми е, че този код работи много бавно, отнема около ~10 минути, за да завърши. Как мога да подобря това, какво пропускам?
Трябва да използвам разстоянията в друг алгоритъм, така че скоростта е много важна.
N
иM
са размера наtesting_data
&training_data
респ. Така че зависи колко големи са и двата набора от данни.. - person kmario23   schedule 06.05.2019list
и просто да използвамеnp.fromiter(map(int, line.split(',')))
, въпреки че мисля, че може да не даде толкова подобрение. Друго нещо може да е да се отървете от функциятаeuclidean_distance()
и да вградите кода директно, тъй като е само един ред. Може да даде малък тласък, тъй като избягваме 6,8 милиона извиквания на функции - person kmario23   schedule 06.05.2019cdist
, както и ръчно внедряване с помощта наnumpy.linalg.norm
и не наблюдавах голяма разлика по отношение на скоростта. - person kmario23   schedule 06.05.2019cdist
и работи за 2 секунди и ако подобря кода си, както казахте @kmario23, отнема същото време като преди. Не искам да използвамcdist
, защото това създава матрица. Как е възможно? - person Fogarasi Norbert   schedule 06.05.2019