我想以慣用的方式計算向量的加權平均值。 爲了說明我想要的,想象我有這樣的數據:Clojure:向量的慣用加權平均值
數據1 = [2 1],1重量= 1個 數據2 = [3 4],2重量= 2
然後平均值= [ (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))))))
Then
(meanv [[2 1] [3 4]] [1 2]) = [2.67 3.0]
幾點說明:
stats/means
需要1或2個輸入。
默認情況下,一個輸入版本的權重= 1。
兩個輸入是加權版本。
i-partial
像部分,但FN發生了逆轉ARGS
Ex : ((partial/2) 1) = 2
((i-partial/2) 1 = 1/2
所以我的函數的工作,沒有任何問題。 但在某種程度上,我想用更習慣的Clojure來實現它。
我嘗試了許多與(map (fn [&xs ...
之類的組合,但它不起作用。 是否有可能採取矢量的未定義數量的所有第n個元素,並直接應用統計/平均值?我的意思是一個班輪
感謝
編輯(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]]'權重是'[1 2]' - 在你使用的示例中'[[1 2] [3 4]]' - 那它是哪一個? – birdspider