Функция главного компонента

Я пытался использовать функцию principal-components из Incanter для выполнения PCA и, похоже, не использовал ее. Я нашел несколько примеров данных в Интернете из учебника по PCA и хотел попрактиковаться на них:

(def data [[0.69 0.49] [-1.31 -1.21] [0.39 0.99] [0.09 0.29] [1.29 1.09] 
           [0.49 0.79] [0.19 (- 0 0.31)] [(- 0 0.81) (- 0 0.81)] 
           [(- 0 0.31) (- 0 0.31)] [(- 0 0.71) (- 0 1.01)]])

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

Как мне превратить data в матрицу (Incanter), чтобы она была принята в качестве входных данных в функцию Incanter principal-components. Для простоты назовем новую матрицу fooMatrix.

После создания этой матрицы fooMatrix следующий код должен работать для извлечения первых двух основных компонентов.

     (def pca (principal-components fooMatrix))
     (def components (:rotation pca))
     (def pc1 (sel components :cols 0))
     (def pc2 (sel components :cols 1)) 

а затем данные могут быть спроецированы на главные компоненты с помощью

     (def principal1 (mmult fooMatrix pc1)) 
     (def principal2 (mmult fooMatrix pc2))

person sunspots    schedule 26.03.2014    source источник
comment
Вы, кажется, не задаете вопрос. По этой ссылке обсуждается использование PCA через Incanter, а внизу поста есть ссылка на весь исходный код используется.   -  person galdre    schedule 27.03.2014
comment
Чего я не понимаю, так это того, как преобразовать векторы, содержащиеся в data, в матрицу, которую может использовать функция Incanter principal-component.@galdre   -  person sunspots    schedule 27.03.2014
comment
Я изменил свой первоначальный пост, чтобы вопрос был явным, спасибо.   -  person sunspots    schedule 27.03.2014


Ответы (1)


Ознакомьтесь с Incanter API. Я считаю, что вы просто хотите (incanter.core/matrix data). Это ваши варианты матричной функции Инкантера. Возможно, A2 — это то, что вас интересует.

(def A (matrix [[1 2 3] [4 5 6] [7 8 9]])) ; produces a 3x3 matrix
(def A2 (matrix [1 2 3 4 5 6 7 8 9] 3)) ; produces the same 3x3 matrix
(def B (matrix [1 2 3 4 5 6 7 8 9])) ; produces a 9x1 column vector

Пример использования ваших данных:

user=> (use '[incanter core stats charts datasets])
nil
user=>(def data [0.69 0.49 -1.31 -1.21 0.39 0.99 0.09 0.29 1.29
                1.09 0.49 0.79 0.19 (- 0 0.31) (- 0 0.81) (- 0 0.81)
                (- 0 0.31) (- 0 0.31) (- 0 0.71) (- 0 1.01)])
user=>(def fooMatrix (matrix data 2))
user=>(principal-components fooMatrix)
{:std-dev (1.3877785387777999 0.27215937850413047), :rotation  A 2x2 matrix
 -------------
-7.07e-01 -7.07e-01 
-7.07e-01  7.07e-01 
}

Вуаля. Вложенная векторная структура исчезла.

person galdre    schedule 27.03.2014
comment
A2 это то, что мне нужно для построения матрицы - person sunspots; 27.03.2014