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

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

新規登録して質問してみよう
ただいま回答率
85.50%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

scikit-learn

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

機械学習

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

Python

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

Q&A

解決済

2回答

1420閲覧

Kmeans法などのクラスタリングでプロットされない。

dendenmushi

総合スコア98

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

scikit-learn

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

機械学習

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

Python

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

0グッド

0クリップ

投稿2020/04/06 05:25

編集2020/04/23 00:28

前提・実現したいこと

要素をいくつかもつデータを教師なしの学習としてクラスタリングしたい。
(下記に示したURLを参考にしているため0列目は0と1の2クラス分類としてラベルとしている。後半では使用していません。)

該当のソースコード

test.csv(11row × 784列)(文字数制限のため略)

csv

10,0,1,0,0,1,… # 文字数制限のため略

python

1# http://neuro-educator.com/ml9/ 2 3# 1:ライブラリのインポート-------------------------------- 4import numpy as np #numpyという行列などを扱うライブラリを利用 5import pandas as pd #pandasというデータ分析ライブラリを利用 6import matplotlib.pyplot as plt #プロット用のライブラリを利用 7from sklearn import cluster, preprocessing #機械学習用のライブラリを利用 8from mlxtend.plotting import plot_decision_regions #学習結果をプロットする外部ライブラリを利用 9 10# 2:データセットを読み込む-------------------------------- 11df_wine_all=pd.read_csv('test.csv', header=None) 12 13df_wine=df_wine_all[[0,1,2,3,782,783]] 14 15# df_wine.columns = [u'class', u'color', u'proline'] 16 17df_wine.columns = [u'class', u'1', u'2', u'3',, u'782', u'783'] # 文字数制限のため略 18 19pd.DataFrame(df_wine) #この行を実行するとデータが見れる 20 21# 3:データの整形------------------------------------------------------- 22# X=df_wine[["color","proline"]] 23 24X=df_wine[['1','2','3',,'782','783']] # 文字数制限のため略 25 26sc=preprocessing.StandardScaler() 27sc.fit(X) 28X_norm=sc.transform(X) 29 30# 4:プロットしてみる------------------------------------------ 31%matplotlib inline 32 33x=X_norm[:,0] 34y=X_norm[:,1] 35z=df_wine["class"] 36plt.subplot(2, 1, 1) 37plt.scatter(x,y, c=z) 38plt.show

想定では、11個の点がプロットされているはずなのですが、以下になっていました。
イメージ説明
やはりそのあとのコードでも望みのクラスタリングはできませんでした。

python

1# 解説4:ミニバッチk-meansやk-meansを実施--------------------------------- 2#km=cluster.MiniBatchKMeans(n_clusters=3, batch_size=100) 3km=cluster.KMeans(n_clusters=2) 4z_km=km.fit(X_norm) 5# 5: 結果をプロット----------------------------------------------- 6plt.subplot(2, 1, 2) 7plt.scatter(x,y, c=z_km.labels_) 8plt.scatter(z_km.cluster_centers_[:,0],z_km.cluster_centers_[:,1],s=250, marker='*',c='red') 9plt.show

イメージ説明

参考にしたコード

参考にしたURL
上記のサイトを利用していました。
たくさんの要素を持つデータをクラスタリングするには何が不足しているのでしょうか。
よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

win10
google colab
python 3.7

20200406 追記

teratailにipynbをアップするにはどのようにしたらよいのでしょうか。もし可能ならその方がすぐにコード実行して頂けると思いました。

20200411 X_norm print表示追加

イメージ説明

20200411 22:35

ipynb souce code
test.csv
の共有アドレスです。
https://drive.google.com/file/d/1MCnKuZHdJTkzBalz-DL6l8zftFeW5gNF/view?usp=sharing
https://drive.google.com/file/d/1lNMzApau8gFsYXQsTGUfxFRTtnsGSIxg/view?usp=sharing
閲覧とダウンロードが可能です。

20200412 xlim利用結果追加

イメージ説明

20200419 表幅調整

(2,1,1)へ変更後
イメージ説明

20200423 訂正

当初こちらで質問するためにデータ量をアップしやすい軽いものをアップしてしまい大変申し訳ありませんでした。
実際のデータが以下になります。
https://drive.google.com/file/d/1KSUjqC85fqnaxjTiRJbviPD8OlEW7Z_x/view?usp=sharing

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

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

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

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

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

tiitoi

2020/04/06 06:08 編集

> teratailにipynbをアップするにはどのようにしたらよいのでしょうか。もし可能ならその方がすぐにコード実行して頂けると思いました。 Google Colab に共有する機能がありますね https://www.codexa.net/how-to-use-google-colaboratory/#i
dendenmushi

2020/04/07 22:30

