Концепция ранга в J - PullRequest
0 голосов
/ 01 июня 2018

Если у меня есть данные одного измерения, такие как

v1 =: 5 $ i.5
v1
0 1 2 3 4

, то v1 -"1 0 v1 дает мне евклидовы векторы, такие как

v1 -"1 0 v1
 0  1  2  3 4
_1  0  1  2 3
_2 _1  0  1 2
_3 _2 _1  0 1
_4 _3 _2 _1 0

Мы также можем легко найти евклидову матрицу расстояний.

Вот так я нахожу евклидовы векторы и матрицу расстояний двумерного вектора

 v2=: <"1 ? 5 2 $ 10
   v2
┌───┬───┬───┬───┬───┐
│4 0│4 5│5 7│8 3│6 0│
└───┴───┴───┴───┴───┘
direction_vector=: <"1 @: (-"0 @:(-/"2 @: (>"0 @: (diff))))
distance =:     +/"1 @: *: @: (>"2 @:(direction_vector))
m =:        3 : '(i.(#y)) distance"0 _ y'
m v2
 0 25 50 25  4
25  0  5 20 29
50  5  0 25 50
25 20 25  0 13
 4 29 50 13  0

Однако моя проблема заключается в том, что я не уверен, как найти евклидовы векторы и расстояние двумерных данных вразумный и чистый способ

Как видно из таблицы ниже, моему алгоритму потребовалось более 1/3 времени для вычисления векторов направления данных.14,5 секунд - это неплохо, но проблема возникает, когда у меня большой набор данных.

 Time (seconds)
+----------------+------+--------+---------+-----+----+------+
|name            |locale|all     |here     |here%|cum%|rep   |
+----------------+------+--------+---------+-----+----+------+
|direction_vector|base  |6.239582| 5.105430| 35.2| 35 |773040|
|move            |base  |9.741510| 1.753868| 12.1| 47 |  3390|
|script          |base  |1.969949| 1.443148|  9.9| 57 |    18|
|distance        |base  |5.650358| 1.318022|  9.1| 66 |579780|
|enclosestrings  |pcsv  |1.491832| 1.255603|  8.6| 75 |     1|
|diff            |base  |1.134585| 1.134585|  7.8| 83 |773186|
|makedsv         |pcsv  |1.728721| 0.236883|  1.6| 84 |     4|
|norm            |base  |0.221794| 0.221794|  1.5| 86 |  3390|
|xpt             |base  |0.194896| 0.194896|  1.3| 87 |  3390|
|ypt             |base  |0.193579| 0.193579|  1.3| 89 |  3390|
|writedsv        |pcsv  |2.067408| 0.186687|  1.3| 90 |     4|
|cosd            |base  |0.172359| 0.172359|  1.2| 91 |   113|
|[rest]          |      |        | 1.300733|  9.0|100 |      |
|[total]         |      |        |14.517587|100.0|100 |      |
+----------------+------+--------+---------+-----+----+------+

Я думаю, что могу определенно упростить direction_vector, используя ранг, но я застрял.Я пытался "2 1 "1 1 "1 2 "_ 1 "1 0 ..., но никто из них не дал мне четкого результата.

Может кто-нибудь помочь мне в этом вопросе?Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Новый ответ, чтобы я мог правильно отформатировать результат.

Глядя на ваш результат, я думаю, что есть дополнительные возможности для улучшения, по крайней мере, по моим измерениям.Отказ от молчаливого подхода и переход к последовательному применению с изменением + / на + / "1 примерно вдвое увеличивает скорость.

   [ v2=: 5 2 $ 4 0 4 5 5 7 8 3 6 0
4 0
4 5
5 7
8 3
6 0
   (10000) 6!:2 '+/@:*:@:-"1/~ v2'
8.4647e_6
   (10000) 6!:2 '+/"1 *: -"1/~ v2'
3.1289e_6
      (+/"1 *: -"1/~ v2) -: (+/@:*:@:-"1/~ v2)
1
   +/"1 *: -"1/~ v2
 0 25 50 25  4
25  0  5 20 29
50  5  0 25 50
25 20 25  0 13
 4 29 50 13  0
0 голосов
/ 02 июня 2018

Я бы начал с того, что заметил, что v2 u/ v2 составляет таблицу из элементов v2, применяя u между этими элементами.Кроме того, вы можете немного упростить это, используя u/~ v2, что совпадает с v2 u/ v2.Следующий вопрос - что такое u, но перед тем, как мы пойдем туда, бокс действительно замедляет ход событий, и вам на самом деле не нужно помещать вектор в коробку, чтобы это работало, поскольку элементы уже можно записать так:

   [ v2=: 5 2 $ 4 0 4 5 5 7 8 3 6 0
4 0
4 5
5 7
8 3
6 0

и это делает элементы векторами, что вы хотите использовать u/~ v2

Теперь вернемся к вопросу о том, что мы хотим u.Мы собираемся работать над элементами v2 Так как u подается в элементы v2 для создания таблицы, вы хотите вычесть элементы друг из друга как векторы (ранг 1), а затем возвести в квадратих, а затем сложите их вместе.Если перевести это в J, вы получите +/@:*:@:-"1 как u

    +/@:*:@:-"1/~ v2
 0 25 50 25  4
25  0  5 20 29
50  5  0 25 50
25 20 25  0 13
 4 29 50 13  0

Если вы рассчитываете это время, я надеюсь, что вы найдете его намного быстрее, чем ваше решение, потому что оно не требует бокса.Ключевой областью, которая вас беспокоила в отношении ранга, было его применение после наречий таблицы /

Надеюсь, что это поможет, хотя это немного другой подход, и дайте мне знать, как выглядит ваше время.

...