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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

機械学習

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

Python

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

Q&A

2回答

1060閲覧

PCAで次元削減した後にクラスタリングを行いグラフに描画をしたい

kawasemi29

総合スコア1

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

機械学習

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

Python

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

0グッド

0クリップ

投稿2021/10/24 17:23

python

1コード

前提・実現したいこと

excelのデータを利用してクラスタリングをしているプログラミング初心者です。
複数の項目があったのでPCAで次元削減をした後クラスタリングを行い、その結果をグラフの描画を行おうと試みているのですがいろいろ試してみましたが描画されません。
基礎的なところで躓いているかもしれませんがご指摘いただけたら嬉しいです。

発生している問題・エラーメッセージ

TypeError Traceback (most recent call last) <ipython-input-22-81f51b7dc085> in <module> 2 color = ['r', 'b', 'g'] 3 for i in range(3): ----> 4 p = data1[labels == i, :] 5 plt.scatter(p[:, 0], p[:, 1], marker = markers[i], color = color[i]) 6 ~\anaconda3\envs\OpenCV_Face\lib\site-packages\pandas\core\frame.py in __getitem__(self, key) 2900 if self.columns.nlevels > 1: 2901 return self._getitem_multilevel(key) -> 2902 indexer = self.columns.get_loc(key) 2903 if is_integer(indexer): 2904 indexer = [indexer] ~\anaconda3\envs\OpenCV_Face\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance) 2893 casted_key = self._maybe_cast_indexer(key) 2894 try: -> 2895 return self._engine.get_loc(casted_key) 2896 except KeyError as err: 2897 raise KeyError(key) from err pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc() TypeError: '(array([ True, False, False, False, False, False, True, False, False, True, True, False, False, False, True, False, True, True, True, False, False, True, False, False, False, False, True, True, False, False, False, False, True, True, True, True, True, True, False, False, True, False, False, False, True, True, False, False, False, False, False, True, True, False, False, True, True, True, False, False, True, True, False, False, False, False, False, False, False, True, False, False, False, True]), slice(None, None, None))' is an invalid key

該当のソースコード

from sklearn.decomposition import PCA
pca = PCA(n_components=2)
PCA(copy=True, n_components=None, whiten=False)
pca.fit(data1)

data1_2d = pca.transform(data1)
data1_2d = pd.DataFrame(data1_2d)
data1_2d.index = data1.index
data1_2d.columns = ['PC1','PC2']
data1_2d

ax = data1_2d.plot(kind='scatter', x='PC2', y='PC1', figsize=(16,8))

from sklearn.cluster import KMeans
kmeans_model = KMeans(n_clusters=3, random_state=10).fit(data1.iloc[:, 1:])

labels = kmeans_model.labels_

labels
array([0, 2, 2, 1, 1, 1, 0, 2, 2, 0, 0, 1, 1, 1, 0, 2, 0, 0, 0, 1, 1, 0,
2, 1, 1, 1, 0, 0, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1,
0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1,
1, 1, 1, 0, 1, 1, 1, 0])
#ちゃんとクラスターに割り振られてはいます

markers = ["+", "*", "o"]
color = ['r', 'b', 'g']
for i in range(3):
p = data1[labels == i, :]
plt.scatter(p[:, 0], p[:, 1], marker = markers[i], color = color[i])

plt.show()
#ここでエラー発生

### 試したこと 様々なサイトを参考にさせていただき、思いつく内容を複数試したのですが、描画されることはありませんでした。 ### 補足情報(FW/ツールのバージョンなど) 基礎的なところで詰まっている可能性もあると思いますのどうぞお手柔らかにご教示いただければと思います。

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

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

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

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

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

ppaul

2021/10/25 00:49

print(type(data1)) を実行すると何が表示されますか?
jbpb0

2021/10/25 00:53

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください または、 https://teratail.storage.googleapis.com/uploads/contributed_images/56957fe805d9d7befa7dba6a98676d2b.gif を見て、そのようにしてみてください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
jbpb0

