2017年11月28日火曜日

R : 有向、無向グラフの描画

Rで有向、無向グラフの描画をするのにigraphパッケージを利用します。
(1) igraphのインストール、読み込み
install.packages("igraph")
library(igraph)
インストールは時間がかかりました。

(2)データの作成
エクセルでデータを作成します。今回は隣接行列(0 or 1)とします。
例えばエクセルで15×15の 0 or 1の行列を作っておきます( =RANDBETWEEN(0,1)を使いました)
これをgraph.csvとして文字コード:UTF-8、改行コード:LFにしてアップロードします。
 csvを取り込みます。



(2) グラフ描画

graph = as.matrix(graph)
plot(graph.adjacency(graph,mode="undirected",weighted=NULL))


(3) ノードの大きさの変更
csvに行和の合計を追加して、アップロードします。この行和が大きいほど他との関係も強いとします。
これをgraph01に取り込みます。そしてグラフ描画用のgraph01_1も用意しておきます。
graph01_1 = as.matrix(graph01[,1:15])
 グラフを描きます。
plot(graph.adjacency(graph01_1,mode="undirected",weighted=NULL),vertex.size=graph01$sum*4,edge.arrow.size=0.5)

 参考
http://www.shizukalab.com/toolkits/sna/sna_data
https://qiita.com/tomov3/items/c72e06eaf300b322e99d

2017年11月24日金曜日

RStudio : グラフの日本語利用

RStudioでデータの取り込みには日本語ができていたのですが、グラフ中では文字化けしてしまい、次の段取りで日本語を利用できるようにしました。
(1)日本語ライブラリの導入
# yum groupinstall "Japanese Support"

(2) RStudioの再起動
# rstudio-server restart

(3) Rで日本語の指定
par(family = "HiraKakuProN-W3", ps=10)
または
par(family="Japan1") 

この後グラフを書いてみると、図のようにグラフの中に日本語が出てきました。

2017年11月16日木曜日

R : Perceptron

機械学習の勉強を始めるのにPerceptronは学べるものが多いかと思います。

(1) 最急降下法
予備知識として、最適化アルゴリズムの最急降下法を知る必要があります。
最急降下法は以下のようになります。

 (2) Perceptron
パーセプトロンは教師データを用いて学習させた後、2つのデータに線形分離します。​

