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

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

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

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

機械学習

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

Python

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

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

Q&A

解決済

1回答

1858閲覧

GMMを使って図をプロットしたい

mayoyo

総合スコア2

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

機械学習

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

Python

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

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

0グッド

0クリップ

投稿2021/06/26 17:13

前提・実現したいこと

混合ガウスモデル(GMM)を使って三次元座標のデータに等高線を引きたいです。
二次元座標のデータの等高線の引き方はわかるのですが、三次元になるとエラーが出てしまいます。
エラーの内容もわかるのですがどのように変更したらいいのかわかりません。(恐らく変数CCが三次元配列なのが原因だと思います。)
また、等高線なしのプロットはできています。
初めての質問なので拙い部分が多いと思いますが、どうかよろしくお願いします。

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

Traceback (most recent call last): File "C:/Users/PycharmProjects/Project/Project.py", line 49, in <module> CS = plt.contour(X_contour,Y_contour,CC,norm=LogNorm(vmin=-CC.min(), vmax=CC.max()),levels=np.logspace(0, 3, 10), cmap="jet") File "C:\Users\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\pyplot.py", line 2489, in contour **kwargs) File "C:\Users\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\__init__.py", line 1565, in inner return func(ax, *map(sanitize_sequence, args), **kwargs) File "C:\Users\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\axes\_axes.py", line 6326, in contour contours = mcontour.QuadContourSet(self, *args, **kwargs) File "C:\Users\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\contour.py", line 822, in __init__ kwargs = self._process_args(*args, **kwargs) File "C:\Users\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\contour.py", line 1419, in _process_args x, y, z = self._contour_args(args, kwargs) File "C:\Users\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\contour.py", line 1477, in _contour_args x, y, z = self._check_xyz(args[:3], kwargs) File "C:\Users\AppData\Local\Programs\Python\Python37\lib\site-packages\matplotlib\contour.py", line 1508, in _check_xyz raise TypeError(f"Input z must be 2D, not {z.ndim}D") TypeError: Input z must be 2D, not 3D

該当のソースコード

Python

1# 1:ライブラリのインポート---------------------------------------------------------- 2import numpy as np # numpyという行列などを扱うライブラリを利用 3import pandas as pd # pandasというデータ分析ライブラリを利用 4import matplotlib.pyplot as plt # プロット用のライブラリを利用 5from sklearn import cluster, preprocessing, mixture # 機械学習用のライブラリを利用 6from mpl_toolkits.mplot3d import Axes3D 7from matplotlib.colors import LogNorm 8import xlrd 9 10# 2:データセットを読み込む---------------------------------------------------------- 11wb = xlrd.open_workbook('C:\Desktop\Data.xlsx') 12sheet = wb.sheet_by_name('sheetExample1') 13n_components=4 14def get_list_2d_all(sheet): 15 return [sheet.row_values(row) for row in range(sheet.nrows)] 16data = get_list_2d_all(sheet) 17data_all = pd.DataFrame(data) 18 19# 3:データの整形------------------------------------------------------------------ 20Fix = pd.DataFrame(data_all) # numpyからpandasへのデータフレームの変換 21Hand = Fix[[1, 2, 3, 4]] 22Hand.columns = [u'frame', u'x_coordinate', u'y_coordinate', u'z_coordinate'] # カラム名をつける(カラム:列. データの項目) 23Coordinate = Hand[["x_coordinate", "y_coordinate", "z_coordinate"]] 24x = Coordinate.iloc[:, 0] # 全ての行の0列目を取得 25nx = x.astype(np.float64) # データ型dtypeの変換 26y = Coordinate.iloc[:, 1] # 全ての行の1列目を取得 27ny = y.astype(np.float64) # データ型dtypeの変換 28z = Coordinate.iloc[:, 2] # 全ての行の2列目を取得 29nz = z.astype(np.float64) # データ型dtypeの変換 30 31# 4:GMMを実施--------------------------------------------------------------------- 32gmm = mixture.GaussianMixture(n_components, covariance_type='tied') # クラスター数を設定し、covariance(共分散)行列を各ガウス分布で異なるものを設定。種類はfull,diag,tied,sphericalがある。 33z_gmm = gmm.fit(Coordinate) # クラスタ化の対象となるデータ配列を指定してクラスタ化を実行させる 34z_gmm = z_gmm.predict(Coordinate) # ある値に対して、それがどの分布が占める割合が高いかをpredictメソッドで計算 35 36# 5: 等高線----------------------------------------------------------------- 37x_contour = np.linspace(-0.3, 0.3) 38y_contour = np.linspace(-0.1, 0.1) 39z_contour = np.linspace(0.5, 1.1) 40X_contour, Y_contour, Z_contour = np.meshgrid(x_contour,y_contour,z_contour) 41XX = np.array([X_contour.ravel(), Y_contour.ravel(), Z_contour.ravel()]).T 42CC = -gmm.score_samples(XX) 43CC = CC.reshape(X_contour.shape) 44 45# 6: 結果をプロット----------------------------------------------------------------- 46fig = plt.figure() 47ax = fig.add_subplot(111, projection='3d') 48CS = ax.contour(X_contour,Y_contour,CC,norm=LogNorm(vmin=-CC.min(), vmax=CC.max()),levels=np.logspace(0, 3, 10), cmap="jet") 49ax.set_xlabel("x") 50ax.set_ylabel("y") 51ax.set_zlabel("z") 52ax.scatter(nx, ny, nz, s=10, c=z_gmm) 53plt.show()

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

ExcelにはB列にフレーム数、C列にx座標、D列にy座標、E列にz座標が入っています。

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

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

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

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

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

mayoyo

2021/06/27 19:09

解答ありがとうございます。 自分の中でも完成図が曖昧なまま質問してしまいました、申し訳ありません。 確かにそもそもmatplotlib.pyplot.contourの使い方が間違っていますね... xy平面、xz平面、yz平面に分けて描画できないか試行錯誤してみます。ありがとうございました。
guest

回答1

0

ベストアンサー

質問者様の誤解で、(X, Y, Z) → CC、の四次元情報を描画しようとしていたようです。
matplotlib.pyplot.contourは、(X, Y) → Z、を描画するもの(Zは高さ)です。

以下がGMMを等高線描画するサンプルコードですので、参考にしてください。
Density Estimation for a Gaussian mixture

投稿2021/06/27 23:26

toast-uz

総合スコア3266

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問