2017年9月30日土曜日

Matlab : k-nearist neighbor modelの利用(1)

k-nearist neighbor modelを使って分類してみます。

1. データの用意
今回は y < x (クラスA), y > x (クラスB), y = x (クラスC) を満たすものを3つのクラスに分類します。エクセルでrand関数を使って100個ほどデータを用意します。最初と最後にクラスC用のデータを10個ずつ追加しておきます。

これを Matlab onlineにアップロードします。ファイル名 : k-nearist.xlsx
取り込み
knearist = readtable("k-nearist.xlsx");
カテゴリ化
knearist.class = categorical(knearist.class);
cvpartition関数を使ってtrainingデータとtestデータに分けます。c = cvpartition(n,'HoldOut',p) は、n 個の観測でのホールドアウト検定のランダム分割を作成します。観測値は学習セットとテストセットに分割されます。https://jp.mathworks.com/help/stats/cvpartition.html
cvpt = cvpartition(knearist.class,'HoldOut',0.3)
データをtrainingデータとtestデータに分けます。
idxTrain = training(cvpt);
dataTrain = knearist(idxTrain,:);










idxTest = test(cvpt);
dataTest = knearist(idxTest,:);
これでデータの準備ができました。


2. k-nearist neighbor modelの利用
最近傍点を使用した分類を行います。
https://jp.mathworks.com/help/stats/classification-using-nearest-neighbors.html
mdl = fitcknn(dataTrain,'class')
predict関数を使って、testデータから予測します。
https://jp.mathworks.com/help/stats/compactclassificationensemble.predict.html
predictedGroups = predict(mdl,dataTest)


3. Modelの評価
先ほど予測したデータを評価します。loss関数を利用します。
https://jp.mathworks.com/help/stats/compactclassificationdiscriminant.loss.html
testErr = loss(mdl,dataTest)
確認のため、trainingデータも評価しておきます。
predictedGroups = predict(mdl,dataTrain)
trainErr = resubLoss(mdl)
以上です。

2017年9月27日水曜日

Matlab : k-means法の利用(4)

k-means法と同様なやり方で凝集型階層クラスタツリーを作成します。
(1) 階層クラスタの決定
linkage関数を使って凝集型クラスタツリーを作成します。
https://jp.mathworks.com/help/stats/linkage.html
Z = linkage(stats);
デンドログラムを描いてみます。
dendrogram(Z);
(2) 階層クラスタのクラスタ分割
得られた階層型ツリーを最大3つのクラスタに分割してみます。
grp = cluster(Z,'maxclust',3);
距離を取得します。
Y = pdist(stats);
コーフェン相関係数を用いて、クラスタが良いか比較します。精度が高いほど1に近づきます。
https://jp.mathworks.com/help/stats/cophenet.html
c = cophenet(Z,Y)
このような方法でクラスタを評価します。

2017年9月26日火曜日

Matlab : k-means法利用(3)

k-means法で分類したクラスタを評価します。

(1) silhouette関数の利用
シルエット関数を使っていきます。シルエット値は、他のクラスターの点と比べて、その点が自身のクラスター内の他の点にどれくらい相似しているかを示す尺度です。
http://jp.mathworks.com/help/stats/silhouette.html
前回のk-meansで3個に分けたものを利用します。
silhouette(stats,grp);
クラスタ3はだいぶ値が高いのですが、クラスタ2の値が低くなってしまっています。
正規化された値でもやってみます。
silhouette(statsNorm,grp);

(2) クラスタ評価関数evalclustersの利用
clustEv = evalclusters(statsNorm,'kmeans','silhouette','KList',2:5)
これから最適なクラスタ数は2ということがわかります。

Matlab : k-means法利用(2)

Matlabを使ってk-means法をもう少しやってみます。

(1) k-means法 Centroidの取得
k-means法で得られるCentroidも取得しておきます。
[grp,C] = kmeans(statsNorm,3,'Replicates',5);
Cを見てみると下記のようになっています。

(2) parallelcoordsを使って可視化
parallelcoords(statsNorm,'Group',grp);
parallelcoords(C,'Group',1:3);
グループがどのような性質を持っているかわかりやすい。
1/4分位点をのせてみる
parallelcoords(statsNorm,'Group',grp,'Quantile',0.25);




