質問するログイン新規登録

Q&A

解決済

1回答

2567閲覧

k-means法を用いた時系列クラスタリングのデータ型について

tshu_m421

総合スコア5

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

機械学習

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

Python

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

データマイニング

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

0グッド

0クリップ

投稿2021/09/18 18:12

0

0

前提・実現したいこと

tslearnを使った時系列データのk-means法によるクラスタリングにおいて、ユークリッド距離からクラスタリングをしたい考えています。
しかしながら、現在、ユークリッド距離からクラスタリングするためのデータの前処理の段階でつまづいています。

ユークリッド距離でクラスタリングする前に、動的時間伸縮法を用いたクラスタリングをしていました。その際には、下のデータ(※1)のように配列内の要素数が異なる場合には”nan”を入れえう前処理をして、クラスタリングしていました。(動的時間伸縮法では、上手く分類出来ませんでしたが、、、)
しかしながら、ユークリッド距離からクラスタリングする際には、空白文字(”nan”)はエラーとなってしまいます

以下のデータ(※1)から、”nan”を取り除いて、ユークリッド距離からクラスタリングを実行できるデータを作成したいです。
理想は、※1のデータのように3次元の配列にしたいのですが、nanを取り除くと要素数が異なってしまう為、現実的には厳しいと思います。。。
他に、何か良い方法がありましたら、教えていただけますでしょうか。
よろしくお願いします。

※1 動的時間伸縮法で使用したデータ(shape=(1200, 202, 2)) [[[1978.13506899 1038.26637706] [2321.18041226 1106.97860927] [2317.69722515 1107.01611793] ... [ nan nan] [ nan nan] [ nan nan]]         ・         ・         ・ [[1921.43042307 1049.15807708] [2194.87333696 1104.94944899] [1920.8201568 1049.00151147] ... [ nan nan] [ nan nan] [ nan nan]]]

tslearnを使った時系列データのk-means法によるクラスタリングのコード

Python

1kmeans = TimeSeriesKMeans(n_clusters=5,#クラスタ数 2 metric="euclidean",#ユークリッド距離 3 n_init=5, 4 verbose=True, 5 max_iter_barycenter=100, 6 ) 7 8pred = kmeans.fit_predict(Points)

※Pointsは、numpy配列(3次元)のデータの予定(理想は※1のデータから”nan”を削除したもの)

試したこと

リスト型でデータの前処理も試したが、上手くいかなかった。

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

Python(3.9)
tslearn(0.5.2)
Jupiternotebook(6.4)

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

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

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

guest

回答1

0

ベストアンサー

こちらの記事が参考になります。

NumPyの配列ndarrayの欠損値np.nanを含む行や列を削除

しかし、2次元の例なので、記事の記載そのままでは使えません。質問者様のケースにあてはめるには、以下のように応用すると良いでしょう。3次元の任意の1方向でnanを含む行をまるごと削除することができます。

Python

1import numpy as np 2 3x = np.arange(24, dtype=float).reshape(3, 2, -1) 4x[1, 1, 3] = np.nan 5x[2, 1, 2] = np.nan 6x[2, 1, 3] = np.nan 7 8# x の内容 9#[[[ 0. 1. 2. 3.] 10# [ 4. 5. 6. 7.]] 11# [[ 8. 9. 10. 11.] 12# [12. 13. 14. nan]] 13# [[16. 17. 18. 19.] 14# [20. 21. nan nan]]] 15 16# 0次元方向で nan が存在する部分を削除 17y0 = x[~np.isnan(x).any(axis=(1, 2)), :, :] 18#[[[0. 1. 2. 3.] 19# [4. 5. 6. 7.]]] 20 21# 1次元方向で nan が存在する部分を削除 22y1 = x[:, ~np.isnan(x).any(axis=(2, 0)), :] 23#[[[ 0. 1. 2. 3.]] 24# [[ 8. 9. 10. 11.]] 25# [[16. 17. 18. 19.]]] 26 27# 2次元方向で nan が存在する部分を削除 28y2 = x[:, :, ~np.isnan(x).any(axis=(0, 1))] 29#[[[ 0. 1.] 30# [ 4. 5.]] 31# [[ 8. 9.] 32# [12. 13.]] 33# [[16. 17.] 34# [20. 21.]]] 35

投稿2021/09/20 14:32

toast-uz

総合スコア3266

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問