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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1236閲覧

数値配列からのデータ解析方法について

maxkazu

総合スコア7

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/05/05 15:43

前提・実現したいこと

例えば、以下のサイトのような
http://uxmilk.jp/30240
線を描いた数値配列データ(例えば5個のデータ)を渡すと
・上昇から下降になった曲線
・ずっと上昇・下降
・下降から上昇になった曲線

のように、どのような線を描いているかを解析する作成したいと思っていますが、
どうやって作成したらいいのか教えて頂けないでしょうか。

どうぞよろしくお願い致します。

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

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

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

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

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

guest

回答2

0

LouiS0616さんの提案されている方法だと、numpyで簡単にできますね。

python

1import numpy as np 2>>> a = np.arange(10) 3>>> a 4array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 5>>> np.diff(a, n=1) 6array([1, 1, 1, 1, 1, 1, 1, 1, 1]) 7>>> np.diff(a, n=2) 8array([0, 0, 0, 0, 0, 0, 0, 0]) 9>>> b = np.arange(10) ** 2 10>>> b 11array([ 0, 1, 4, 9, 16, 25, 36, 49, 64, 81]) 12>>> np.diff(b, n=1) 13array([ 1, 3, 5, 7, 9, 11, 13, 15, 17]) 14>>> np.diff(b, n=2) 15array([2, 2, 2, 2, 2, 2, 2, 2])

恐らく現実的なデータで5点ということは考えづらいでしょうし、ノイズをどう考えるかという問題もあります。普通は解釈がむずい結果になるので、

  • サンプリングして(データを間引いて)点の数を減らしたり、移動平均を取ってノイズを落としたりする
  • さっさと多項式回帰などに突っ込む
  • さっさとベジェ曲線、スプライン曲線などで近似する

色々なアプローチがあると思いますが、どれが良いのかは最終的にどんなアウトプットがほしいのかによります。

投稿2018/05/05 22:15

編集2018/05/05 22:15
hayataka2049

総合スコア30933

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

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

0

ベストアンサー

『5個のデータ』って、通過点の座標が5個ということでしょうか。

・(A) 上昇から下降になった曲線

・(B) ずっと上昇・下降
・(C) 下降から上昇になった曲線
・(D) それ以外

この四つの分類くらいなら難しくないですよ。機械的にやる分には。


前処理として、点が左から右に並ぶようにソートしておき、y座標のリストysを作ります。
そして一階差分のリストdiv1_ysと二階差分のリストdiv2_ysの符号を見ます。

  • (A)... div2_ysの符号が常に負である場合。
  • (B)... div1_ysが符号が一定である場合。
  • (C)... div2_ysの符号が常に正である場合。
  • (D)... otherwise.

これで判別できる理由に関しては、高校数学の微分の知識である程度説明できるはずです。


一般の非線型回帰については、scipyで対処できるようす。Qiita - Pythonで非線形関数モデリング

投稿2018/05/05 16:34

編集2018/05/05 17:11
LouiS0616

総合スコア35658

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

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

maxkazu

2018/05/05 16:47

ご回答頂きましてありがとうございます。 データとしては [1, 2, 3, 4, 5] のようにN個の float型のデータが並んでいる感じです。 上記の場合だと 1 と 2 の差分が div1_ys 1 と 3 の差分が div2_ys という認識であっていますでしょうか? 便利な関数やライブラリなどもしご存知でしたら教えて頂けないでしょうか? どうぞよろしくお願い致します。
LouiS0616

2018/05/05 16:59 編集

[1, 2, 3, 4, 5] がysにあたる、ということですかね。 それでしたら、div1_ysは [1, 1, 1, 1]、div2_ysは [0, 0, 0] になります。 --- > 便利な関数やライブラリなどもしご存知でしたら教えて頂けないでしょうか? 回答本文で説明したような単純な方法で良いのなら、標準機能だけでも充分書けます。 ただし、 ・ 将来的にもっと柔軟な判定ができるようにしたい ・ 速度をとにかくはやくしたい 等々、特段の理由があるのでしたら、何かライブラリを探した方がいいかもしれません。
maxkazu

2018/05/06 01:13

ご回答頂きありがとうございます! 不勉強で大変申し訳ないのですが、div1_ys と div2_ysはどのように求めているのでしょうか? どうぞよろしくお願い致します。
LouiS0616

2018/05/06 06:49

隣り合うデータの差を取った新しいリストを作っています。 ysの差分をとってdiv1_ysを作り、div1_ysの差分をとってdiv2_ysを作っています。
maxkazu

2018/05/07 11:20

ご回答頂きありがとうございます! 無事解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問