Подтвердить что ты не робот

Псевдо-код алгоритма произвольной проекции

Я пытаюсь применить метод Random Projections на очень редком наборе данных. Я нашел статьи и учебные пособия по методу Джонсона Линденштрауса, но каждый из них полон уравнений, которые не дают мне значимых объяснений. Например, этот документ на Johnson-Lindenstrauss

К сожалению, из этого документа я не понимаю понятия о шагах реализации алгоритма. Это длинный выстрел, но есть ли кто-нибудь, кто может рассказать мне простую английскую версию или очень простой псевдокод алгоритма? Или где я могу начать копать эти уравнения? Какие-либо предложения?

Например, то, что я понимаю из алгоритма, прочитав эту статью, касающуюся Johnson-Lindenstrauss, заключается в следующем:

  • Предположим, что мы имеем матрицу AxB, где A - количество выборок, а B - количество измерений, например. 100x5000. И я хочу уменьшить его размер до 500, что даст матрицу 100x500.

Насколько я понимаю: во-первых, мне нужно построить матрицу 100x500 и случайным образом заполнить записи с помощью +1 и -1 (с вероятностью 50%).

Edit:
Ладно, я думаю, что начал это делать. Итак, мы имеем матрицу A, которая равна mxn. Мы хотим уменьшить его до E, который равен mxk.

Нам нужно построить матрицу R с размером nxk и заполнить ее 0, -1 или +1 по отношению к 2/3, 1/6 и 1/6.

После построения этого R мы просто выполним матричное умножение AxR, чтобы найти нашу приведенную матрицу E. Но нам не нужно делать полное матричное умножение, потому что если элемент Ri равен 0, нам не нужно делать вычисления. Просто пропустите это. Но если мы сталкиваемся с 1, мы просто добавляем столбец или, если он -1, просто вычтем его из расчета. Поэтому мы просто будем использовать суммирование, а не умножение, чтобы найти E. И это делает этот метод очень быстрым.

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

4b9b3361

Ответ 1

Отображение из высокоразмерных данных A в низкоразмерные данные E приведено в формулировке теоремы 1.1 в последней статье - это просто скалярное умножение, за которым следует матричное умножение. Векторы данных представляют собой строки матриц A и E. Как указывает автор в разделе 7.1, вам не нужно использовать алгоритм полного матричного умножения.

Ответ 2

У вас есть идея. Однако, поскольку я понимаю случайный проект, строки вашей матрицы R должны иметь единицу длины. Я считаю, что примерно то, что нормализуется на 1/sqrt (k), для нормализации того факта, что они не являются единичными векторами.

Это не проекция, а почти проекция; Строки R не являются ортонормированными, но в гораздо более высокомерном пространстве они довольно близки. Фактически, точечный продукт любых двух из тех векторов, которые вы выберете, будет довольно близок к 0. Именно поэтому он является в целом хорошим приближением к фактическому нахождению правильной основы для проекции.

Ответ 3

Если ваш набор данных разрежен, то разреженные случайные прогнозы не будут работать хорошо. У вас есть несколько вариантов:

Вариант A:

Шаг 1. примените структурированную плотную случайную проекцию (обычно используется так называемое быстрое преобразование адамара). Это специальная проекция, которая очень быстро вычисляется, но в остальном имеет свойства нормальной плотной случайной проекции

Шаг 2. примените разреженную проекцию на "уплотненные данные" (разреженные случайные прогнозы полезны только для плотных данных)

Вариант B: Примените SVD к разреженным данным. Если данные разреженные, но имеет некоторую структуру SVD. Случайная проекция сохраняет расстояния между всеми точками. SVD лучше сохраняет расстояния между плотными областями - на практике это более значимо. Также люди используют случайные прогнозы для вычисления SVD на огромных наборах данных. Случайные прогнозы дают вам эффективность, но не обязательно лучшее качество встраивания в малый размер.  Если ваши данные не имеют структуры, используйте случайные прогнозы.

Вариант C:

Для точек данных, для которых SVD имеет небольшую ошибку, используйте SVD; для остальных точек используйте Random Projection

Вариант D: Используйте случайную проекцию на основе самих данных. Это очень легко понять, что происходит. Это выглядит примерно так:

create a n by k matrix (n number of data point, k new dimension)
for i from 0 to k do #generate k random projection vectors  
   randomized_combination = feature vector of zeros (number of zeros = number of features) 
   sample_point_ids = select a sample of point ids
   for each point_id in sample_point_ids do:
       random_sign = +1/-1 with prob. 1/2
       randomized_combination += random_sign*feature_vector[point_id] #this is a vector operation
    normalize the randomized combination
    #note that the normal random projection is:
    # randomized_combination = [+/-1, +/-1, ...] (k +/-1; if you want sparse randomly set a fraction to 0; also good to normalize by length]
    to project the data points on this random feature just do
    for each data point_id in dataset:
        scores[point_id, j] = dot_product(feature_vector[point_id], randomized_feature)

Если вы все еще хотите решить эту проблему, напишите здесь сообщение, я могу дать вам больше псевдокодов.

Способ думать об этом заключается в том, что случайная проекция - это всего лишь случайный шаблон, а точечный продукт (т.е. проецирование точки данных) между точкой данных и шаблоном дает вам перекрытие между ними. Поэтому, если две точки данных перекрываются со многими случайными шаблонами, эти точки похожи. Поэтому случайные проекции сохраняют сходство при использовании меньшего пространства, но также добавляют случайные флуктуации в попарно сходствах. Что говорит JLT, так это то, что для флуктуаций 0.1 (eps) вам нужно около 100 * log (n) измерений.

Удачи!

Ответ 4

Пакет R для выполнения случайной проекции с использованием леммы Джонсона-Линденштрауса RandPro