1

Тема: Попарна Евклідова відстань і пам'ять

Отже, маю велику матрицю V zrf ' pd.DataFrame, i містить координати точок в багатомірному просторі pd.DataFrame
Міряю попарну відстань dist = distance.pdist(V, metric='euclidean')
Як зробити так, щоб на виході dist була не float a int, бо ця матриця дуууже багато пам'яті займає?
А діапазон і точність int 4 мені більш ніж достатньо.

2

Re: Попарна Евклідова відстань і пам'ять

Python працює з цілими числами необмеженого розміру, тож про 4-байтне обмеження можете забути. Проблема лише в тому, що при знаходженні квадратного кореня (напр., x**0.5) повертається число з плаваючою комою (яке має обмежену точність і обмежений діапазон значень). Вихід: написати свою функцію для обчислення кореня, що отримуватиме на вході ціле число й повертатиме теж ціле, і використати її у формулі обчислення відстаней.

py -3 -m pip install git+https://github.com/snoack/python-goto
∩⍴○⌈⍴⍺/∧\∨/⊢○ ⌿⍀⍴⌊

3

Re: Попарна Евклідова відстань і пам'ять

P.Y. написав:

Python працює з цілими числами необмеженого розміру, тож про 4-байтне обмеження можете забути. Проблема лише в тому, що при знаходженні квадратного кореня (напр., x**0.5) повертається число з плаваючою комою (яке має обмежену точність і обмежений діапазон значень). Вихід: написати свою функцію для обчислення кореня, що отримуватиме на вході ціле число й повертатиме теж ціле, і використати її у формулі обчислення відстаней.

Я то можу написати, але scipy.spatial.distance.pdist дуже швидко обчислює, я не зможу досягти такого часу.
Тобто питання як в  scipy.spatial.distance.pdist модифікувати обчислення корення і зберігати лише ціле число?

4

Re: Попарна Евклідова відстань і пам'ять

Варіант 1: взяти сирцевий код SciPy, додати туди функцію, що працює, як вам треба, перебудувати і встановити.
Варіант 2: округляти результати, зберігати їх в файл, а потім брати з файла вже округлені.
Варіант 3: розказати нам трохи більше про те, що саме ви робите.

5

Re: Попарна Евклідова відстань і пам'ять

koala написав:

Варіант 2: округляти результати, зберігати їх в файл, а потім брати з файла вже округлені.

На стадії обрахунку в цому рядку

 dist = distance.pdist(V, metric='euclidean')

вискакує Memory error
Тобто зберегти в файл не встигаю.

6

Re: Попарна Евклідова відстань і пам'ять

Розбивайте на шматки і обчислюйте шматки результату за допомогою distance.cdist.

7 Востаннє редагувалося dialectstat (30.11.2015 14:34:32)

Re: Попарна Евклідова відстань і пам'ять

koala написав:

Розбивайте на шматки і обчислюйте шматки результату за допомогою distance.cdist.

Пропонуєте, наприклад, розбити на 4 підматриці, порахувати float відстані, послідовно округлити відстані до int і видалити float відстані?
Як грамотно редукувати з float до int, або до менш точного і широкого float?

8

Re: Попарна Евклідова відстань і пам'ять

Що вам взагалі потрібно від тої матриці? В чому суть задачі? Може її зовсім і не треба всю тримати в пам'яті.

Мій блог про ОС сімейства *nix - http://nixtravelling.blogspot.com/

9

Re: Попарна Евклідова відстань і пам'ять

dialectstat написав:

Як грамотно редукувати з float до int, або до менш точного і широкого float?

int(x) же.
На кшталт

f = open('myfile','w')
for row in arr:
  for x in row:
    f.write(str(int(x))+' ')
  f.write('\n')

або ж без пробілів і \n, і файл робити двійковим.
От щоб збирати окремі квадратики в файл, доведеться трохи більше написати (найлегше - якщо у нас nxn квадратиків, то зберегти nxn файлів з даними окремо, а потім окремою функцією збирати з них єдиний великий файл).