« ステーキ宮で厚切りサーロインステーキ+カラフェワイン赤をいただく。宮のたれ、初めて食べたが評判通り美味しい。 | トップページ | 高周波・RFニュース 2025年10月7日 IDTechExが2026-2036の6G予測レポート発行、Silicon LabsがSeries3 SoC発表、Würth Elektronikが868MHz通信モジュール発表、3GPP Release 19解説記事、TDKの無線式振動加速度計、TobiiとSTMの車内センシングソリューション量産 »

2025年10月 6日 (月)

Javaの数値計算ライブラリApache Commons Mathを使う(8) 特異値分解(SVD)、主成分分析(PCA)を計算してみる。

今回はこちらの例題から。

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

奥村先生のこちらの例題を使っている。

特異値分解・主成分分析・バイプロット

コードはこんな感じで。


import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.swing.*;
import java.awt.*;

import org.apache.commons.math3.linear.MatrixUtils;
import org.apache.commons.math3.linear.RealMatrix;
import org.apache.commons.math3.linear.SingularValueDecomposition;


public class svd {
        public static void main(String[] args) {
                File file =new File( "../atest2014chu.csv");
                String line;
                int n = 47;
                int m = 4;
                String[] values = new String[m];
                double[][] data = new double[n][m];
                JFrame frame = new JFrame("PCA");
                frame.setBounds(100, 100, 750, 900);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
               
                JPanel p = new JPanel();
                p.setLayout(new BoxLayout(p, BoxLayout.PAGE_AXIS));
                JTextArea sArea = new JTextArea();
                JTextArea vArea = new JTextArea();
                JTextArea uArea = new JTextArea();
                JLabel sLabel = new JLabel("S / sqrt(n - 1)");
                JLabel vLabel = new JLabel("V");
                JLabel uLabel = new JLabel("U * S");
                sArea.setFont(new Font("Arial", Font.PLAIN, 12));
                vArea.setFont(new Font("Arial", Font.PLAIN, 12));
                uArea.setFont(new Font("Arial", Font.PLAIN, 12));
                p.add(sLabel);
                p.add(sArea);
                p.add(vLabel);
                p.add(vArea);
                p.add(uLabel);
                p.add(uArea);
               
                try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(file),"Shift-JIS"))) {
                        int row = 0;
                        line = br.readLine();
                        while ((line = br.readLine()) != null) {
                values = line.split(",");
                for (int i = 0; i < m; i++) {
                        data[row][i] = Double.parseDouble(values[i+1]);
                }
                row++;
            }
                } catch (IOException e) {
                        e.printStackTrace();
                }
        double[] columnMean = new double[m];
        for (int j = 0; j < m; j++)
        {
            columnMean[j] = 0.0;
            for (int i = 0; i < n; i++)
            {
                columnMean[j] += data[i][j];
            }
            columnMean[j] /= (double)n;
        }
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                data[i][j] -= columnMean[j];
            }
        }
        RealMatrix dataMatrix = MatrixUtils.createRealMatrix(data);
        SingularValueDecomposition decomp = new SingularValueDecomposition(dataMatrix);
        RealMatrix s = decomp.getS();
        RealMatrix v = decomp.getV();
        RealMatrix u = decomp.getU();

                sArea.append(MatrixString(s.scalarMultiply(1.0/Math.sqrt((double)n - 1.0))));
                vArea.append(MatrixString(v));
                uArea.append(MatrixString(u.multiply(s)));
                frame.getContentPane().add(p, BorderLayout.CENTER);
                frame.setVisible(true);
        }
       
        private static String MatrixString(RealMatrix m)  {
                String s = "";
                for (int i = 0; i < m.getRowDimension(); i++) {
                        s += "[";
                        for (int j = 0; j < m.getColumnDimension(); j++) {
                                s += m.getEntry(i, j);
                                if (j < m.getColumnDimension() - 1) {
                                        s += ", ";
                                }
                        }
                        s +="]\n";
                }
                return s;
               
        }
}

結果はこちら。リンク先の値と一致している。

Javasvd01

« ステーキ宮で厚切りサーロインステーキ+カラフェワイン赤をいただく。宮のたれ、初めて食べたが評判通り美味しい。 | トップページ | 高周波・RFニュース 2025年10月7日 IDTechExが2026-2036の6G予測レポート発行、Silicon LabsがSeries3 SoC発表、Würth Elektronikが868MHz通信モジュール発表、3GPP Release 19解説記事、TDKの無線式振動加速度計、TobiiとSTMの車内センシングソリューション量産 »

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

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

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

コメント

コメントを書く

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

« ステーキ宮で厚切りサーロインステーキ+カラフェワイン赤をいただく。宮のたれ、初めて食べたが評判通り美味しい。 | トップページ | 高周波・RFニュース 2025年10月7日 IDTechExが2026-2036の6G予測レポート発行、Silicon LabsがSeries3 SoC発表、Würth Elektronikが868MHz通信モジュール発表、3GPP Release 19解説記事、TDKの無線式振動加速度計、TobiiとSTMの車内センシングソリューション量産 »

最近の記事

2025年11月
            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 29
30            
無料ブログはココログ
フォト