ありがとうございます。アップします。
guest

回答2

0

根本的に、何を表示しようとしているのかが不明でした。

参考元のURLでは、学習データとして色とプロリン(という成分)の2変数から、ワインの品種を推定しようとしているわけですよね。
で、

x=X_norm[:,0] y=X_norm[:,1]

のインデックスにある0, 1はそれぞれ色成分とプロリン成分を指していますね。

dendenmushiさんが改造されたコードだと、学習データとして783個のデータを使おうとしている。
この時にX_norm[:,0],X_norm[:,1]はその783個のうちの最初の2個を指しています。
これを二次元平面にプロットしても意味のある絵にはならないのではないでしょうか。

X['1'],X['2']はそれぞれ全部0,全部1というデータです。
StandardScalerは平均が0になるように変換を行うため、結果どちらも全部0となって今のプロット結果が得られています。

投稿2020/04/21 11:47

sin_250

総合スコア112

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

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

dendenmushi

2020/04/22 04:17 編集

>根本的に、何を表示しようとしているのかが不明でした ご指摘ありがとうございます。私はワインのコードを参照しているのですが、実際に利用したいのは、onehotベクトルの別データになります。 年齢 x<20 かどうかで YES=0,No=1 20<=x<40 かどうかで YES=0,No=1 40<=x<60 かどうかで YES=0,No=1 職業 花屋さんかどうかでYES=0,No=1 アパレルかどうかでYES=0,No=1 これらの結果が、1ユーザーの特徴ベクトル[0,0,1,0,1,0,1,0,1,1,1,1,0,0,0,0,0,0] になっています。その要素が784あります。 それらを使って学習データなしのsklearnを利用した、全ユーザーのクラス分類を行いたく、それを図表に2次元プロットで表の中に描けないかと思いました。 2クラス分類しようと思えば以下のように km=cluster.KMeans(n_clusters=2) 20クラス分類であれば km=cluster.KMeans(n_clusters=20) と記載すれば図表に2つの星マーク、もしくは20個の星マークが現れることを想定していました。 目的はベクトルのクラス分類になります。もしやり方など根本的に違っていればアドバイス頂けないでしょうか。よろしくお願い致します。
sin_250

2020/04/22 12:52 編集

すみません、おっしゃってることが全くわからないです。 おっしゃるようなデータフォーマットであれば、データは5次元、例えば18才の花屋は(1, 0, 0, 1, 0)となる(最初の1がx<20, もうひとつの1が花屋に対応)となるんじゃないかと思いますが、test.csvが11行×784列なのはなぜでしょうか? > これらの結果が、1ユーザーの特徴ベクトル[0,0,1,0,1,0,1,0,1,1,1,1,0,0,0,0,0,0] これは要素が18個ありますが、これはtest.csvのどこに対応するものでしょうか。 <追記> ごめんなさい、上記はYes=1,No=0で書きました。
dendenmushi

2020/04/23 00:12 編集

混同してしまうことを言ってしまいました。申し訳ありません。18個というのは例のために仮にあげただけでした。整理しますと以下がtest.csvになります。 [[1,0,0,1,0,…784個YESNOの回答が続きます…0,0,1], [0,1,0,0,1,…784個YESNOの回答が続きます…0,0,0],  ・  ・ 11人分続きます。  ・ [0,0,1,0,1,…784個YESNOの回答が続きます…0,0,1]] その他不明点あればすぐに回答致します。 よろしくお願い致します。
dendenmushi

2020/04/23 00:18

本当にごめんなさい。test.csvをこちらで質問を簡易的にするために11行に短縮してしまったものをアップしてしまいました。本当のデータをアップします。申し訳ありません。
sin_250

2020/04/25 05:40

新しいデータは30000行×784列で、1個あたりのデータが784次元で、30000個のデータがある、ということですね。。。 結局、dendenmushiさんが何をしたいに依ります。 ワインのサンプルの場合は、あらかじめデータの中から、ワインの品種を当てるには色とプロリンの情報が有用だということが分かっていて、 縦軸、横軸をそれぞれ色とプロリンに割り当て、点の色で品種を表現するという可視化をしていました。 つまり2次元で同じように可視化したいのが目的なら、同じように784次元のなかから有用な2次元を取り出してくる必要があります。 784次元のうち、どの次元がクラスタリングする上で有用なのか、というのは、データに対する理解度、クラスタリングで分離したい情報は何なのか、などに依るので簡単な答えはないと思います。
dendenmushi

2020/04/25 10:56 編集

