質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.76%

  • Python

    6914questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • 機械学習

    601questions

    機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

カラー画像にPCAの用いる方法について

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 458

trafalbad

score 174

PCAで次元削減を行いたいのですが、どの事例を見てもmnistのようなモノクロ画像の例しかでてきませゆ。カラー画像のような(h,w,3)の画像をPCAに適用するにはどんな形にreshapeすれば良いのでしょうか?

import cv2
import scipy.misc
import os
import sys
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA


a_path='/Users/adidas'
ad = [cv2.imread(a_path+'/'+i) for i in os.listdir(a_path)]

ad_img=[cv2.resize(i,(150,150)) for i in ad if i is not None]
# 次元削減ようにreshape
ad=np.reshape(van_img, (12129,3,150*150))

# 次元削減実行
pca = PCA(n_components=50,svd_solver='full')
pca.fit(ad[1])
x = pca.fit_transform(img)
print(x.shape) 

>>>(3, 3)



pca.fit(ad[1])
>>>PCA(copy=True, iterated_power='auto', n_components=50, random_state=None,
  svd_solver='full', tol=0.0, whiten=False)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

たとえば、MNISTで主成分分析をやるのなら 28 x 28ピクセルの画像を28*28=784次元のベクトルにして入力しているのだと思います。このベクトルを複数枚ある画像分だけ作って、PCAの入力にするというお話ですよね。

カラーでもまったく同じ考え方をすることができて、h*w*3次元のベクトルが作れます。というか、それ以外やりようがありません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/02 22:34

    よく計算量を減らすためにPCAを用いるのは聞いてるのですが、削減後は何を画像として使いますか?tranceformで削減したものを使うとしてもこれは可視化できないので、PCA実行は何を使えばいいのでしょうか?

    キャンセル

  • 2018/06/03 01:48 編集

    PCAをかけた時点でデータはベクトルになっているので、素直に画像として扱うことは難しいかと・・・機械学習などの入力にする場合、計算処理はベクトルのまま取り扱うのではないでしょうか
    ベクトルを逆変換すれば情報の落ちた画像になります。sklearnならinverse_transformというメソッドがありますね
    あるいは、主成分に対応する固有ベクトルを見るということをやっている記事も見かけます。こうすると入れたデータの分散の具合がわかる、とでもいいましょうか

    キャンセル

  • 2018/06/03 09:25

    そんなのがあるんですね、詳しい情報ありがとうございます。あと一つお伺いしたいのですが、inverse_transformで戻したら計算量は少なくなる(計算速度は速くなる)ということで良いのでしょうか?

    キャンセル

  • 2018/06/03 11:48

    基本的になりません。情報が落ちた画像が見れるだけです

    キャンセル

  • 2018/06/03 14:54 編集

    よく聞く計算量を落とすとか計算量を削減するというのはPCAでは何を指すのでしょう?次元削減して計算速度を下げることは無理なのでしょうか?情報の落ちた画像を機械学習で使用しても計算量が変わらなければ意味がない気がしますが

    キャンセル

  • 2018/06/03 16:51

    この例のように計算すればいいのでしょうか?何度もすいません
    https://www.kaggle.com/arthurtok/interactive-intro-to-dimensionality-reduction

    キャンセル

  • 2018/06/04 00:24 編集

    機械学習などの入力に使うのは「transformで削減したもの」ですね。

    そのURLのページには「Visualizing the Eigenvalues」という節がありますが、あれは固有ベクトルです。ああいう画像を見たければ固有ベクトルを(適当にreshapeして)見れば良いです。

    キャンセル

  • 2018/06/04 21:19

    ありがとうございました!

    キャンセル

0

シンプルに考えると要素数h×w×3のベクトルにreshapeするといいと思います。
ただ、カラー画像ということで色合いを強めに意識するのであれば、配列[1]と配列[2]と配列[3]を別々にPCAするのも一案かと思います。その上で、[削減後の次元数,3]の配列として処理するもいいでしょうし、そのまま横に連結してあげてもいいかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/03 23:46

    よく次元削減して、計算量減らすという手法を聞きますが、削減した後はほかの方の回答を見ても計算量は変わらないそうなのですが、次元削減後は何を訓練画像とすれば計算量を減らせるのでしょうか?固有値関係でこういう記事を見つけたのですが、このような手法であってますでしょうか?https://stackoverflow.com/questions/6574782/how-to-whiten-matrix-in-pca?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa

    キャンセル

  • 2018/06/04 01:54

    > よく次元削減して、計算量減らすという手法を聞きます
    ここでいう計算量が何を指し示すのかによると思います。モデルの複雑度を計算量とするのであれば、次元削減はそのまま計算量削減になります。一方、機械学習やニューラルネットワークでいう学習処理の繰り返し回数を計算量とするのであれば、次元削減が繰り返し回数減を保証するものではないので、変わらないという理解になろうかと思います。
    > 次元削減後は何を訓練画像とすれば計算量を減らせるのでしょうか?
    通常PCAを活用する場合、元の画像→PCAモデル作成→次元削減(画像から成分抽出)→タスクに応じたモデル作成、という感じで進めらます。したがって、元の画像から抽出した成分をインプットとしたモデリングと学習を行えば、次元数そのものが減少していることから、モデルの複雑度が緩和しているので計算量が減少しているととらえていいのではないでしょうか。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.76%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Python

    6914questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

  • 機械学習

    601questions

    機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。