2021/10/25 01:36 編集

> data1_2d.index = data1.index をやってることから、「data1」はpandasのデータフレームのようなので、 p = data1[labels == i, :] plt.scatter(p[:, 0], p[:, 1], marker = markers[i], color = color[i]) ↓ 修正 p = data1[labels == i] plt.scatter(p.iloc[:, 0], p.iloc[:, 1], marker = markers[i], color = color[i]) で、どうでしょうか?
jbpb0

2021/10/25 01:57 編集

直接の質問内容のエラーの対策とは違いますが、「data1」はPCAで処理する前のデータなので、 > PCAで次元削減をした後クラスタリングを行い、その結果をグラフの描画 とするのなら、 kmeans_model = KMeans(n_clusters=3, random_state=10).fit(data1.iloc[:, 1:]) ↓ 変更 kmeans_model = KMeans(n_clusters=3, random_state=10).fit(data1_2d) として、PCA処理後の「data1_2d」をクラスタリングで使うのではないのでしょうか?
jbpb0

2021/10/25 01:56

もし、最後の「plt.scatter()」で表示したいのが、PCA処理で2次元化した「ax = data1_2d.plot(...」でプロットしたものを、さらにクラスタリング結果で記号・色で区別したいということなら、私の「2021/10/25 10:25」のコメントの修正の代わりに、 p = data1[labels == i, :] plt.scatter(p[:, 0], p[:, 1], marker = markers[i], color = color[i]) ↓ 修正 p = data1_2d[labels == i] plt.scatter(p.iloc[:, 1], p.iloc[:, 0], marker = markers[i], color = color[i]) としてみてください (私の一つ前のコメントの修正と合わせて)
jbpb0

2021/10/25 02:06

もし、最後の「plt.scatter()」で表示したいのが、PCA処理で2次元化した「data1_2d」ではなく、元データ「data1」の0, 1列目の散布図なら、クラスタリングの入力では kmeans_model = KMeans(n_clusters=3, random_state=10).fit(data1.iloc[:, 1:]) として「data1」の0列目を除外してるのに、グラフ表示では0列目を使うのは不思議な気がする
guest

回答2

0

質問のエラーは、おそらく下記変更で直ると思います

python

1 p = data1[labels == i, :] 2 plt.scatter(p[:, 0], p[:, 1], marker = markers[i], color = color[i])

↓ 修正

python

1 p = data1[labels == i] 2 plt.scatter(p.iloc[:, 0], p.iloc[:, 1], marker = markers[i], color = color[i])

 .

PCAで次元削減をした後クラスタリングを行い、その結果をグラフの描画

とするのなら、下記の変更をして、PCA処理後の「data1_2d」をクラスタリングで使う必要があると思います

python

1kmeans_model = KMeans(n_clusters=3, random_state=10).fit(data1.iloc[:, 1:]) 2```↓ 修正 3```python 4kmeans_model = KMeans(n_clusters=3, random_state=10).fit(data1_2d)

 .
もし、最後の「plt.scatter()」で表示したいのが、PCA処理で2次元化した「ax = data1_2d.plot(...」でプロットしたものを、さらにクラスタリング結果で記号・色で区別したいということなら、この回答の最初の変更の代わりに、下記変更をします

python

1 p = data1[labels == i, :] 2 plt.scatter(p[:, 0], p[:, 1], marker = markers[i], color = color[i])

↓ 修正

python

1 p = data1_2d[labels == i] 2 plt.scatter(p.iloc[:, 1], p.iloc[:, 0], marker = markers[i], color = color[i])

投稿2021/10/28 06:32

jbpb0

総合スコア7651

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

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

0

numpy用とpandas用のコードが混在しているのが原因です。
描画部分のコードはnumpy前提で書かれているのでmarkers = ~行の手前にdata1 = data1.valuesとすれば動作します。

投稿2021/10/25 01:19

can110

総合スコア38266

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問