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

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

新規登録して質問してみよう
ただいま回答率
85.35%
scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

Python

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

Q&A

解決済

2回答

1710閲覧

reshapeができない

Logarithm

総合スコア80

scikit-learn

scikit-learnは、Pythonで使用できるオープンソースプロジェクトの機械学習用ライブラリです。多くの機械学習アルゴリズムが実装されていますが、どのアルゴリズムも同じような書き方で利用できます。

Python

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

0グッド

0クリップ

投稿2021/11/08 23:28

「Pythonではじめる機械学習」でNMF, PCA, KMeansでの画像の再構築を比較をしたかったのですが、
本のコードを見る前に自分で書いたコードがなぜ動かないのかわかりません。

Python

1from sklearn.decomposition import NMF, PCA 2from sklearn.model_selection import train_test_split 3from sklearn.datasets import fetch_lfw_people 4import mglearn 5import matplotlib.pyplot as plt 6import numpy as np 7from sklearn.cluster import KMeans 8 9 10people = fetch_lfw_people(min_faces_per_person=20, resize=0.7) 11 12mask = np.zeros(people.target.shape, dtype=np.bool) 13 14# targetで出現する人に偏りがあるので、1人あたり50枚までに制限 15image_shape = people.images[0].shape 16 17for target in np.unique(people.target): 18 mask[np.where(people.target == target)[0][:50]] = 1 19 20X_people = people.data[mask] 21y_people = people.target[mask] 22X_people = X_people / 255. 23 24 25X_train, X_test, y_train, y_test = train_test_split( 26 X_people, y_people, stratify=y_people, random_state=0) 27 28#それぞれの次元削減モデルを作成 29nmf = NMF(n_components=100, random_state=0) 30nmf.fit(X_train) 31 32pca = PCA(n_components=100, random_state=0) 33pca.fit(X_train) 34 35kmeans = KMeans(n_clusters=100, random_state=0) 36kmeans.fit(X_train) 37 38#再構築を行う 39X_reconstracted_pca = pca.inverse_transform(pca.transform(X_test)) 40X_reconstracted_kmeans = kmeans.cluster_centers_[kmeans.predict(X_test)] 41X_reconstracted_nmf = np.dot(nmf.transform(X_test), nmf.components_) 42 43#グラフの生成 44fig, axes = plt.subplots(3, 5, figsize=(8, 4), subplot_kw={ 45 'xticks': (), 'yticks': ()}) 46 47#自分で書いたコード 48re_datas = [X_reconstracted_kmeans, X_reconstracted_pca, X_reconstracted_nmf] 49 50for i, (re_data, ax) in enumerate(zip(re_datas, axes.T)): 51 ax[i].imshow(re_data[:, i].reshape(image_shape)) 52plt.show() 53 54#本でのコード 55for ax, re_kmeans, re_pca, re_nmf in zip(axes.T, X_reconstracted_kmeans, X_reconstracted_pca, X_reconstracted_nmf): 56 ax[0].imshow(re_kmeans.reshape(image_shape)) 57 ax[1].imshow(re_pca.reshape(image_shape)) 58 ax[2].imshow(re_nmf.reshape(image_shape)) 59plt.show()

そもそも、X_reconstracted_kmeansやその他pca, nmfも
X_reconstracted_kmeans.reshape(image_shape)できません。
なぜ本のコードはできるのですか?違いはないと思ったのですが。このようなエラーが出ます。

ValueError: cannot reshape array of size 2793570 into shape (87,65)

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melian

2021/11/08 23:37

次元数が足りない様に見えるのですが、もしかして画像データが 494 個あるとか?
jbpb0

2021/11/09 01:30

> #本でのコード の「for ax, re_kmeans, re_pca, re_nmf in zip(...」のすぐ下に、 print(re_kmeans.shape) print(re_pca.shape) print(re_nmf.shape) をインデントを付けて追加して実行したら、「(5655,)」と(何回も)表示されますよね 「image_shape」は「(87, 65)」で、「87*65 = 5655」と一致するので、上記forループ内の「reshape(image_shape)」はできます > #自分で書いたコード の「for i, (re_data, ax) in enumerate(...」のすぐ下に、 print(re_data[:, i].shape) をインデントを付けて追加して実行したら、何て表示されるのかを確認してみてください それが「87*65 = 5655」と一致しなければ、そこでの「reshape(image_shape)」はできません 上記の確認ができたら、同じ場所に print(re_data.shape) をインデントを付けて追加して実行して、その結果を確認して、どうしたらいいのかを考えてみてください
jbpb0

2021/11/09 04:10 編集

> なぜ本のコードはできるのですか?違いはないと思ったのですが。 以下は、この質問のエラーとは直接は関係無い話ですが > #本でのコード のforループでは、各回に X_reconstracted_kmeans、X_reconstracted_pca、X_reconstracted_nmf からそれぞれ1個のデータ(長さが5655)だけが re_kmeans、re_pca、re_nmf に入り、それがループ内で処理されます > #自分で書いたコード のforループでは、 1回目にX_reconstracted_kmeansが全部 2回目にX_reconstracted_pcaが全部 3回目にX_reconstracted_nmfが全部 がre_dataに入るので、その中から必要な個数のデータを取り出すという処理を追加しないと、質問者さんが意図してるような処理にはなりません reshapeのエラーが出なくなるように直すだけではダメだということです
guest

回答2

0

本でのコード

python

1for ax, re_kmeans, re_pca, re_nmf in zip(axes.T, X_reconstracted_kmeans, X_reconstracted_pca, X_reconstracted_nmf):

のすぐ下に、

python

1 print(re_kmeans.shape) 2 print(re_pca.shape) 3 print(re_nmf.shape)

を追加して実行したら、「(5655,)」と(何回も)表示されますよね

「image_shape」は「(87, 65)」で、「87*65 = 5655」と一致するので、上記forループ内の「reshape(image_shape)」はできます

 .

自分で書いたコード

python

1for i, (re_data, ax) in enumerate(zip(re_datas, axes.T)):

のすぐ下に、

python

1 print(re_data[:, i].shape)

を追加して実行したら、何て表示されるのかを確認してみてください
それが「87*65 = 5655」と一致しなければ、そこでの「reshape(image_shape)」はできません

投稿2021/11/16 08:38

jbpb0

総合スコア7653

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

どこかに-1を入れましょう。

python

1>>> a = np.arange(2793570) 2>>> b = a.reshape(87, 65) 3Traceback (most recent call last): 4 File "<stdin>", line 1, in <module> 5ValueError: cannot reshape array of size 2793570 into shape (87,65) 6>>> b = a.reshape(87, 65, -1) 7>>> print(b.shape) 8(87, 65, 494) 9>>> b = a.reshape(87, -1, 65) 10>>> print(b.shape) 11(87, 494, 65) 12>>> b = a.reshape(-1, 87, 65) 13>>> print(b.shape) 14(494, 87, 65)

投稿2021/11/09 00:00

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問