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

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

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

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

Q&A

解決済

2回答

1001閲覧

指定の散布図においてK-meansを用いてクラスタリングを行いたい

S.K12

総合スコア16

Python

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

0グッド

0クリップ

投稿2020/09/25 11:25

前提・実現したいこと

下記の散布図においてK-meansを用いてクラスタリングを行いたいです。
イメージ説明

しかし自分では2次元配列で入力しているつもりなのですが、
1次元配列になっているというエラーが出ていて困っています。

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

ValueError Traceback (most recent call last) <ipython-input-17-2d81c6cf963b> in <module> 23 24 ---> 25 t(1) <ipython-input-17-2d81c6cf963b> in t(n) 14 def t(n): 15 km = KMeans(n_clusters=3,init='random',n_init=10,max_iter=n,tol=1e-04,random_state=1) ---> 16 cluster = km.fit_predict(X) 17 plt.scatter(data[cluster==0,0],data[cluster==0,1],c='red',marker='.',label='1') 18 plt.scatter(data[cluster==1,0],data[cluster==1,1],c='black',marker='.',label='2') ~\anaconda3\lib\site-packages\sklearn\cluster\_kmeans.py in fit_predict(self, X, y, sample_weight) 1103 Index of the cluster each sample belongs to. 1104 """ -> 1105 return self.fit(X, sample_weight=sample_weight).labels_ 1106 1107 def fit_transform(self, X, y=None, sample_weight=None): ~\anaconda3\lib\site-packages\sklearn\cluster\_kmeans.py in fit(self, X, y, sample_weight) 989 ) 990 --> 991 X = self._validate_data(X, accept_sparse='csr', 992 dtype=[np.float64, np.float32], 993 order='C', copy=self.copy_x, ~\anaconda3\lib\site-packages\sklearn\base.py in _validate_data(self, X, y, reset, validate_separately, **check_params) 418 f"requires y to be passed, but the target y is None." 419 ) --> 420 X = check_array(X, **check_params) 421 out = X 422 else: ~\anaconda3\lib\site-packages\sklearn\utils\validation.py in inner_f(*args, **kwargs) 71 FutureWarning) 72 kwargs.update({k: arg for k, arg in zip(sig.parameters, args)}) ---> 73 return f(**kwargs) 74 return inner_f 75 ~\anaconda3\lib\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator) 618 # If input is 1D raise error 619 if array.ndim == 1: --> 620 raise ValueError( 621 "Expected 2D array, got 1D array instead:\narray={}.\n" 622 "Reshape your data either using array.reshape(-1, 1) if " ValueError: Expected 2D array, got 1D array instead: array=[930.49374428 930.49374864 930.49376025 930.49377914 930.50016198 930.50047003 930.51001972 930.51050733]. Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.

該当のソースコード

Python

1import numpy as np 2import matplotlib.pyplot as plt 3from sklearn.cluster import KMeans 4 5 6X,Y =[ [930.49374428, 930.49374864, 930.49376025, 930.49377914, 930.50016198, 930.50047003, 930.51001972, 930.51050733],[0.00435079, 0.00435072, 0.00435065, 0.00435058, 0.00434775, 0.00434768, 0.00434594, 0.00434587]] 7 8 9plt.scatter(X,Y) 10plt.grid() 11plt.show() 12 13 14def t(n): 15 km = KMeans(n_clusters=3,init='random',n_init=10,max_iter=n,tol=1e-04,random_state=1) 16 cluster = km.fit_predict(X) 17 plt.scatter(data[cluster==0,0],data[cluster==0,1],c='red',marker='.',label='1') 18 plt.scatter(data[cluster==1,0],data[cluster==1,1],c='black',marker='.',label='2') 19 plt.scatter(km.cluster_centers_[:,0],km.cluster_centers_[:,1],marker='X',c='blue',label='centroids') 20 plt.legend() 21 plt.grid() 22 plt.show() 23 24 25t(1)

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

windows 64bit
Anaconda

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

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

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

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

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

guest

回答2

0

ベストアンサー

XとYから2次元のarrayを作ればいいのでは。

Python

1XY = np.concatenate([np.array(X).reshape(-1, 1), np.array(Y).reshape(-1, 1)], 1) 2print(XY) 3array([[9.30493744e+02, 4.35079000e-03], 4 [9.30493749e+02, 4.35072000e-03], 5 [9.30493760e+02, 4.35065000e-03], 6 [9.30493779e+02, 4.35058000e-03], 7 [9.30500162e+02, 4.34775000e-03], 8 [9.30500470e+02, 4.34768000e-03], 9 [9.30510020e+02, 4.34594000e-03], 10 [9.30510507e+02, 4.34587000e-03]])

XYから3個のクラスタリングすると、

Python

1km = KMeans(n_clusters=3,init='random',n_init=10,max_iter=1,tol=1e-04,random_state=1) 2cluster = km.fit_predict(XY) 3print(cluster) 4[0 0 0 0 2 2 1 1]

散布図のグラフと一致するようです。

投稿2020/09/25 12:48

technocore

総合スコア7225

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

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

S.K12

2020/09/25 16:05

御回答戴いた内容と元ソースコードを合わせていったら理想通りの出力が出来ました。 reshapeをあまり理解できていなかったのですが、書いて戴いたコードをいじっていたら何となく理解出来たので凄く助かりました。 有難う御座います。
guest

0

X,Y =[ [930.49374428, 930.49374864, 930.49376025, 930.49377914, 930.50016198, 930.50047003, 930.51001972, 930.51050733],[0.00435079, 0.00435072, 0.00435065, 0.00435058, 0.00434775, 0.00434768, 0.00434594, 0.00434587]]
cluster = km.fit_predict(X)

どう見ても一次元データしか与えられてないです。

投稿2020/09/25 11:52

KojiDoi

総合スコア13671

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

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

S.K12

2020/09/25 12:01

回答有難う御座います。 ご指摘を見て cluster = km.fit_predict(X) だけではXの配列の方のみ認識されており cluster = km.fit_predict(X,Y) と書き直せばエラーがなくなるのかと思い、直してみたのですが、 同様のエラーが発生してしまいました。 お手数ですが、もう少し詳しく教えて戴けると有難いです。
S.K12

2020/09/25 15:45

公式説明を読んでも難しくてまだちょっと理解が追い付いていませんが 理解できるように何度も読み返してみようと思います。 有難う御座いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問