reimplemented variance to be calculated incremental using Knuth´s and Welford´s approach
This commit is contained in:
Родитель
9977983f8d
Коммит
b99ab732d1
4
Makefile
4
Makefile
|
@ -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: \
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Различия файлов скрыты, потому что одна или несколько строк слишком длинны
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
Загрузка…
Ссылка в новой задаче