Получение матрицы среднего и ковариации из массива в clojure с использованием incanter

Я пытаюсь получить среднее значение массива и ковариационную матрицу из структуры данных, которая 1000x2, используя incanter.

Мой тестовый пример выглядит так

(ns test.mean-cov
  (:require clojure.string
            [incanter.core :as in-core]
            [incanter.stats :as in-stats])
  (:use clojure.java.io))

(def test-mat [[1 2] [2 2]])

(in-stats/mean test-mat)

который я запускаю в LightTable.

Ошибка, которую я получаю, заключается в следующем:

java.lang.ClassCastException: clojure.lang.PersistentList cannot be cast to java.lang.Number
        Numbers.java:1104 clojure.lang.Numbers.double_array
           stats.clj:1492 incanter.stats/mean

Я не могу сказать, что понимаю это, и, к сожалению, мой гуглинг не помогает. Может ли кто-нибудь предложить простое объяснение и решение?

Естественно, одним ужасным способом сделать это было бы

(def c1 (first (transpose test-mat)))
(def c2 (second (transpose test-mat)))

(def data-cov-mat [[(in-stats/covariance c1 c1) (in-stats/covariance c1 c2)] [(in-stats/covariance c2 c1) (in-stats/covariance c2 c2)]])

Полное раскрытие: я новичок в clojure.

Спасибо


person Astrid    schedule 24.07.2015    source источник
comment
mean ожидает последовательность чисел; вы передаете ему последовательность последовательностей.   -  person Mars    schedule 24.07.2015


Ответы (1)


Для матричной ковариации вам необходимо использовать следующее:

(in-stats/covariance (in-core/matrix test-mat))

а для матричного среднего вектора:

(mapv in-stats/mean (in-core/trans test-mat))
person Symfrog    schedule 24.07.2015
comment
Хммм... (in-stats/covariance (in-core/matrix test-mat)) возвращает java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.Number - person Astrid; 24.07.2015
comment
@Astrid Скорее всего, в вашей матрице есть логическое значение. Этот пример матрицы вызовет такое же исключение: (def test-mat [[1 2] [2 true]]) - person Symfrog; 24.07.2015
comment
Как странно, я делаю просто: (def test-mat [[1 2] [2 2]]), а затем (in-stats/covariance (in-core/matrix test-mat)), что дает java.lang.ClassCastException: java.lang.Boolean cannot be cast to java.lang.Number - person Astrid; 24.07.2015