(3) k-meansで得られた結果のクロス集計
アップロードしたエクセルファイルに袋井か浅羽を区別する語句をのせます。列名はregionとします。
これをもう一度アップロードして、読み込みます。

data1 = readtable("jinkouH290430.xlsx");
このままだとカテゴリになっていないので、カテゴリにします。
data1.region = categorical(data1.region);

yCatとしてカテゴリだけ抜き出します。yCat = data1{:,[15]};
クロス集計します。

counts = crosstab(grp,yCat);
 グラフをかきます。
 bar(counts,'stacked');

区分を追加しておきます。

 以上です。

2017年9月25日月曜日

Matlab : k-means法の利用

Matlabでk-means法を実施します。
今回はMatlab Onlineで実施します。
https://jp.mathworks.com/products/matlab-online.html
からログインして環境を開きます。

(1) データの取り込み
袋井市オープンデータを利用します。
平成29年度人口・世帯数の推移  平成29年5月1日人口表
http://opendata.city.fukuroi.shizuoka.jp/dataset/p_23554_1491357120914
使うシートは自治会別世帯数及び人口です。
ダウンロードして、各自治体の合計の行を取り除き、インデックスも日本語でなくしておいきます。idの行を追加しておきます。

これを Matlab Onlineでアップロードしておきます。
メニューからアップロードを選択し、ファイルをアップロードします。
コマンドでデータを取り込みます。
data = readtable("jinkouH290430.xlsx");
この中で、日本人男性・女性の人数、外国人男性・女性の人数の4項目を使うこととします。数字は列番号です。
stats = data{:,[ 4 5 8 9 ]}; 
ラベルも持ってきます。
labels = data.Properties.VariableNames([ 4 5 8 9 ]);
データのスケールを揃えます。
statsNorm = zscore(stats);
zscoreは平均が0標準偏差が1となります。
https://jp.mathworks.com/help/stats/zscore.html
(2) k-means法の実施
grp = kmeans(statsNorm,3,'Replicates',5);
クラスタ数は3、初期値を5回くらい返し、良いものを選びます。
http://jp.mathworks.com/help/stats/kmeans.html?searchHighlight=kmeans&s_tid=doc_srchtitle
grpの内容

表示
scatter(stats(:,1),stats(:,3),5,grp);
このような順序でやっていきます。

2017年9月7日木曜日

Merakiでのトレース方法(1)

Cisco MerakiのAccess Pointを使ってのトレース方法です。これで端末の動線を確認します。
1.取得用SSIDの準備
必ずしも必要ありませんが、まとめる時にわかりやすいので「SIST-GUEST」というSSIDを作っておきました。端末はこのSSIDに接続しているものを対象とします。

2.ログの取得
端末を接続してログを取得します。集計手順は下記になります。
(1) ネットワーク選択->Network-wide->clients
ここで「SIST-GUEST」と入力しSSIDを制限します。

(2) クライアントの選択
SSIDで絞り込みをした一覧から見たい端末を選択します。
そこからevent logをクリックします。
ここで「802.11 association」を指定して絞り込みます。
rssiの小さな値は外したほうがいいかもです。これをcsvでダウンロードしておきます。すべてのネットワークを同時にできるといいですが、現状ネットワークごとこれを繰り返します。
3.ログ解析システムの構築
(1) デバイス情報格納テーブルの作成「androids」idにはAndroid_idが入ります。
(2) アクセスポイント用テーブル「accesses」idにはAPの名前を入れて、nameには説明を入れます。本来はAPの名前をidにすべきでないですが、Merakiの標準ログがこうなっているため、そうしました。
(3) ログ格納用テーブル「points」
このテーブルをbakeして使えるようにしておきました。

4.Androidsテーブルへの格納
Android IDを取得するために、アプリを利用しました。
https://github.com/smzn/Prog17_01
これをインストールして情報をアップロードしました。
これを全台繰り返します。
5.accessesテーブルへの格納
MerakiからAccess point情報をダウンロードしてcsvでインポートしました。
csvからインポートするとき、datetime型に変換する必要がある。そのままだと「2017/9/6 13:13」となっているので「2017-09-06 13:13:41」に変える。csvをエクセルで開き、対象列を右クリックしてセルの書式設定->ユーザ設定->種類の所に「YYYY-MM-DD HH:MM:SS」を入力。
このファイルの文字コードをUTF-8、改行コードをLFに直しアップロードする。
これで準備ができました。