我正在尝试在clojure中编写一个函数来查找序列(向量)的标准偏差。到目前为止,我已经定义了一个函数来查找一组数字的平均值,但我遇到了一些问题。
首先,我对如何使用平方根和clojure的权力感到困惑。其次,我试图找出如何从向量中单独拉出每个元素并从中减去均值然后将其平方。
到目前为止,这是我的功能
(defn mean [a] (/ (reduce + a) (count a)))
(defn standarddev [a] (Math/sqrt (/ (reduce + (map square #(- % (mean a) a))) (- (count a) 1 ))))
答案 0 :(得分:1)
只要你有一个double,就可以使用Java的Math类(https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html)来执行像sqrt这样的计算。您不需要做任何特殊的事情来访问Math类,因为Clojure使您可以使用所有java.lang类而无需导入。
答案 1 :(得分:1)
你非常接近。 假设您已经拥有以下功能
(defn square [n] (* n n))
(defn mean [a] (/ (reduce + a) (count a)))
您的standarddev功能存在2个问题
(defn standarddev [a] (Math/sqrt (/ (map square (map - a (mean a))) (- (count a) 1 ))))
1)(map - a (mean a))
不起作用,因为你从“向量”中减去“数字”。
修复重复(mean a)
的次数与“a”中的元素相同
最简单,绝不是有效的解决方案
(map - a (repeat (mean a)))
2)(map square(map - a(mean a)))由于上面的#1而无效,因为map返回“vector”。 修正向量的元素
(reduce + (map square (map - a (repeat (mean a)))))
您的标准开发功能现在应该是
(defn standarddev [a]
(Math/sqrt (/
(reduce + (map square (map - a (repeat (mean a)))))
(- (count a) 1 ))))
答案 2 :(得分:1)
您可以通过完全删除map
来轻轻提高性能
(def square #(* % %))
(defn standard-deviation
[a]
(let [mn (mean a)]
(Math/sqrt
(/ (reduce #(+ %1 (square (- %2 mn))) 0 a)
(dec (count a))))))
答案 3 :(得分:0)
首先,我对如何使用平方根和clojure的权力感到困惑。
为了解决问题,只需将其自身相乘:
(defn square [n]
(* n n))
如果你想要一个大于2的幂,你也可以使用取幂函数:
(defn exp [x n]
(reduce * (repeat n x)))
其次我试图找出如何从矢量中单独拉出每个元素并从中减去均值然后将其平方。
迭代seq的Clojure(函数)方法是使用map
。 Map接受一个函数和一个集合,并返回将该函数应用于集合的每个元素的结果。
(defn squares [avg coll] (map #(square (- % avg)) coll))
最终的标准偏差函数,使用上述2个函数和你的意思:
(defn standard-deviation [coll]
(let [avg (mean coll)
squares (squares avg coll)
total (count coll)]
(Math/sqrt (/ (reduce + squares) (- total 1)))))