[アルゴリズム]​
for 全教師データ​
    if( wxの符号と教師フラグの符号){
        一致 -> continue (何もしない)​
        一致しない​
            w<- br="" tx="" w="">            index <- 1="" br="">end​

Javaではリンクのようになります。 Rでは下記になります。
x <- matrix(c(1, 0, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1), nrow=4, ncol=3, byrow = TRUE) #OR(1,0,0)最初はw0の係数なので1
t <- c(-1, 1, 1, 1) #教師ラベル
w <- c(1, 1, 1) #weight(w0, w1, w2)
eta <- 0.2 #学習係数
#weightの更新メソッド
update <- function(x, t, w) {
if (sign(x %*% w) == sign(t)) {
return(w)
}
return(w + eta * x * t)
}
#全データでweightが更新されなくなるまで繰り返す
index <- 1
while (index <= nrow(x)) {
tmp <- update(x[index,], t[index], w)
if (all(tmp == w)) { # w更新があったか
index <- index + 1 # w更新なし
} else { # w更新あり
w <- tmp
index <- 1 # ループの最初に戻す
}
print(w)
}
getPredict <- function(x,w){
return (sign(x %*% w))
}
plot(x[,2],x[,3], pch = t + 1)
abline( c(-w[1] / w[3], -w[2] / w[3])) # y = b + ax abline(b,a)
cat("y = ", -w[2] / w[3], "x +", -w[1] / w[3],"\n")
cat(c(0,0),"のとき",getPredict(c(1,0,0),w),"\n")
cat(c(1,0),"のとき",getPredict(c(1,1,0),w),"\n")
cat(c(0,1),"のとき",getPredict(c(1,0,1),w),"\n")
cat(c(1,1),"のとき",getPredict(c(1,1,1),w),"\n")
view raw Perceptron.R hosted with ❤ by GitHub

次に50個の座標を線形分離してみます。今回はy = -x +1 の上下で分離します。​
y > -x + 1の時 flag = 1​
y < -x + 1の時 flag = -1​
利用したファイル
このファイルをRStudioで​アップロードしておきます。

[Perceptron.2R]
data <- read.csv("random.csv", fileEncoding = "UTF-8",header = F)
x <- data.matrix(data[,1:3])
t <- data[,4]
w <- c(1, 1, 1) #weight(w0, w1, w2)
eta <- 0.2 #学習係数
#weightの更新メソッド
update <- function(x, t, w) {
if (sign(x %*% w) == sign(t)) {
return(w)
}
return(w + eta * x * t)
}
#全データでweightが更新されなくなるまで繰り返す
index <- 1
while (index <= nrow(x)) {
tmp <- update(x[index,], t[index], w)
if (all(tmp == w)) { # w更新があったか
index <- index + 1 # w更新なし
} else { # w更新あり
w <- tmp
index <- 1 # ループの最初に戻す
}
print(w)
}
getPredict <- function(x,w){
return (sign(x %*% w))
}
plot(x[,2],x[,3], pch = t + 1)
abline( c(-w[1] / w[3], -w[2] / w[3])) # y = b + ax abline(b,a)
cat("y = ", -w[2] / w[3], "x +", -w[1] / w[3],"\n")
view raw Perceptron2.R hosted with ❤ by GitHub

参考
 http://smrmkt.hatenablog.jp/entry/2013/11/06/223221

2017年11月6日月曜日

Javaプログラミング(1) 行列計算

Javaで行列計算をやります。
(1) 内積と行列の積の計算




この内積計算の関数をまず作成します。
public double getInnerProduct(double a[], double b[]) {
double answer = 0;
for(int i = 0; i < a.length; i++) {
answer += a[i] * b[i];
}
return answer;
}
view raw getInnerProduct hosted with ❤ by GitHub


行列計算を実施する場合、この内積計算を呼び出します。ただし、Javaで内積を計算する時に、行ごとしか呼び出せず、列ごと呼び出すことができません。そのため転置行列作成をしておきます。

public double[][] getTranspose(double [][]a){
double t[][] = new double[a[0].length][a.length];
for(int i = 0; i < a[0].length; i++) {
for(int j = 0; j < a.length; j++) {
t[i][j] = a[j][i];
}
}
return t;
}
view raw getTranspose hosted with ❤ by GitHub


これを使って、行列の積を計算します。
public double[][] getProduct(double a[][], double b[][]) {
double answer[][] = new double[a.length][b[0].length];
double t[][] = this.getTranspose(b);
for(int i = 0; i < a.length; i++) {
for(int j = 0; j < b[0].length; j++) {
answer[i][j] = this.getInnerProduct(a[i], t[j]);
}
}
return answer;
}
view raw getProduct hosted with ❤ by GitHub


エクセル計算(1) 線形計画法

エクセルで線形計画法を解いてみます。
(1) 環境設定
Solverと分析ツールをインストールします。
ツール->エクセルアドイン->Solverと分析ツールを選択し、OKを押します。
 データのところにソルバーがあれば利用可能です。

(2) 線形計画法を解く
今回は基本情報技術者試験平成25年春午前問76を利用します。

製品Aの生産量をx, 製品Bの生産量をyとします。図のような表を作成します。
色がついているところが、計算で変わる部分です。

緑の部分には初期値として0を入れておき、黄色とオレンジに関係式を入れておきます。
ソルバーのボタンを押し、図のように設定します。
準備ができたら、解決ボタンを押すと計算されます。

今回は利益が22と出て来ました。
 エクセルファイル
https://sistkanri-my.sharepoint.com/personal/mizuno_shinya_sist_ac_jp/_layouts/15/guestaccess.aspx?docid=03973f250867d47ae8ad92967454ebbb6&authkey=ATodb139UFIWvpkxEuhfO80&e=82d53e1faad744e686ae1e75b5d03efb

2017年11月2日木曜日

音声感情プログラム(Empath APIを利用)

音声から感情を読み取るAPIを試して見ました。
(1) APIの準備
https://webempath.net/lp-jpn/
からアカウントを作成しておきます。契約はフリープランにしておきました(月300回まで)。
適当な名前をつけてAPI Keyを発行しておきます。

(2) 情報取得の確認 (PHPで実施)
Empath WebAPI 仕様書 (version 1)  のサンプルコードを使って確認して見ました。
POSTMANでやってみると図のようになります。
これをPHPコードでエクスポートして、コントローラに設定しました。
public function emotion($id = null) {
if (!$this->Audio->exists($id)) {
throw new NotFoundException(__('Invalid audio'));
}
$options = array('conditions' => array('Audio.' . $this->Audio->primaryKey => $id));
$this->set('audio', $this->Audio->find('first', $options));
$audio = $this->Audio->find('first', $options);
$curl = curl_init();
$wav = '@/home/ms000/www/oc/app/webroot/img/wav/'.$audio['Audio']['path'];
$postfields = array(
"wav" => $wav
);
curl_setopt_array($curl, array(
CURLOPT_URL => "https://api.webempath.net/v2/analyzeWav?apikey=naisyo",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => $postfields,
CURLOPT_HTTPHEADER => array(
"cache-control: no-cache",
"content-type: multipart/form-data",
"postman-token: 669b5410-eec8-4fa2-1aa3-a"
),
CURLOPT_FOLLOWLOCATION => TRUE
));
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
$res = json_decode($response);
print_r($res);
if($res->error == 0 ){
$data = array(
'id' => $id,
'calm' => $res->calm,
'anger' => $res->anger,
'joy' => $res->joy,
'sorrow' => $res->sorrow,
'energy' => $res->energy,
);
$this->Audio->save($data);
}
}
view raw emotion hosted with ❤ by GitHub


テーブルは次を利用しています。
CREATE TABLE IF NOT EXISTS `audios` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`path` varchar(255) DEFAULT NULL,
`calm` int(11) DEFAULT NULL,
`anger` int(11) DEFAULT NULL,
`joy` int(11) DEFAULT NULL,
`sorrow` int(11) DEFAULT NULL,
`energy` int(11) DEFAULT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
view raw audios.sql hosted with ❤ by GitHub


(3) 動作確認
実際に音声をアップロードしてやってみると、こんな感じでした。


実際はAndroidアプリで録音し、そこで評価。評価したものをアップロードしてテーブルに格納するのが良さそうです。

2017年10月27日金曜日

Unity : VRプログラム(2)

今回は街並みを走るプログラムを作成します。
(1) 街並みプログラム作成
プロジェクト名:VR02
今回街並みの設定は次を利用させてもらいます。
http://many.chu.jp/Unity/TekitouCityGenerator/
これをダウンロードして、Assetにインポートします。
Sample1を利用します(ダブルクリック)。下のようなシーンが出て来ます。
 試しに動かしてみると、面白いものが出て来ます。
せっかくなのでVRとしてみてみます。GoogleVRをインポートしておきます。
前回と同様なやり方でAndroid端末に転送します。
変更する必要があればCameraの位置を調整します。



(2) Unity Chanの配置
今回は回転は止めておきます。Camera->Add Rotation Script のチェックを外します。
Unity Chanを配置します。利用規約に同意してデータを持って来ます。
http://unity-chan.com/download/releaseNote.php?id=UnityChan
これをAssetに取り込みます。
この中からUnityChan->Prefabs->unitychan_dynamic -> for Locomotion -> unitychan_dynamic_locokotion を取り込みます。

unitychanの目線に合わせ、Cameraを変更します。Camera -> Add component -> Followというスクリプトを作ります。
targetを指定しておきます。
これで動かしてみると、下に落ちていくかもです。そのため、Planeを加えておきます。
unity chanがうまく動くように調整します。例えばちょっと高さを調整します。Planeも広くしておきます。

(3) 街中で人探し
もう一人、unitychan(動かない)を配置して、探してみます。
for locomotion -> unitychan を持って来ます。
探すと、いました。

参考
https://www.slideshare.net/kinneko/part3-unityvr
https://github.com/unity3d-jp/FirstTutorial/wiki/3.%E3%82%AB%E3%83%A1%E3%83%A9%E3%82%92%E5%8B%95%E3%81%8B%E3%81%99
https://qiita.com/gahaq/items/cec28c764eebbc9bae0b

2017年10月25日水曜日

Unity : VRプログラム(1)

Unityを利用してVRプログラムを作成します。ターゲットはAndroidとします。
環境設定(Unity, Android SDK, JDK、GoogleVR)は設定してあるとします。
VRの環境設定は、
https://developers.google.com/vr/unity/get-started
を参考にします。 この中にもリンクはありますが、GoogleVRは
https://github.com/googlevr/gvr-unity-sdk/releases
からダウンロードしておきます。
注意点として、AndroidStudio2.3.3では
/Users/mizuno/Library/Android/sdk/tools
このtoolsの構造が変更されたらしく、Unityでアクセスできなかったので、toolsをダウンロードしてフォルダごと置き換える必要があります。僕はtools_r25.2.5-macosx.zipをダウンロードして置き換えました。

(1) プロジェクト作成
今回はVR01というプロジェクトにします。
プリミティブオブジェクトを用意していきます。
Planeを用意
GameObject->3DObject->Plane

 次にCubeを持ってきます。
同様にSphereを持ってきます。
この2つに色をつけるためのスクリプトを作成します。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class changeColorScript : MonoBehaviour {
// Use this for initialization
void Start () {
Renderer rend = GetComponent<Renderer>();
rend.material.shader = Shader.Find("Object");
rend.material.SetColor("_Object",Color.red);
}
// Update is called once per frame
void Update () {
}
}


これをAdd Component -> Script -> changeColorScript.cs を選択しておきます。

次に、もう一つPlaneを持ってきて設定します(PhotoPlane)。




Project -> Assets -> Materials に画像ファイルを置いておき、PhotoPlaneに適用します。



(2) VRの設定

Assetを右クリックして、import package -> cunsom Package -> VRファイルを選択
全てをインポートします。
Game Object -> Create Emptyで作成したオブジェクトの名前をVREyeとします。
この中にMain Cameraを入れて値をリセットします。
 さらにAssete -> GoogleVR -> Prefabs -> GvrEditorEmulatorを入れます。







(3) VRのAndrtoid転送
File -> Build Setting でAndroidを選択し、Switch Platformを押します。
次にPlayer Settingで次のように設定します。


これでAndroid端末に転送し、確認します。