問題タブ [apache-commons-math]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - スレッドの安全に関する警告
org.apache.commons.math3.distribution.NormalDistribution
大規模な分散 Scala & Akka アプリケーションで使用しています。デバッグ中sample()
に時々 NaN が返されることがわかりました。これは静かに伝播し、スレッドがハングアップする原因となりました。org.apache.commons.math3.ode.nonstiff.DormandPrince853Integrator
NaN は、並列コレクションで簡単に再現できます (シーケンシャル コードでは発生しません)。
この場合、明らかにval normal
内部を移動foreach
すると問題が解決します。
ドキュメントを見ましたが、そのような問題について警告するものは何もありません。スレッドセーフに関するより基本的な概念を理解できていませんか? 言うまでもなく、私は今 NaN をチェックしています。
java - 時系列予測にApacheのcommons.math FastFourierTransformerを使用する方法
監視メトリックの将来の値を予測するために、パターンを特定するために FastFourierTransformation を使用したいと考えています。私がやろうとしていることは次のとおりです。
季節ごとに繰り返される着信トラフィックの負荷を監視し (日中の高いピック)、さらに 1 週間の傾向 (週末のトラフィックが少なく、季節的に繰り返される) を監視します。私はいくつかの拡張回帰アルゴリズムを試しましたが、FFT を使用して最も重要な係数を特定し、これら 2 つの最も重要な周波数を認識し、外挿してトラフィックを予測したいと考えています。近い将来。apache.commons.math3.transform.FastFourierTransformation
数学の私の理論的バックグラウンドが私にいくつかの問題を引き起こしますが、私は に苦労しています。観測された時間枠で最新のトラフィック負荷を保存するために を使用すると仮定するとdoube [] array
、次のコードを使用します。
double [] initialSignal = getMonitoringData(timeslide);
FastFourierTransformer fft = new FastFourierTransformer(DftNormalization.STANDARD);
Complex [] result = fft.transform(initialSignal, TransformType.FORWARD);
Complex []
ただし、配列が何を表しているのかよくわかりません。配列内の各 Complex オブジェクトの虚数属性は、関連する正弦波係数を表していますか? したがって、ノイズ除去された初期信号を取得したい場合は、Complex [] 結果配列の重要度の低い係数をゼロに設定するだけで済みますか? それでも、次のものがあれば
Complex [] denoised = fft.transform(importantCoefficiants, TransformType.INVERSE);
結果は引き続き Complex の配列になります。時系列の新しく変換された x(t) 値を取得するにはどうすればよいですか? x(t+1), x(t+2) ... x(t+n) values
また、初期時系列のノイズを除去した後、を予測するためにどのように推定できますか?
java - t-逆数の計算
commons-math を使用して、両側学生分布の逆数を計算しようとしています。Excel を使用して値を比較し、結果が正しいかどうかを検証しています。
したがって、Excel を使用して、5 自由度と 95.45% の TINV を計算します。
結果を取得します: 2.64865
commons Math を次のように使用します。
結果が得られます:2.08913
私はおそらく明らかに何か間違ったことをしています。私はそれほど数学に精通しているわけではありませんが、プロジェクトのために Excel シートの数式を Java に移植する必要があり、これに行き詰まりました。
TINV 値とまったく同じ結果を得るには、何を使用すればよいですか? 何が欠けていますか。
java - 増分浮動小数点平均のアルゴリズムの選択 (java)
double のストリームの平均を計算したい。これは、double と int を格納するだけの単純なタスクです。私はApache CommonsのSummaryStatisticsクラスを使用してこれを行っていました。ただし、テスト中に、SummaryStatistics 平均値に浮動小数点エラーがあり、自分の Python 実装にはなかったことがわかりました。さらに調べてみると、コモンズが次のアルゴリズムのバージョンを使用していることがわかりました。
これにより、小さな浮動小数点エラーが発生することがあります。
これは、guava ユーティリティ DoubleMath.mean で使用される平均アルゴリズムでもあります。どちらも単純なアルゴリズムではなく、上記のアルゴリズムを使用しているのは奇妙に思えます。
前者のアルゴリズムが好まれる理由として、2 つの理由が考えられます。1 つは、ストリーミング中に平均を何度もクエリする場合、除算を行うよりも値をコピーするだけでよい場合があることです。 、私は実際に違いを測定していません)。
他の説明は、前者がオーバーフローの問題を防ぐということです。これは実際には浮動小数点数には当てはまらないようで、せいぜいこれは平均値の低下につながるはずです。このエラーが発生した場合、結果を BigDecimal クラスで行われた同じ cumMean と比較できるはずです。その結果、次の関数が得られます。
これは、私たちが得ることができる最も正確な平均であるはずです。次のコードのいくつかの逸話的な実行から、平均値と最も正確な値の間に大きな違いはないようです。逸話的に、それらは桁の正確な平均とは異なる傾向があり、どちらも常に他方より近いとは限りません。
apache commons と guava の両方が後者ではなく前者の方法を選択した理由について、正当な理由がある人はいますか?
編集:私の質問に対する答えは明らかです。答えは、Knuth が Art of Programming Vol II 4.2.2 (15) でそれを提案したことです (guava ソースを見るためのヒントを提供してくれた Louis Wasserman に感謝します)。ただし、本の中で、Knuth は、標準偏差のロバストな計算をブートストラップするために平均を計算するこの方法を提案していますが、必ずしもこれが最適な平均計算であるとは言いません。この章をさらに読んだことに基づいて、4番目の手段を実装しました。
上記と同じテストを実行すると (ほんの数回、統計的に有意なものは何もありません)、BigDecimal の実装とまったく同じ結果が得られます。knuth 平均更新は、より複雑な合計法を使用するよりも高速であると想像できますが、経験的に、より複雑な方法は平均の推定においてより正確であるように思われます。より高速である可能性が高い以外に、knuth メソッドを使用する他の理由はありますか?
java - Commons Math のメモリ要件: The Apache Commons Mathematics Library
Apache Commons Math のすべての操作がメモリ操作に含まれているかどうかを知りたいです。私は特に OLSMultipleLinearRegression に興味があり、これをビッグデータに使用しています。
また、ビッグデータで回帰を実行するための既存の Java API はありますか。
algorithm - apache commons math の k-means clusterer には means メソッドが含まれていますか?
k-means クラスタリングの手段を取得する必要があります。現在、k-means plus plus clustering アルゴリズムを実装する apache commons math ライブラリを使用しています。このライブラリを使用してクラスタリングした後に手段を取得する簡単な方法があるか、それとも自分で実装する必要があるかどうか、誰かが知っていますか?
そうでない場合は、計算方法を説明するか、コード例を教えてもらえますか?
java - BobyQA は開始点を変更し、次善の結果を計算しますか?
境界のある非線形最適化のために、Apache Commons Math の BobyQA アルゴリズムを試しています。
私は最適なものを知っています(matlabの信頼範囲反射アルゴリズムを使用して見つけました)が、次のことについて混乱しています:
BobyQA の開始点を最適に設定しましたが、BobyQA が評価する最初の点は、割り当てた開始点ではなく、次善の開始点に変更されました (最初のパラメーターが変更されます)。さらに、最小値を見つけられません。
例 (最適の最小二乗 - 開始点):
LSQ(最適)= 5.526374615719567E9 [1.0141E-7、81.15、119.03、32.0、0.36652、4.317、8.5167、17.3、16.470001、100.13、11.242、29.042、18.8771、8.871、8.871、8.871、8.871
次に、その開始点で BobyQA を実行すると、最初の反復で最初のパラメーターが変更されます (1.0141E-7 から 0.026117 に)。
lsq(1) = 1.7374657025186486E19 for [0.02611793333333286, 81.15, 119.03, 32.0, 0.36652, 4.317, 8.5167, 17.3, 16.496117933333334, 100.13, 11.223249066666666, 29.042, 18.871, 29.92, 36.147, 87.826, 21.287]
そして最終的に、次の場所で次善の解に到達します。
lsq(274) = 5.526621213826441E9 for [1.0115737485704292E-7, 81.14883064785045, 119.02964714352679, 32.00103316109643, 0.36615877961432247, 4.317235538618653, 8.516900515414736, 17.293306813210172, 16.496079045753113, 100.12980568809833, 11.22341107874299, 29.042103684597272, 18.870381140825014, 29.919895452015545, 36.14745517499619, 87.82657624240575, 21.288471755903668]
ここで、5.5266E9 は 5.5263E9 より大きいです。
私は何を間違っていますか?
ありがとう、
イゴール