実現したいこと
はじめまして。プログラミング素人の社会人です。
現在、pythonではじめる機会学習という書籍で、scikit-learnを用いた主成分分析の部分を勉強しています。
主成分分析は、基本的には次元の削減を目的としている理解です。
かつ、画像における次元とは、ピクセル数のことだと思っています。
この理解でいくと、主成分分析では、元のピクセル数以下の任意の次元に次元削減できるはずです。
しかしながら、実際に実装するとピクセル数以下ではなく、画像データの数(サンプル数)以下の次元という制約がありました。
発生している問題・分からないこと
主成分分析をした結果の次元数を指定するn_componentsにおいて、思ったとおりの数を指定できません。
⚫︎データ
・データセット:fetch_lfw_people
・形状:people.image.shape:(32, 87, 65) #87×65の白黒画像が32枚。
⚫︎私の認識
87×65の画像なので、計5655のピクセル(=特徴量、次元)があります。(これは確認済みです。)
主成分分析は理論上データの項目数までの主成分を作成可能なので、5655までならn_componentsに指定できると思っていました。
しかしながら、実際は24までしか指定できません。(32枚の画像をtrain_test_splitで分割しているので、この24は画像の枚数です。)
なぜ、画像の数に依存するのですか?
根本的に、主成分分析の理解が足りていないのだと思っています。
エラーメッセージ
error
1ValueError: n_components=100 must be between 0 and min(n_samples, n_features)=24 with svd_solver='full'
該当のソースコード
people = fetch_lfw_people(min_faces_per_person=2, resize=0.7) image_shape = people.images[0].shape print("people.image.shape:{}".format(people.images.shape)) print("Number of classes:{}".format(len(people.target_names))) counts = np.bincount(people.target) for i, (count, name) in enumerate(zip(counts, people.target_names)): print("{0:25} {1:3}".format(name, count), end=' ') if (i+1)%3 == 0: print() mask = np.zeros(people.target.shape, dtype=bool) for target in np.unique(people.target): mask[np.where(people.target == target)[0][:50]] = 1 X_people = people.data[mask] y_people = people.target[mask] print(X_people.shape) print(y_people.shape) X_train, X_test, y_train, y_test = train_test_split( X_people, y_people, stratify=y_people, random_state=0 ) pca = PCA(n_components=100, whiten=True ,random_state=0).fit(X_train) #ここのn_componentsは5655(87×65)までの値なら指定できるのでは? X_train_pca = pca.transform(X_train) X_test_pca = pca.transform(X_test) print("X_train_pca.shape:{}".format(X_train_pca.shape))
試したこと・調べたこと
上記の詳細・結果
2時間ネットで調べましたが、わかりませんでした。
ネットでは画像の主成分分析を行っている記事がいくつかあり、それらの主成分数(n_components)は実際に画像数より多いものがありませんでした。
確かに、画像数を超えるn_componentsの指定というのはできなさそうです。
補足
特になし

0 コメント