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の車内センシングソリューション量産 »
「パソコン・インターネット」カテゴリの記事
- Google AntigravityにTypeScriptでSパラメータのTouchstoneフォーマットを扱うライブラリを仕様書pdfを読んで作ってもらった。dB, 位相, スミスチャートはPlotlyを使用。これはかなり完成度高い。(2026.05.19)
- CodexにTypeScript用のS高周波パラメータのTouchstoneファイルを扱うライブラリを作ってもらう。最初何も指定しなかったらプロットをSVGでやってくれて、あとでPlotly使ってというとスミスチャートもちゃんと描けた。(2026.05.15)
- ExcelのCopilotにPlanモードが追加されていた。早速変な並びのSパラメータのTouchstoneフォーマットデータ(5ポート)を並び変えてもらうとちゃんと計画を立ててうまくできた。裏でPythonを使っていると言ってきた。(2026.05.13)
- RF Weekly Digest (Gemini 3.1 Pro・Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ)2026/5/3-5/10(2026.05.10)
- Codex(GPT-5.5)でサザエさんじゃんけんの次の手を予測するアプリを作る。時系列予測はまず標準ライブラリのみで実施、一次マルコフがいい結果になったので次はscikit-learn,Keras,Prophetなどを実行。勾配ブースティングが一番よく精度は59.86%に達した。次回はチョキだそうだ。(2026.05.06)
「学問・資格」カテゴリの記事
- 高周波・RFニュース 2026年5月19日 Test and Measurement Forumが開催、TechInsightsがApple Watch Series11 5Gを分解、ATISが5G通信のタイミングについてレポート、KeysightのTDR解説記事など(2026.05.19)
- RF Weekly Digest (Gemini 3.1 Pro・Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ)2026/5/10-5/17(2026.05.17)
- 高周波・RFニュース 2026年5月15日 GapwavesとAT&Sが車載レーダ用アンテナで協業、QualcommがAgentic RANのウェビナー開催、Qorvoが1.8GHz DOCSIC4.0向けアンプ発表、GSAがミッドバンドスペクトラム、NTNのレポート発行など(2026.05.15)
- 高周波・RFニュース 2026年5月14日 Microwave JournalはニューイングランドのRFの歴史・Special Focusは衛星通信等、IEEEのアンテナ向け3Dプリンタのウェビナー開催、アンテナ伝搬講座も日本で開催、機械学習によるSI/PI解析(2026.05.14)
- Google AntigravityにTypeScriptでSパラメータのTouchstoneフォーマットを扱うライブラリを仕様書pdfを読んで作ってもらった。dB, 位相, スミスチャートはPlotlyを使用。これはかなり完成度高い。(2026.05.19)
「日記・コラム・つぶやき」カテゴリの記事
- 高周波・RFニュース 2026年5月19日 Test and Measurement Forumが開催、TechInsightsがApple Watch Series11 5Gを分解、ATISが5G通信のタイミングについてレポート、KeysightのTDR解説記事など(2026.05.19)
- RF Weekly Digest (Gemini 3.1 Pro・Google AI Studio BuildによるAIで高周波・RF情報の週刊まとめアプリ)2026/5/10-5/17(2026.05.17)
- 高周波・RFニュース 2026年5月15日 GapwavesとAT&Sが車載レーダ用アンテナで協業、QualcommがAgentic RANのウェビナー開催、Qorvoが1.8GHz DOCSIC4.0向けアンプ発表、GSAがミッドバンドスペクトラム、NTNのレポート発行など(2026.05.15)
- 高周波・RFニュース 2026年5月14日 Microwave JournalはニューイングランドのRFの歴史・Special Focusは衛星通信等、IEEEのアンテナ向け3Dプリンタのウェビナー開催、アンテナ伝搬講座も日本で開催、機械学習によるSI/PI解析(2026.05.14)
- Google AntigravityにTypeScriptでSパラメータのTouchstoneフォーマットを扱うライブラリを仕様書pdfを読んで作ってもらった。dB, 位相, スミスチャートはPlotlyを使用。これはかなり完成度高い。(2026.05.19)
« ステーキ宮で厚切りサーロインステーキ+カラフェワイン赤をいただく。宮のたれ、初めて食べたが評判通り美味しい。 | トップページ | 高周波・RFニュース 2025年10月7日 IDTechExが2026-2036の6G予測レポート発行、Silicon LabsがSeries3 SoC発表、Würth Elektronikが868MHz通信モジュール発表、3GPP Release 19解説記事、TDKの無線式振動加速度計、TobiiとSTMの車内センシングソリューション量産 »



コメント