« かつやで海老カツと鶏カツの合い盛り定食をいただく。タルタルソースがとても美味しい。 | トップページ | やよい軒で黒酢酢豚定食をいただく。いい感じに酸味が強く美味しかった。 »

2022年8月30日 (火)

Visual C# (C_sharp)の数値計算ライブラリ MathNET Numericsを使う(8) 特異値分解(SVD)、主成分分析(PCA)を計算してみる(ちょうど奥村先生が記事を出されてたので)

今日、このTweet見た。

 

こちらのリンクの例題をC#とMath.NET Numericsでやってみよう。

特異値分解は実はめちゃくちゃ簡単で、M.Svd()だけで計算できる。その前にCSV読んで平均引いて、、、というのが実は面倒くさい(もしかしたらもっと簡単になるのかもしれないが、私はC#初心者…)。

C_sharp_svd03

結果はこちら。奥村先生がRでやられたのと一致している。

C_sharp_svd01

ファイル読み込みも含めたソースはこちら。

 


using System;
using System.IO;
using System.Text;
using System.Collections.Generic;
using MathNet.Numerics.LinearAlgebra;

namespace SVDtest01
{
    class Program
    {
        static void Main(string[] args)
        {

            EncodingProvider provider = System.Text.CodePagesEncodingProvider.Instance;
            var encoding = provider.GetEncoding("shift-jis");

            StreamReader sr = new StreamReader(@"atest2014chu.csv",encoding);
            string[] header = sr.ReadLine().Split(",");

            var list = new List();
            while (!sr.EndOfStream)
            {
                list.Add(sr.ReadLine().Split(","));
            }

            var M = Matrix.Build.Dense(list.Count, list[0].Length - 1);
            for (int i = 0; i < list.Count; i++) {
                for (int j = 0; j < list[0].Length - 1; j++)
                {
                    M[i, j] = Convert.ToDouble(list[i][j + 1]);
                }
            }

            var ColumnMean = new double[list[0].Length - 1];
            for (int j = 0; j < list[0].Length - 1; j++)
            {
                ColumnMean[j] = 0.0;
                for (int i = 0; i < list.Count; i++)
                {
                    ColumnMean[j] += M[i, j];
                }
                ColumnMean[j] /= Convert.ToDouble(list.Count);
            }

            for (int i = 0; i < list.Count; i++)
            {
                for (int j = 0; j < list[0].Length - 1; j++)
                {
                    M[i, j] -= ColumnMean[j];
                }
            }

            var factorSvd = M.Svd();
            var u = factorSvd.U;
            var v = factorSvd.VT.Transpose();
            var w = factorSvd.W;

            Console.WriteLine(w.Diagonal() / Math.Sqrt(47 - 1));
            Console.WriteLine(v);
            Console.WriteLine(u * w);




        }
    }
}


過去のもの:

Visual C# (C_sharp)の数学ライブラリ Math.NET Numericsを使う(1) 複素行列を定義して一次方程式や逆行列、行列式などを計算する。

Visual C# (C_sharp)の数学ライブラリ Math.NET Numericsを使う(2) 補間を行う(Interpolate) リニア、3次スプライン、有理関数などいろいろ使える。

Visual C# (C_sharp)の数学ライブラリ Math.NET Numericsを使う(3) 高速フーリエ変換(FFT)を実行する。FourierOptionsにMatlabとNumerical Recipesがあるのが意外。

Visual C# (C_sharp)の数学ライブラリ Math.NET Numericsを使う(4) 多項式フィッティングをして、Array.ConvertAllで一括でフィッティングデータを得る。

Visual C# (C_sharp)の数学ライブラリ Math.NET Numericsを使う(5) 常微分方程式の数値解法、4段4次のルンゲクッタ法がRungeKutta.FourthOrderの一文でできる。ローレンツ方程式を例としてやってみる

Visual C# (C_sharp)の数値計算ライブラリ MathNET Numericsを使う(6) OptimizationのNelder-Mead SimplexでRosenbrock関数(5パラメータ)を最小になる点を探す。

Visual C# (C_sharp)の数値計算ライブラリ MathNET Numericsを使う(7) OptimizationのLevenberg-Marquardt法(LevenbergMarquardtMinimizer)で非線形最小二乗法(回帰)でNISTの例題Rat43を計算する。

« かつやで海老カツと鶏カツの合い盛り定食をいただく。タルタルソースがとても美味しい。 | トップページ | やよい軒で黒酢酢豚定食をいただく。いい感じに酸味が強く美味しかった。 »

パソコン・インターネット」カテゴリの記事

学問・資格」カテゴリの記事

日記・コラム・つぶやき」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

« かつやで海老カツと鶏カツの合い盛り定食をいただく。タルタルソースがとても美味しい。 | トップページ | やよい軒で黒酢酢豚定食をいただく。いい感じに酸味が強く美味しかった。 »

最近の記事

最近のコメント

2025年2月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28  
フォト
無料ブログはココログ