« THE FIRST SLAM DUNK re:SOURCE を買った。あのピアスが収録されている(やっぱりこれ読んだことある。覚えてた!)。井上先生がここまで関わっていたのか!というのも驚きだし、最後の言葉「絵がうまくなった」にも衝撃。井上先生、どこまで行ってしまうんですか… | トップページ | 新型コロナウイルス、日本の陽性者数&ワクチン接種者数総計をプロット&中国、韓国、アメリカ、ドイツ、フランス、イギリスの陽性者数もプロット(12/26更新)日本も急増でアメリカと陽性者人口比で近づく、、、が中国がそれをはるかに上回る感染爆発。 »

2022年12月26日 (月)

JavaScriptの数値計算ライブラリmathjsを使う(6) 特異値分解(SVD)、主成分分析(PCA)を計算してみる。このココログでも計算できるようにした。

今回でmath.jsを使うシリーズは6回目。math.jsには固有値解析はあるのだが特異値分解そのものの関数はない。が2回固有値解析すればいいだけなので簡単にできそう。

ちょうどVisual C#でも同じことをやっていた。

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

ここで使った奥村晴彦先生の例題を使おう。

https://okumuralab.org/~okumura/stat/biplot.html

ではこんな感じで計算できる。ファイルは先頭行、列に見出しがあるようなファイルならこの例題に限らずOKのはず。

Javascript_svd1

Javascript_svd2

ただし固有値が小さい方から並ぶということだけに注意(並べ替えるのがめんどくさい、、、)

テキストでも書いておきます。

   <input type="file" class = "datafile"><br>
    <textarea class = "textarea" cols="40" rows="20"></textarea>

    <script src="https://unpkg.com/mathjs@11.4.0/lib/browser/math.js"></script>
    <script>
        'use strict'
        const datafile = document.querySelector(".datafile")
        datafile.addEventListener("change", SVD)
        const textarea = document.querySelector(".textarea")

        function SVD() {
            const filename = datafile.files[0]
            const reader = new FileReader()
            reader.readAsText(filename)
            reader.addEventListener("load", () => {
                let lines = reader.result.split(/\r\n|\n/)
                let data = []
                for (let i = 1; i < lines.length; i++) {
                    let cells = lines[i].split(',')
                    if (cells.length != 1) {
                        data[i-1] = []
                        for (let k = 1; k < cells.length; k++) {
                            data[i-1][k-1] = cells[k]
                        }
                    }
                }

                let average = []
                for (let j = 0; j < data[0].length; j++) {
                    average[j] = 0.0
                    for (let i = 0; i < data.length; i++) {
                        average[j] += data[i][j]/47
                    }
                    for (let i=0; i < data.length; i++) {
                       data[i][j] -= average[j]
                    }
                }
               

                const dataT = math.transpose(data)
                const ATA = math.multiply(dataT, data)
                const AAT = math.multiply(data, dataT)
                const ans = math.eigs(ATA)
                const ans2 = math.eigs(AAT)

                let sv=""
                for (let i =0; i < ans.values.length; i++) {
                    sv += math.sqrt(ans.values[i])/math.sqrt(47-1)+ "\n"
                }
                   
                textarea.innerHTML = sv + "\nU=" + math.format(ans2.vectors,6) + "\nVt=" + math.format(ans.vectors,6)
            })
        }


    </script>

そしてこのココログでも計算できるようにした。


過去のもの

JavaScriptの数値計算ライブラリmathjsを使う(1) まずは行列演算。LU分解で一次方程式を解き、逆行列と行列式を求める。このココログで直接計算できる機能も付けた。

JavaScriptの数値計算ライブラリmathjsを使う(2) 次は複素数演算。四則演算や平方根、べき乗、expなどが簡単にできる。このココログで直接計算できる簡易電卓を作ってみた。

JavaScriptの数値計算ライブラリmathjsを使う(3) Plotlyを併用して関数をグラフ表示する。ココログでもグラフ表示できるようになった。

JavaScriptの数値計算ライブラリmathjsを使う(4) 高速フーリエ変換(FFT)を計算してココログにplotlyでグラフ表示できるようにする。。

JavaScriptの数値計算ライブラリmathjsを使う(5) 複素行列の固有値・固有ベクトルを求める。ココログで計算できるようにした。

« THE FIRST SLAM DUNK re:SOURCE を買った。あのピアスが収録されている(やっぱりこれ読んだことある。覚えてた!)。井上先生がここまで関わっていたのか!というのも驚きだし、最後の言葉「絵がうまくなった」にも衝撃。井上先生、どこまで行ってしまうんですか… | トップページ | 新型コロナウイルス、日本の陽性者数&ワクチン接種者数総計をプロット&中国、韓国、アメリカ、ドイツ、フランス、イギリスの陽性者数もプロット(12/26更新)日本も急増でアメリカと陽性者人口比で近づく、、、が中国がそれをはるかに上回る感染爆発。 »

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

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

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

コメント

コメントを書く

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

« THE FIRST SLAM DUNK re:SOURCE を買った。あのピアスが収録されている(やっぱりこれ読んだことある。覚えてた!)。井上先生がここまで関わっていたのか!というのも驚きだし、最後の言葉「絵がうまくなった」にも衝撃。井上先生、どこまで行ってしまうんですか… | トップページ | 新型コロナウイルス、日本の陽性者数&ワクチン接種者数総計をプロット&中国、韓国、アメリカ、ドイツ、フランス、イギリスの陽性者数もプロット(12/26更新)日本も急増でアメリカと陽性者人口比で近づく、、、が中国がそれをはるかに上回る感染爆発。 »

最近の記事

最近のコメント

2023年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        
フォト
無料ブログはココログ