主成分分析を使うのですが、主成分分析について検索すると画像に対して主成分分析している記事をよく見ます。
自分でこうしたプログラムをCで書きたい(C++は触ったことがなく、そうした記事のプログラムはちょっと触った程度では読めなかったです)のですが、どうも自分でプログラムを書いていてうまく行きません。
プログラム自体がかけないというより、画像で主成分分析を行う場合なにをどこに当てはめるのかがわかりません。
具体的に言うと説明変数の項目、データがなにに当たるのかがわかりません。
主成分分析について詳しい方、C言語またはわかりやすい表現でどうか教えて下さい。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
画像で主成分分析を行う場合なにをどこに当てはめるのかがわかりません。
具体的に言うと説明変数の項目、データがなにに当たるのかがわかりません。
画像は色情報をもつピクセルデータの2次元集合とみなせます。いわゆるフルカラー画像の場合、ピクセルデータ1個は(r,g,b)といった3要素ベクトルで表現できます。また画像には幅W×高さH分だけのピクセルデータが含まれます。以上より、1つの画像を 3 × W × H 個の値で構成された多次元ベクトルとみなせます。
画像に主成分分析(PCA; principal component analysis)を適用する場合、上記の(3xWxH)次元ベクトルを対象データとみなすのが一般的でしょう。
投稿2015/10/02 02:58
総合スコア6191
0
もう解決済みのようですが、主成分分析を触ったことがあるので回答します。
(すでに回答されている方の説明の情報を少し整理するという意味で。)
最初に、主成分分析に適用する画像としては「白黒画像」(グレースケールの画像)のみをまずは考えられると良いと思います。yohhoyさんのおっしゃる通り画像データは色要素×平面のデータなので、例えば色の表現にrgbを使用すれば3parameter × 16pixel × 16 pixel = 768個の要素で1枚の画像が構成されるようになり、初学者が扱うにはちょっと厄介です。
さて、このグレースケールの白黒画像は各セルに色の濃度が格納された行列形式のデータとみなすことができます。これを今度は1列に並べ直してベクトル形式のデータに変換します。
そして、ここからよく誤解されることがあるのですが、画像データに主成分分析を実行するときは「1枚の画像データを圧縮する」のではなく「多数の画像データを圧縮する」ということをします。すなわち、ベクトル形式に変換された多数の画像データをデータ行列にし、基準化(平均を0にする)、分散共分散行列の固有値・固有ベクトル or データ行列の特異値分解などを実施し、主成分ベクトルの抽出や、重要な主成分ベクトルだけで張られる空間へのデータの圧縮等を行うものです。
すなわち、
・データ:多数の画像
・説明変数:各セル内の色の濃度
(主成分分析では「説明変数」ではなく、単に「変数」と呼ぶのが一般的です。「説明変数」は回帰分析において「目的変数」の非確率要素を「説明」するための変数という意味だと理解されれば良いかと。)
ということになります。
以上、ご参考まで。
投稿2015/10/10 16:00
総合スコア104
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
私は 主成分分析 についても、画像処理 や C言語によるプログラミング についても素人ですが…
まず、理解を深めるには、もっと目的を絞った方が良いと思います。
0. 「画像に対して主成分分析」といっても分野がとても広い
0. 主成分分析や画像処理にとって必ずしもC言語が向いている訳ではない
1)画像処理と主成分分析
noobさんもご存知のように、主成分分析とは
多次元のデータを情報量をなるべく落とさずに低次元に要約する手法
です。 (ご参考)
デジカメの進歩に象徴されるように、画像データは「解像度×色の表現力」が爆発的に増大して、処理しなければならないデータ量は増加の一途を辿っています。そこで「低次元に要約」する技術が重要になってくる訳ですが…大きく分けると
画像処理 → 画質改善、画質を落とさずデータ圧縮、などを目的とした「フィルタリング」
⇒ 例)[情報源を再構成できる独立成分の抽出とその工学的応用](http://www.taf.or.jp/report/21/pdf/p426.pdf) (PDF)
画像認識 → 顔認識、手書き文字認識、などを目的とした「自動認識」
⇒ 例)[主成分分析PCAを用いて手書き数字を分析する。その1](http://qiita.com/kenmatsu4/items/c61ce5d85667f499c3c8)
に大別されます。どちらも背景となる技術は同じなのですが具体例を挙げて勉強した方が理解が進むので、現時点でより関心のある方を当面の教材として選ばれると良いと思います。
2)主成分分析を用いた処理のプログラミングについて
主成分分析は統計学の基礎技術なので、結果を得ることだけが目的なのであれば、統計解析専用のソフトを使用したり、自らプログラミングしたいならRのような統計処理用のプログラミング言語を使用するのが得策です。
しかしながら、今回の場合は「プログラムをCで書きたい」とのご希望ですので、その意味では選択の余地はありませんね。
とは言え、主成分分析のためのデータ処理は、実際のところ「行列計算」に過ぎないのですが、「数値計算」というのはそれだけで一つの研究分野になっているほど奥が深く難しい問題なので、全てを独力でプログラミングすることは必ずしも得策ではなく、一般的には専門家が開発した「ライブラリ」を使用します。
有償・無償のライブラリがいくつもあるようですが、一度「GNU Scientific Library(GSL)」について調べてみられてはいかがでしょうか。 (ご参考)
以上、ご参考まで。
投稿2015/10/01 17:40
総合スコア5936
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。