Javaの数値計算ライブラリApache Commons Mathを使う(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;
}
}
|
結果はこちら。リンク先の値と一致している。
« ステーキ宮で厚切りサーロインステーキ+カラフェワイン赤をいただく。宮のたれ、初めて食べたが評判通り美味しい。 | トップページ | 高周波・RFニュース 2025年10月7日 IDTechExが2026-2036の6G予測レポート発行、Silicon LabsがSeries3 SoC発表、Würth Elektronikが868MHz通信モジュール発表、3GPP Release 19解説記事、TDKの無線式振動加速度計、TobiiとSTMの車内センシングソリューション量産 »
「パソコン・インターネット」カテゴリの記事
- Visual Studio 2026がリリースされたので早速新しいPCにインストール。全面的にGitHub Copilotを使うようになっている。とりあえずC#でMath.NET numericsを使って連立方程式を計算するコードを書いてもらったら一発で動く。他の例として固有値や非線形計算もコードを出してくれた。(2025.11.14)
- 家で使うPCをゲーミングノートPC、ASUS TUF Gaming A16に買い替えた。CPUはAMD Ryzen 9 8940HX、メモリ32GB、GPUはNVIDIA GeForce RTX 5060 Laptop GPU、SSD 1TB。ゲームをしたいわけでなくてNVIDIAの最新GPUで機械学習・数値計算やろうかと。(2025.11.13)
- RF Weekly Digest (Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ) 2025/11/3-2025/11/9(2025.11.09)
- RF Weekly Digest (Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ) 2025/10/27-2025/11/3(2025.11.04)
- Google AI StudioのBuild(アプリを作る機能)で高周波・RFニュースを1週間分まとめるアプリを作った(最終版) 私がいつも調査しているサイト67個を全部入れて調べてもらうようにした。これでとりあえず完成かな。QorvoとSkyworksの合併も拾ってくれた。(2025.10.30)
「学問・資格」カテゴリの記事
- Visual Studio 2026がリリースされたので早速新しいPCにインストール。全面的にGitHub Copilotを使うようになっている。とりあえずC#でMath.NET numericsを使って連立方程式を計算するコードを書いてもらったら一発で動く。他の例として固有値や非線形計算もコードを出してくれた。(2025.11.14)
- 高周波・RFニュース 2025年11月13日 QorvoがTWTA置き換えの広帯域SSPA発表、iFixitがiPad Pro M5分解、KYOCERA AVXが0.9Vで動く超小型クロック発表、Mini-Circuitsが様々なBALUNやトランス解説、軍用5G解説、imecの110GHz可能な300mm GeSiウェハー(2025.11.13)
- 高周波・RFニュース 2025年11月12日 Qualcommが語る技術の標準化、STMicroelectronicsが語るシリコンフォトニクス、HuaweiがイノベーションとIPフォーラム開催、6G SummitでFCCのコミッショナーが米国が6Gをリードすべしと語る(2025.11.12)
- トランジスタ技術2025年12月号 電波と回路のススメMHz~GHzを操る!を買った。GHzはアナデバのICを使った信号発生器(信号検出付きなのが面白い)のみだったが、マルチパス、高調波で周波数拡大、6.78MHzのワイヤレス給電、オシロでSDRなど話題も豊富で面白かった。(2025.11.11)
- 高周波・RFニュース 2025年11月10日 Qorvoらが参加する5G, 6Gオンラインパネル開催、SkyworksがBAWを使った高性能クロック発表、Nokiaベル研とKDDIが6Gで協業、次世代FWAのアンテナ設計解説(2025.11.10)
「日記・コラム・つぶやき」カテゴリの記事
- Visual Studio 2026がリリースされたので早速新しいPCにインストール。全面的にGitHub Copilotを使うようになっている。とりあえずC#でMath.NET numericsを使って連立方程式を計算するコードを書いてもらったら一発で動く。他の例として固有値や非線形計算もコードを出してくれた。(2025.11.14)
- 高周波・RFニュース 2025年11月13日 QorvoがTWTA置き換えの広帯域SSPA発表、iFixitがiPad Pro M5分解、KYOCERA AVXが0.9Vで動く超小型クロック発表、Mini-Circuitsが様々なBALUNやトランス解説、軍用5G解説、imecの110GHz可能な300mm GeSiウェハー(2025.11.13)
- 高周波・RFニュース 2025年11月12日 Qualcommが語る技術の標準化、STMicroelectronicsが語るシリコンフォトニクス、HuaweiがイノベーションとIPフォーラム開催、6G SummitでFCCのコミッショナーが米国が6Gをリードすべしと語る(2025.11.12)
- トランジスタ技術2025年12月号 電波と回路のススメMHz~GHzを操る!を買った。GHzはアナデバのICを使った信号発生器(信号検出付きなのが面白い)のみだったが、マルチパス、高調波で周波数拡大、6.78MHzのワイヤレス給電、オシロでSDRなど話題も豊富で面白かった。(2025.11.11)
- 高周波・RFニュース 2025年11月10日 Qorvoらが参加する5G, 6Gオンラインパネル開催、SkyworksがBAWを使った高性能クロック発表、Nokiaベル研とKDDIが6Gで協業、次世代FWAのアンテナ設計解説(2025.11.10)
« ステーキ宮で厚切りサーロインステーキ+カラフェワイン赤をいただく。宮のたれ、初めて食べたが評判通り美味しい。 | トップページ | 高周波・RFニュース 2025年10月7日 IDTechExが2026-2036の6G予測レポート発行、Silicon LabsがSeries3 SoC発表、Würth Elektronikが868MHz通信モジュール発表、3GPP Release 19解説記事、TDKの無線式振動加速度計、TobiiとSTMの車内センシングソリューション量産 »



コメント