ありがとうございます。そういうことだったのですね… 私が行いたいことは、人間の目では見えない784次元の特徴をもつベクトルを教師データまったくなく(ラベルが決められていなく)、クラス分類ができないものかと考えていました。 つまり、30000個のデータが280個、840個、3200個、19000個、4000個、2680個のように、6種類くらいの特徴分割をするのが目的でした。 そういった考えですと強化学習のような学習データなしでのクラス分類のようになると思うのですが、k-meansではそもそもそういったクラス分類はできないのでしょうか。これが本来の目的でした。one-hotで表現された多次元の教師データなしのクラス分類です。 どういった方法があるのでしょうか。助言頂けないでしょうか。よろしくお願い致します。 (その延長線上の目的として可視化ができて色分けができたらいいなと思っていましたので、視覚的表示にこだわっているわけではありませんでした。できればプロット表示できたらと思っておりました…。)
sin_250

2020/04/25 11:14

いえ、784次元でもクラスタリング処理を試みることは可能です。 ただ最初のご質問にあるような可視化の仕方は無理、ということです。 K-meansでも784次元のデータに対して教師なしのクラス分類を試みることは理屈上は可能です。 ただ、(私も実務でそこまで機械学習をしているわけではないのであまり明言できないですが) 「次元の呪い」というものがあるので、まともな結果が得られるかは?です。
guest

0

ベストアンサー

X_normをprint等で直接見た結果と、散布図を見比べるのがまず先決では?

データがおかしいかスケールが狭すぎるかのどちらかではという感じはするのですが。

投稿2020/04/09 18:24

hayataka2049

総合スコア30933

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

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

dendenmushi

2020/04/11 13:10

回答頂きありがとうございます。X_normのprint表示をしました。今該当ソースコードをGoogle Driveにて共有できるよう設定致します。もしよろしければそちらもよろしくお願い致します。
hayataka2049

2020/04/11 13:39

plt.xlim(x.min()-0.5, x.max()+0.5) plt.ylim(y.min()-0.5, y.max()+0.5) を試してみては?
dendenmushi

2020/04/11 13:47

ありがとうございます。 ''' # 4:プロットしてみる------------------------------------------ %matplotlib inline x=X_norm[:,0] y=X_norm[:,1] x = plt.xlim(x.min()-0.5, x.max()+0.5) y = plt.ylim(y.min()-0.5, y.max()+0.5) z=df_wine["class"] plt.subplot(2, 1, 1) plt.scatter(x,y, c=z) plt.show ''' ValueError: 'c' argument has 11 elements, which is inconsistent with 'x' and 'y' with size 2. となってしまいました。データも添付いたしました。要素が多すぎるということなのでしょうか。
hayataka2049

2020/04/11 13:48

x, yに代入しないでください。
dendenmushi

2020/04/19 12:57

お返事こちらにせずに本文に書いてしまっておりました # 4:プロットしてみる------------------------------------------ %matplotlib inline x=X_norm[:,0] y=X_norm[:,1] plt.xlim(x.min()-0.5, x.max()+0.5) plt.ylim(y.min()-0.5, y.max()+0.5) z=df_wine["class"] plt.subplot(2, 1, 1) plt.scatter(x,y, c=z) plt.show こちらでも表示は変わりませんでした。結果出し方が間違っておりますでしょうか。 よろしくお願い致します。
hayataka2049

2020/04/19 14:00

subplot(2, 1, 1)してからにしてみてください
dendenmushi

2020/04/19 14:36

ありがとうございます。plotの表示がいけなかったということでしょうか。変化がないようです。結果を本文へ追記致しました。
hayataka2049

2020/04/20 06:47

subplotを実行したあとに値の範囲を設定してください。
dendenmushi

2020/04/21 00:35

基本的なところを勉強させて下さい。どうも言われた内容を理解して実装できなく値の範囲設定など学んできます。しばらくしましたら更新致します。その際は再度質問させて下さい。どうかよろしくお願い致します。
hayataka2049

2020/04/21 05:35

そんなに難しいことを書いているつもりはなかったです。 %matplotlib inline x=X_norm[:,0] y=X_norm[:,1] z=df_wine["class"] plt.subplot(2, 1, 1) plt.xlim(x.min()-0.5, x.max()+0.5) plt.ylim(y.min()-0.5, y.max()+0.5) plt.scatter(x,y, c=z) plt.show() としてみてくださいというコントです。
dendenmushi

2020/04/22 04:07

ありがとうございます。結果は変わらないようです。やはり私のデータがおかしいのでしょうかね…
hayataka2049

2020/04/22 16:46

データを細かく見てみました。そもそもX_norm[:,0]とX_norm[:,1]はすべて同じ値なので、その結果で正常だと思います。
dendenmushi

2020/04/23 00:19

本当にごめんなさい。ここで質問するためにデータ量を少なくしようとあえて行数を少なくしたtest.csvをあげてしまっていました。実際のデータを上げます。申し訳ありませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問