「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)
回答2件
あなたの回答
tips
プレビュー