관용구 방식으로 벡터의 가중 평균을 계산하고 싶습니다.Clojure : 벡터의 관용적 가중 평균
데이터 1 = [2 1] 중량 1 = 1 데이터 2 = 3 4], 중량 2 = 2
그럼 의미 = : 내가 원하는 것을 설명하기 위해, I는이 데이터가 상상 (2 * 1 + 3 * 2)/(1 + 2) (1 * 1 + 2 * 4)/(1 + 2) = [2.67 3.0 여기서
내 코드 :(defn meanv
"Returns the vector that is the mean of input ones.
You can also pass weights just like apache-maths.stats/mean"
([data]
(let [n (count (first data))]
(->> (for [i (range 0 n)]
(vec (map (i-partial nth i) data)))
(mapv stats/mean))))
([data weights]
(let [n (count (first data))]
(->> (for [i (range 0 n)]
(vec (map (i-partial nth i) data)))
(mapv (i-partial stats/mean weights))))))
다음
(meanv [[2 1] [3 4]] [1 2]) = [2.67 3.0]
몇 가지 메모 :
stats/means
은 1 또는 2 개의 입력을받습니다.
하나의 입력 버전에는 기본적으로 가중치 = 1이 있습니다.
두 개의 입력이 가중 버전입니다.
i-partial
부분처럼하지만 FN은 인수
Ex : ((partial/2) 1) = 2
((i-partial/2) 1 = 1/2
그래서 내 함수의 작동
, 아무 문제를 반대하고있다. 그러나 좀 더 관용적 인 Clojure에서 구현하고 싶습니다.(map (fn [&xs ...
과 같은 여러 조합을 시도했지만 작동하지 않습니다. 정의되지 않은 수의 벡터 중 n 번째 요소를 모두 가져 와서 stats/mean을 직접 적용 할 수 있습니까? 나는 한 줄을
감사를 의미
편집 (birdspider 응답)
(defn meanv
([data]
(->> (apply mapv vector data)
(mapv stats/mean)))
([data weights]
(->> (apply mapv vector data)
(mapv (i-partial stats/mean weights)))))
그리고 당신이 원하는
(defn transpose [m]
(apply mapv vector m))
(defn meanv
([data]
(->> (transpose data)
(mapv stats/mean)))
([data weights]
(->> (transpose data)
(mapv (i-partial stats/mean weights)))))
왜 두 데이터가'(1 + 2) '로 나누어 져 있습니까? – birdspider
nvm, 가중치로 나눈 값 – birdspider
혼란 스럽네요 - 데이터가'[[2 1] [3 4]] '라고 쓰여진 텍스트 descr에서 당신이 사용하는 샘플에서의 무게는''[1 2]'입니다. '[[1 2] [3 4]]'- 그래서 어느 것이지? – birdspider