reimplemented variance to be calculated incremental using Knuth´s and Welford´s approach

This commit is contained in:
Thomas Fankhauser 2014-09-27 13:17:03 +02:00
Родитель 9977983f8d
Коммит b99ab732d1
4 изменённых файлов: 44 добавлений и 35 удалений

Просмотреть файл

@ -1,8 +1,8 @@
# See the README for installation instructions. # See the README for installation instructions.
NODE_PATH ?= ./node_modules NODE_PATH ?= ./node_modules
JS_UGLIFY = /usr/local/bin/uglifyjs JS_UGLIFY = $(NODE_PATH)/uglify-js/bin/uglifyjs
JS_TESTER = /usr/local/bin/vows JS_TESTER = $(NODE_PATH)/vows/bin/vows
LOCALE ?= en_US LOCALE ?= en_US
all: \ all: \

21
d3.js поставляемый
Просмотреть файл

@ -170,23 +170,28 @@ d3 = function() {
return a; return a;
}; };
d3.variance = function(array, f) { d3.variance = function(array, f) {
var n = array.length; var n = array.length, m = 0, a, d, s = 0, i = -1, j = 0;
if (n < 2) return NaN; if (n < 2) return NaN;
var mean = d3.mean(array, f), a, sd = 0, i = -1, j = 0;
if (arguments.length === 1) { if (arguments.length === 1) {
while (++i < n) { while (++i < n) {
if (d3_number(a = array[i])) { if (d3_number(a = array[i])) {
sd += Math.pow(a - mean, 2);
++j; ++j;
d = a - m;
m = m + d / j;
s = s + d * (a - m);
} }
} }
} else { } else {
var evaluatedArray = []; while (++i < n) {
while (++i < n) if (d3_number(a = f.call(array, array[i], i))) evaluatedArray.push(a); if (d3_number(a = f.call(array, array[i], i))) {
return d3.variance(evaluatedArray); ++j;
d = a - m;
m = m + d / j;
s = s + d * (a - m);
}
}
} }
sd /= j - 1; return j ? s / (j - 1) : NaN;
return j ? sd : NaN;
}; };
d3.deviation = function(array, f) { d3.deviation = function(array, f) {
var v = f ? d3.variance(array, f) : d3.variance(array); var v = f ? d3.variance(array, f) : d3.variance(array);

2
d3.min.js поставляемый

Различия файлов скрыты, потому что одна или несколько строк слишком длинны

Просмотреть файл

@ -1,26 +1,30 @@
d3.variance = function(array, f) { d3.variance = function(array, f) {
var n = array.length; var n = array.length,
if(n < 2) return NaN; m = 0,
a,
var mean = d3.mean(array, f), d,
a, s = 0,
sd = 0, i = -1,
i = -1, j = 0;
j = 0; if(n < 2) return NaN;
if (arguments.length === 1) {
if (arguments.length === 1) { while (++i < n){
while (++i < n){ if (d3_number(a = array[i])){
if (d3_number(a = array[i])){ ++j;
sd += Math.pow(a - mean, 2); d = a - m;
++j; m = m + (d/j);
} s = s + d * (a -m);
} }
} else { }
var evaluatedArray = []; } else {
while (++i < n) if (d3_number(a = f.call(array, array[i], i))) evaluatedArray.push(a); while (++i < n){
return d3.variance(evaluatedArray); if (d3_number(a = f.call(array, array[i], i))){
} ++j;
d = a - m;
sd /= (j - 1); m = m + (d/j);
return j ? sd : NaN; s = s + d * (a -m);
}
}
}
return j ? (s / (j-1)) : NaN;
}; };