ARCS6 AR6-REV.24062600
読み取り中…
検索中…
一致する文字列を見つけられません
Statistics.hh
1
7//
8// Copyright (C) 2011-2021 Yokokura, Yuki
9// This program is free software;
10// you can redistribute it and/or modify it under the terms of the FreeBSD License.
11// For details, see the License.txt file.
12
13#ifndef STATISTICS
14#define STATISTICS
15
16#include <cassert>
17#include <cmath>
18#include "Matrix.hh"
19
20// ARCS組込み用マクロ
21#ifdef ARCS_IN
22 // ARCSに組み込まれる場合
23 #include "ARCSassert.hh"
24 #include "ARCSeventlog.hh"
25#else
26 // ARCSに組み込まれない場合
27 #define arcs_assert(a) (assert(a))
28 #define PassedLog()
29 #define EventLog(a)
30 #define EventLogVar(a)
31#endif
32
33namespace ARCS { // ARCS名前空間
36 public:
42 template <size_t N, size_t M>
43 static double Mean(const Matrix<N,M>& U){
44 double Ubar = 0;
45 for(size_t i = 1; i <= M; ++i){
46 for(size_t j = 1; j <= N; ++j) Ubar += U.GetElement(j,i);
47 }
48 return Ubar/(double)(N*M); // 平均値を計算して返す
49 }
50
56 template <size_t N, size_t M>
57 static void MeanRow(const Matrix<N,M>& U, Matrix<1,M>& y){
58 y = sumrow(U)/(double)N; // 横方向に加算して行列の幅で割って平均を算出
59 }
60
66 template <size_t N, size_t M>
67 static void MeanColumn(const Matrix<N,M>& U, Matrix<N,1>& y){
68 y = sumcolumn(U)/(double)M; // 横方向に加算して行列の幅で割って平均を算出
69 }
70
72 template <size_t N>
73 static double Mean(const std::array<double, N>& u){
74 double ubar = 0;
75 for(size_t i = 0; i < N; ++i){
76 ubar += u[i];
77 }
78 return ubar/(double)N; // 平均値を計算して返す
79 }
80
86 template <size_t N, size_t M>
87 static double SampledVariance(const Matrix<N,M>& U){
88 // Uの平均を計算
89 double Ubar = Mean(U);
90
91 // Uから平均値を減算して2乗して累積加算
92 double xi_xbar = 0, s2 = 0;
93 for(size_t i = 1; i <= M; ++i){
94 for(size_t j = 1; j <= N; ++j){
95 xi_xbar = U.GetElement(j,i) - Ubar;
96 s2 += xi_xbar*xi_xbar;
97 }
98 }
99 return s2/(double)(N*M);
100 }
101
106 template <size_t N>
107 static double SampledVariance(const std::array<double, N>& u){
108 // Uの平均を計算
109 double ubar = Mean(u);
110
111 // Uから平均値を減算して2乗して累積加算
112 double xi_xbar = 0, s2 = 0;
113 for(size_t i = 0; i < N; ++i){
114 xi_xbar = u[i] - ubar;
115 s2 += xi_xbar*xi_xbar;
116 }
117 return s2/(double)N;
118 }
119
125 template <size_t N, size_t M>
126 static double UnbiasedVariance(const Matrix<N,M>& U){
127 // Uの平均を計算
128 double Ubar = Mean(U);
129
130 // Uから平均値を減算して2乗して累積加算
131 double xi_xbar = 0, s2 = 0;
132 for(size_t i = 1; i <= M; ++i){
133 for(size_t j = 1; j <= N; ++j){
134 xi_xbar = U.GetElement(j,i) - Ubar;
135 s2 += xi_xbar*xi_xbar;
136 }
137 }
138 return s2/(double)(N*M - 1);
139 }
140
146 template <size_t N, size_t M>
147 static void UnbiasedVarianceRow(const Matrix<N,M>& U, Matrix<1,M>& y){
148 // Uの行方向の平均を計算
149 Matrix<1,M> ubar; // 平均ベクトル
150 MeanRow(U, ubar);
151
152 // Uから平均値を減算して2乗して累積加算
153 Matrix<1,M> xi_xbar, s2;
154 for(size_t i = 1; i <= N; ++i){
155 xi_xbar = getcolumn(U, i) - ubar;
156 s2 += xi_xbar & xi_xbar;
157 }
158 y = s2/(double)(N - 1);
159 }
160
166 template <size_t N, size_t M>
168 // Uの行方向の平均を計算
169 Matrix<N,1> ubar; // 平均ベクトル
170 MeanColumn(U, ubar);
171
172 // Uから平均値を減算して2乗して累積加算
173 Matrix<N,1> xi_xbar, s2;
174 for(size_t i = 1; i <= M; ++i){
175 xi_xbar = getrow(U, i) - ubar;
176 s2 += xi_xbar & xi_xbar;
177 }
178 y = s2/(double)(M - 1);
179 }
180
185 template <size_t N>
186 static double UnbiasedVariance(const std::array<double, N>& u){
187 // Uの平均を計算
188 double ubar = Mean(u);
189
190 // Uから平均値を減算して2乗して累積加算
191 double xi_xbar = 0, s2 = 0;
192 for(size_t i = 0; i <= N; ++i){
193 xi_xbar = u[i] - ubar;
194 s2 += xi_xbar*xi_xbar;
195 }
196 return s2/(double)(N - 1);
197 }
198
204 template <size_t N, size_t M>
205 static double Variance(const Matrix<N,M>& U){
206 return UnbiasedVariance(U); // 不偏分散を返す
207 }
208
214 template <size_t N, size_t M>
215 static void VarianceRow(const Matrix<N,M>& U, Matrix<1,M>& y){
217 }
218
224 template <size_t N, size_t M>
225 static void VarianceColumn(const Matrix<N,M>& U, Matrix<N,1>& y){
227 }
228
233 template <size_t N>
234 static double Variance(const std::array<double, N>& u){
235 return UnbiasedVariance(u); // 不偏分散を返す
236 }
237
243 template <size_t N, size_t M>
244 static double StandardDeviation(const Matrix<N,M>& U){
245 return sqrt(Variance(U));
246 }
247
253 template <size_t N, size_t M>
255 VarianceRow(U, y);
256 y = sqrte(y);
257 }
258
264 template <size_t N, size_t M>
266 VarianceColumn(U, y);
267 y = sqrte(y);
268 }
269
274 template <size_t N>
275 static double StandardDeviation(const std::array<double, N>& u){
276 return sqrt(Variance(u));
277 }
278
285 template <size_t N, size_t M>
286 static double Covariance(const Matrix<N,M>& U1, const Matrix<N,M>& U2){
287 // U1とU2の平均を計算
288 double Ubar1 = Mean(U1);
289 double Ubar2 = Mean(U2);
290
291 // U1とU2から平均値を減算して共分散を計算して返す
292 double U1_Ubar1 = 0, U2_Ubar2 = 0, v = 0;
293 for(size_t i = 1; i <= M; ++i){
294 for(size_t j = 1; j <= N; ++j){
295 U1_Ubar1 = U1.GetElement(j,i) - Ubar1;
296 U2_Ubar2 = U2.GetElement(j,i) - Ubar2;
297 v += U1_Ubar1*U2_Ubar2;
298 }
299 }
300 return v/(double)(N*M);
301 }
302
308 template <size_t N>
309 static double Covariance(const std::array<double, N>& u1, const std::array<double, N>& u2){
310 // u1とu2の平均を計算
311 double ubar1 = Mean(u1);
312 double ubar2 = Mean(u2);
313
314 // u1とu2から平均値を減算して共分散を計算して返す
315 double u1_ubar1 = 0, u2_ubar2 = 0, v = 0;
316 for(size_t i = 0; i < N; ++i){
317 u1_ubar1 = u1[i] - ubar1;
318 u2_ubar2 = u2[i] - ubar2;
319 v += u1_ubar1*u2_ubar2;
320 }
321 return v/(double)N;
322 }
323
330 template <size_t N, size_t M>
331 static double Correlation(const Matrix<N,M>& U1, const Matrix<N,M>& U2){
332 double Var1 = SampledVariance(U1); // U1の標本分散
333 double Var2 = SampledVariance(U2); // U2の標本分散
334 double Cov = Covariance(U1, U2); // U1とU2の共分散
335 return Cov/(sqrt(Var1)*sqrt(Var2)); // ピアソンの相関係数
336 }
337
343 template <size_t N>
344 static double Correlation(const std::array<double, N>& u1, const std::array<double, N>& u2){
345 double Var1 = SampledVariance(u1); // u1の標本分散
346 double Var2 = SampledVariance(u2); // u2の標本分散
347 double Cov = Covariance(u1, u2); // u1とu2の共分散
348 return Cov/(sqrt(Var1)*sqrt(Var2)); // ピアソンの相関係数
349 }
350
351 private:
352 Statistics() = delete;
353 Statistics(Statistics&& r) = delete;
354 ~Statistics() = delete;
355 Statistics(const Statistics&) = delete;
356 const Statistics& operator=(const Statistics&) = delete;
357};
358}
359
360#endif
361
ARCS イベントログクラス
ARCS用ASSERTクラス
行列/ベクトル計算クラス(テンプレート版)
行列/ベクトル計算クラス(テンプレート版)
Definition Matrix.hh:44
constexpr TT GetElement(size_t n, size_t m) const
指定した要素番号の値を返す関数
Definition Matrix.hh:489
統計処理クラス(テンプレート行列&std::array版)
Definition Statistics.hh:35
static double SampledVariance(const Matrix< N, M > &U)
行列U全体の標本分散を求める
Definition Statistics.hh:87
static void UnbiasedVarianceColumn(const Matrix< N, M > &U, Matrix< N, 1 > &y)
行列Uの縦方向の不偏分散を求めて横ベクトルを出力する関数
Definition Statistics.hh:167
static double Variance(const Matrix< N, M > &U)
行列U全体の分散を求める(エイリアス)
Definition Statistics.hh:205
static void MeanRow(const Matrix< N, M > &U, Matrix< 1, M > &y)
行列Uの横方向の平均を計算して縦ベクトルを出力する関数
Definition Statistics.hh:57
static double Covariance(const std::array< double, N > &u1, const std::array< double, N > &u2)
配列u1と配列u2の間の共分散を計算する
Definition Statistics.hh:309
static double StandardDeviation(const std::array< double, N > &u)
配列uの標準偏差を求める
Definition Statistics.hh:275
static void MeanColumn(const Matrix< N, M > &U, Matrix< N, 1 > &y)
行列Uの縦方向の平均を計算して横ベクトルを出力する関数
Definition Statistics.hh:67
static double Correlation(const Matrix< N, M > &U1, const Matrix< N, M > &U2)
行列U1と行列U2の間のピアソンの相関係数を求める
Definition Statistics.hh:331
static void VarianceRow(const Matrix< N, M > &U, Matrix< 1, M > &y)
行列Uの横方向の不偏分散を求めて縦ベクトルを出力する関数(エイリアス)
Definition Statistics.hh:215
static double SampledVariance(const std::array< double, N > &u)
配列uの標本分散を求める
Definition Statistics.hh:107
static void StandardDeviationRow(const Matrix< N, M > &U, Matrix< 1, M > &y)
行列Uの横方向の標準偏差を求めて縦ベクトルを出力する関数
Definition Statistics.hh:254
static double Variance(const std::array< double, N > &u)
配列uの分散を求める(エイリアス)
Definition Statistics.hh:234
static double StandardDeviation(const Matrix< N, M > &U)
行列U全体の標準偏差を求める
Definition Statistics.hh:244
static double UnbiasedVariance(const Matrix< N, M > &U)
行列U全体の不偏分散を求める
Definition Statistics.hh:126
static double Correlation(const std::array< double, N > &u1, const std::array< double, N > &u2)
配列u1と配列u2の間のピアソンの相関係数を求める
Definition Statistics.hh:344
static double Mean(const std::array< double, N > &u)
配列uの平均を計算する
Definition Statistics.hh:73
static double UnbiasedVariance(const std::array< double, N > &u)
配列uの不偏分散を求める
Definition Statistics.hh:186
static double Mean(const Matrix< N, M > &U)
行列U全体の平均を計算する
Definition Statistics.hh:43
static void UnbiasedVarianceRow(const Matrix< N, M > &U, Matrix< 1, M > &y)
行列Uの横方向の不偏分散を求めて縦ベクトルを出力する関数
Definition Statistics.hh:147
static double Covariance(const Matrix< N, M > &U1, const Matrix< N, M > &U2)
行列U1と行列U2の間の共分散を計算する
Definition Statistics.hh:286
static void VarianceColumn(const Matrix< N, M > &U, Matrix< N, 1 > &y)
行列Uの縦方向の不偏分散を求めて横ベクトルを出力する関数(エイリアス)
Definition Statistics.hh:225
static void StandardDeviationColumn(const Matrix< N, M > &U, Matrix< N, 1 > &y)
行列Uの縦方向の標準偏差を求めて横ベクトルを出力する関数
Definition Statistics.hh:265