Also, meanest.
{ ste-ddof population-ste sample-ste } related-words
{ corr-ddof population-corr sample-corr } related-words
{ cov-ddof population-cov sample-cov } related-words
+
+{ sum-of-squares sum-of-cubes sum-of-quads } related-words
{ 15+1/2 } [ { 4 8 15 16 23 42 } 0.2 trimmed-mean ] unit-test
{ 3 } [ { 1 3 3 3 3 5 } 0.2 winsorized-mean ] unit-test
+{ 2470 } [ 20 <iota> sum-of-squares ] unit-test
+{ 2470 } [ 20 <iota> >array sum-of-squares ] unit-test
+
+{ 36100 } [ 20 <iota> sum-of-cubes ] unit-test
+{ 36100 } [ 20 <iota> >array sum-of-cubes ] unit-test
+
+{ 562666 } [ 20 <iota> sum-of-quads ] unit-test
+{ 562666 } [ 20 <iota> >array sum-of-quads ] unit-test
+
{ 0 } [ { 1 } range ] unit-test
{ 89 } [ { 1 2 30 90 } range ] unit-test
{ 2 } [ { 1 2 3 } median ] unit-test
{ 0.0 } [ { 0 } ndcg ] unit-test
{ t } [ { 3 2 3 0 1 2 } dcg 6.861126688593501 1e-6 ~ ] unit-test
-{ t } [ { 3 2 3 0 1 2 } ndcg 0.9608081943360615 1e-6 ~ ] unit-test
\ No newline at end of file
+{ t } [ { 3 2 3 0 1 2 } ndcg 0.9608081943360615 1e-6 ~ ] unit-test
! Copyright (C) 2008 Doug Coleman, Michael Judge, Loryn Jenkins.
! See http://factorcode.org/license.txt for BSD license.
-USING: arrays assocs combinators fry generalizations grouping
-kernel locals math math.functions math.order math.vectors
-sequences sequences.private sorting ;
+USING: accessors arrays assocs combinators fry generalizations
+grouping kernel locals math math.functions math.order
+math.vectors sequences sequences.private sorting ;
FROM: math.ranges => [a,b] ;
IN: math.statistics
: mean ( seq -- x )
0 mean-ddof ; inline
-: sum-of-squares ( seq -- x )
- [ sq ] map-sum ; inline
+: meanest ( seq -- x )
+ [ mean ] keep [ - abs ] with infimum-by ;
+
+GENERIC: sum-of-squares ( seq -- x )
+M: object sum-of-squares [ sq ] map-sum ;
+M: iota sum-of-squares
+ n>> 1 - [ ] [ 1 + ] [ 1/2 + ] tri * * 3 / ;
+
+GENERIC: sum-of-cubes ( seq -- x )
+M: object sum-of-cubes [ 3 ^ ] map-sum ;
+M: iota sum-of-cubes sum sq ;
+
+GENERIC: sum-of-quads ( seq -- x )
+M: object sum-of-quads [ 4 ^ ] map-sum ;
+M: iota sum-of-quads
+ [let n>> 1 - :> n
+ n 0 > [
+ n
+ n 1 +
+ n 2 * 1 +
+ n sq 3 * n 3 * + 1 -
+ * * * 30 /
+ ] [ 0 ] if
+ ] ;
: sum-of-squared-errors ( seq -- x )
[ mean ] keep [ - sq ] with map-sum ; inline
{ 4.0 } [ { 1e-30 1 3 -1e-30 } sum-floats ] unit-test
{ 1.0000000000000002e16 } [ { 1e-16 1 1e16 } sum-floats ] unit-test
-{ 2470 } [ 20 <iota> sum-squares ] unit-test
-{ 2470 } [ 20 <iota> >array sum-squares ] unit-test
-
-{ 36100 } [ 20 <iota> sum-cubes ] unit-test
-{ 36100 } [ 20 <iota> >array sum-cubes ] unit-test
-
{
{
1 -1 -1 0 -1 1 -1 0 0 1 -1 0 -1 1 1
! SYNTAX: .. dup pop scan-object [a,b) suffix! ;
! SYNTAX: ... dup pop scan-object [a,b] suffix! ;
-GENERIC: sum-squares ( seq -- n )
-M: object sum-squares [ sq ] map-sum ;
-M: iota sum-squares
- length 1 - [ ] [ 1 + ] [ 1/2 + ] tri * * 3 / ;
-
-GENERIC: sum-cubes ( seq -- n )
-M: object sum-cubes [ 3 ^ ] map-sum ;
-M: iota sum-cubes sum sq ;
-
: mobius ( n -- x )
group-factors values [ 1 ] [
dup [ 1 > ] any?