Pythonで書いた外れ値のインデックスを求めるプログラムをMATLABで実現する方法

投稿者: Anonymous

以下のようにtxtファイルに書き出された7つのセンサのデータから
外れ値のインデックスを求めるプログラムを書きました。
このプログラムをMATLABで実行できるように書き換えたいのですが、
データ分析はPythonでしかやったことがなく

data = load ('data.txt');

でPythonコードのdata = np.array(data)辺りまでの処理ができたということは
見当がつくのですが、以降がわかりません。

txtファイル内のデータは以下とします。

[1, 2, 3, 4, 5, 7, 7, 1, 2, 4, 4, 5, 6, 7, 1, 2, 2, 12, 6, 6, 7]

実行プログラム

import numpy as np
import pandas as pd

num_sensors = 7  # センサ数
thresh = 5  # 中央値との差がこの値より大きい場合は異常値と判断

data= pd.read_table("data.txt", header=None)
data = data.values.tolist()
#data = np.array([1, 2, 3, 4, 5, 7, 7, 1, 2, 4, 4, 5, 6, 7, 1, 2, 2, 12, 6, 6, 7])  
data = np.array(data)

data = data.reshape(-1, num_sensors)
outliner = np.abs(data - np.median(data, axis=0, keepdims =True)) >thresh
indices = np.where(outliner.ravel())
print(indices)

#出力
17

回答を受けての追記
Pythonの方のプログラムだと
data = data.reshape(-1, num_sensors)
の記述があるので、入力データが以下の場合

[1, 2, 3, 4, 5, 0, 7, 1, 2, 4, 4, 5, 6, 7, 1, 2, 2, 12, 6, 6, 7]

出力は
[5,17]

ですが、MATLABではどこで data = data.reshape(-1, num_sensors) の処理をやっているのかわかりません。

データがベクトルという前提条件もリストでしか保持していないので、説明いただけますと幸いです・

解決

dataは既にベクトルになっているとします。

data = [1, 2, 3, 4, 5, 7, 7, 1, 2, 4, 4, 5, 6, 7, 1, 2, 2, 12, 6, 6, 7];

num_sensors = 7;
thresh = 5;

data = reshape(data, [], num_sensors);

% 中央値
medianOfData = median(data);

% 中央値からの差を格納したベクトル
differences = abs(data - medianOfData);

% 差がthresh以上の要素のインデックス
outliers = find(differences > thresh);

% 18; インデックスは1から始まるので、Pythonより1大きい
disp(outliers)
回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *