計算上の差異の大きい番号
-
19-09-2019 - |
質問
まだ使い分けをしない分散計算あれくらいそれくらいどれくらいとわからないものかいて評価する必要があります。実は私はもったいないと数学。
私の配列1000000ランダムな数値の範囲0-10000.
の配列がより一層拡大を使用していますので64ビットのintた。
私たコードをどうcalc差異がないわからない場合は取得します正しい出力に出力します。
の平均は4692、中央値は4533.取得しない分散1483780.469308以下のコード:
// size is the element count, in this case 1000000
// value_sum is __int64
double p2 = pow( (double)(value_sum - (value_sum/size)), (double)2.0 );
double variance = sqrt( (double)(p2 / (size-1)) );
私はこの映画に影響をうけました妥当価値?
何でも正常に計算?
解決
注意: なんだ計算に収まって
差異を控除して計算しておりますの平均からの各要素計算の加重合してください。
必要なものがい:
// Get mean
double mean = static_cast<double>(value_sum)/size;
// Calculate variance
double variance = 0;
for(int i = 0;i<size;++i)
{
variance += (MyArray[i]-mean)*(MyArray[i]-mean)/size;
}
// Display
cout<<variance;
なお、このサンプルの分散使用されていることができたり、背後にある分布は不明で想定しています均一にすることにした。
また、一部の掘削また、バルコニーが見つかりではないことを不偏推定量. ウォルフラムアルファ ももこが、一例として、 MATLAB 計算の分散を返しますが、"バイアス補正サンプルの分散".
バイアス補正の分散を得ることがで分割して各要素による size-1
, するに当たり、
//Please check that size > 1
variance += (MyArray[i]-mean)*(MyArray[i]-mean)/(size-1);
また、価値の mean
に変更はありません。
他のヒント
まず、だんに取り扱うリーズナブルな分散、意差は基本的には標準偏差の二乗.標準偏差約対策の代表的な距離からのデータポイントを期待される値です。
なおデータの平均4692、計算値の差異が出てくる1483780その標準偏差は1218、このご数がどこか近傍の範囲3474-5910.な分散を実際にそう少し低い場合、これらの数字は0-10000;が明らかにさの分布のデータです。
としての計算そのもの:ご数の変化を計測することにより、分散を用い走り計算してい読書データの時でもいいのがあらかじめ利用 注目のペット可の方法:
初期化M1=x1、S1=0になります。
その後のxは、使用再発 数式
Mk=Mk-1+(xk-Mk-1)/k Sk=Sk-1+ (xk-Mk-1)*(xk-Mk).
2≦k≦n、kthの見積りの 分散はs2=Sk/(k-1)です。
ちょうど楽しみ、同じ結果にわずかに異なる経路のstd ::のvalarrayの代わりのstd ::ベクトルとを使用するための(様々な)アルゴリズム
template <class T>
T const variance(std::valarray<T> const &v) {
if (v.size() == 0)
return T(0.0);
T average = v.sum() / v.size();
std::valarray<T> diffs = v-average;
diffs *= diffs;
return diffs.sum()/diffs.size();
}
ヤコブは示唆したとおり、分散計算の実際には2つの可能なバージョンが存在します。現状では、これはあなたの入力が「宇宙」です前提としています。あなたは、全体的な宇宙の唯一のサンプルを撮影した場合は、最後の行が使用する必要があります。代わりに(diffs.size()-1)
のdiffs.size()
を
多分別の式を使用しますか?
#include <functional>
#include <algorithm>
#include <iostream>
int main()
{
using namespace std;
vector<double> num( 3 );
num[ 0 ] = 4000.9, num[ 1 ] = 11111.221, num[ 2 ] = -2;
double mean = std::accumulate(num.begin(), num.end(), 0.0) / num.size();
vector<double> diff(num.size());
std::transform(num.begin(), num.end(), diff.begin(),
std::bind2nd(std::minus<double>(), mean));
double variance = std::inner_product(diff.begin(), diff.end(),
diff.begin(), 0.0) / (num.size() - 1);
cout << "mean = " << mean << endl
<< "variance = " << variance << endl;
}
出力: 意味= 5036.71 分散= 3.16806e + 07
標本分散計算ます:
#include <math.h>
#include <vector>
double Variance(std::vector<double>);
int main()
{
std::vector<double> samples;
samples.push_back(2.0);
samples.push_back(3.0);
samples.push_back(4.0);
samples.push_back(5.0);
samples.push_back(6.0);
samples.push_back(7.0);
double variance = Variance(samples);
return 0;
}
double Variance(std::vector<double> samples)
{
int size = samples.size();
double variance = 0;
double t = samples[0];
for (int i = 1; i < size; i++)
{
t += samples[i];
double diff = ((i + 1) * samples[i]) - t;
variance += (diff * diff) / ((i + 1.0) *i);
}
return variance / (size - 1);
}
からだの組みとして浮動小数点の操作をしても良いでしょうかを兼ね;うに、多くの鋳.
を使用 pow .. 2
を算出するスクエアのように見えるビットの課題でした。きの計算番最初に、それぞれ自体に広場があります。
だって事業部とする必要があると感じてい鋳造、鋳造、 オペランド (分子および/または分母)をダブルではなく結果です。いな精度の場合分割の整数です。
くなった場合は公式を分散するものとします。また、説明をWikipediaです。しかし、数の専門家のいずれかえるだけではなくて間違いです。
、答えはSO 1174984 のが出て助けるべきhref="https://stackoverflow.com/questions/1174984">
あなたは10 6 の値を有し、任意の値の二乗が最大10とすることができる 8 ため は、10までの二乗の合計で終わる可能性が< SUP> 14 。あなたはまだオーバーフローに実行せずに、多くの入力、または代わりにのみ1万100万までの範囲の値として万回を扱うことができるようにあなたの64ビット整数は、10 18 まで保存することができます。何の急務は、したがって、純粋な二重計算に移動するには、ありません。