为什么以下 Javascript 代码的输出是 NaN?
Why the output of the following Javascript code is NaN?
我是 JavaScript 的新手。我正在尝试编写一个代码,通过对一组非常小的数据使用 Pearson 相关系数公式来查找相关系数。这是皮尔逊相关系数的公式。
var dataSet = {
bath: [30, 29, 20, 28, 12, 30],
disease: [2, 5, 9, 3, 8]
};
const corRelate = () => {
var m1 = 0,
m2 = 0,
m3 = 0,
m4 = 0,
m5 = 0;
for (var i = 0; i < dataSet.bath.length; i++) {
m2 = m2 + dataSet.bath[i];
m4 = m4 + dataSet.bath[i] * dataSet.bath[i];
}
for (var i = 0; i < dataSet.disease.length; i++) {
m3 = m3 + dataSet.disease[i];
m5 = m5 + dataSet.disease[i] * dataSet.disease[i];
}
for (var i = 0; i < dataSet.bath.length; i++) {
for (var j = 0; j < dataSet.disease.length; j++) {
m1 = m1 + dataSet.bath[i] * dataSet.disease[j];
}
}
const val = (m1 - m2 * m3) / (Math.sqrt(m4 - m2 * m2) * Math.sqrt(m5 - m3 * m3));
return val;
};
const val = corRelate();
console.log(val);
这段代码的输出是 NaN 。我认为计算的输出应该是整数或浮点数,我不明白为什么我得到 NaN 作为输出。
你的公式有误,我重写了你的代码片段:
const dataSet = {
bath: [30, 29, 20, 28, 12, 30],
disease: [2, 5, 9, 3, 8]
};
const corRelate = () => {
const m1 = dataSet.bath.reduce((m1, bath) => {
return dataSet.disease.reduce((m1, disease) => m1 + bath * disease, m1);
}, 0);
const m2 = dataSet.bath.reduce((m2, item) => m2 + item, 0);
const m4 = dataSet.bath.reduce((m4, item) => m4 + item * item, 0);
const m3 = dataSet.disease.reduce((m3, item) => m3 + item, 0);
const m5 = dataSet.disease.reduce((m5, item) => m5 + item * item, 0);
// here u used Math.sqrt twice "Math.sqrt(m4 - m2 * m2) * Math.sqrt(m5 - m3 * m3)"
return (m1 - m2 * m3) / Math.sqrt((m4 - m2 * m2) * (m5 - m3 * m3));
};
console.log(corRelate());
我是 JavaScript 的新手。我正在尝试编写一个代码,通过对一组非常小的数据使用 Pearson 相关系数公式来查找相关系数。这是皮尔逊相关系数的公式。
var dataSet = {
bath: [30, 29, 20, 28, 12, 30],
disease: [2, 5, 9, 3, 8]
};
const corRelate = () => {
var m1 = 0,
m2 = 0,
m3 = 0,
m4 = 0,
m5 = 0;
for (var i = 0; i < dataSet.bath.length; i++) {
m2 = m2 + dataSet.bath[i];
m4 = m4 + dataSet.bath[i] * dataSet.bath[i];
}
for (var i = 0; i < dataSet.disease.length; i++) {
m3 = m3 + dataSet.disease[i];
m5 = m5 + dataSet.disease[i] * dataSet.disease[i];
}
for (var i = 0; i < dataSet.bath.length; i++) {
for (var j = 0; j < dataSet.disease.length; j++) {
m1 = m1 + dataSet.bath[i] * dataSet.disease[j];
}
}
const val = (m1 - m2 * m3) / (Math.sqrt(m4 - m2 * m2) * Math.sqrt(m5 - m3 * m3));
return val;
};
const val = corRelate();
console.log(val);
这段代码的输出是 NaN 。我认为计算的输出应该是整数或浮点数,我不明白为什么我得到 NaN 作为输出。
你的公式有误,我重写了你的代码片段:
const dataSet = {
bath: [30, 29, 20, 28, 12, 30],
disease: [2, 5, 9, 3, 8]
};
const corRelate = () => {
const m1 = dataSet.bath.reduce((m1, bath) => {
return dataSet.disease.reduce((m1, disease) => m1 + bath * disease, m1);
}, 0);
const m2 = dataSet.bath.reduce((m2, item) => m2 + item, 0);
const m4 = dataSet.bath.reduce((m4, item) => m4 + item * item, 0);
const m3 = dataSet.disease.reduce((m3, item) => m3 + item, 0);
const m5 = dataSet.disease.reduce((m5, item) => m5 + item * item, 0);
// here u used Math.sqrt twice "Math.sqrt(m4 - m2 * m2) * Math.sqrt(m5 - m3 * m3)"
return (m1 - m2 * m3) / Math.sqrt((m4 - m2 * m2) * (m5 - m3 * m3));
};
console.log(corRelate());