Swingアプリケーションの導入


Swingを用いてWindowを表示させるだけのアプリケーションの作成をしてみます。
AWT(Abstract Window Toolkit)とはJavaが初めてリリースされたときから存在しているJava Core APIのGUIコンポーネントです。
Java Core APIとはJavaの開発環境であるJDKに含まれる、プログラム作成に必要となる基本的なクラスを集めた道具箱のようなものです。
SwingはAWTを進化させる形で、1998年にリリースされました。ちなみにJava自体は、1995年にSun Microsystem社よりリリースされています。
それでは、Swingを用いたアプリケーションを行いたいと思います。

$ vim Hello.java



//Hello.java
//パッケージのインポート
import javax.swing.*;

public class Hello{
 public static void main(String[] args){
  //JFrameクラスのオブジェクトを作成する
  JFrame frame = new JFrame("こんにちは");
  //ウィンドウが閉じるときの動作を設定
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  //ウィンドウのサイズを指定
  frame.setSize(500,300);
  //ウィンドウを可視化
  frame.setVisible(true);
 }
}



#コンパイルして実行してみます。
$ javac Hello.java
$ java Hello




【参考文献】
丸の内とら『Java入門教室』SE SHOEISHA 2012 318-325pp

Javaのswingアプリケーションの文字化けの解決方法

Javaの日本語を含むSwingアプリケーションを作るときにハマってしまいました。
解決策も合わせて書きたいと思います。

まず、私のMac OS XのJavaの環境は以下の通りです。

$ java -version
java version "1.6.0_37"
Java(TM) SE Runtime Environment (build 1.6.0_37-b06-434-10M3909)
Java HotSpot(TM) 64-Bit Server VM (build 20.12-b01-434, mixed mode)

とりあえず、Java以下のソースをコンパイルして実行すると文字化けはおこりません。

$ vim Hello.java

public class Hello{
        public static void main(String[] args){
                System.out.println("Hello in English\n");
                System.out.println("こんにちは in English\n");
        }
}

$ javac Hello.java
$ java Hello


Hello in English

こんにちは in English


コンソールではうまくいくようです。
しかしSwingではうまくいきません。


$ vim Hello.java


import javax.swing.*;

public class Hello{
        public static void main(String[] args){
                JFrame frame = new JFrame("こんにちは");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                frame.setSize(500,300);
                frame.setVisible(true);
        }
}

$ javac Hello.java
$ java Hello

題名が見事な文字化けをしています。
すこし調べた結果、以下のようにするとうまくいくことがわかりました。
文字コードをUTF8 と明示することがミソのようです。

$ javac -J-Dfile.encoding=UTF-8 Hello.java
$ java -Dfile.encoding=UTF-8 Hello

無事解決しました。
エイリアスを設定しておくと便利です。

$ vim ~/.bashrc

#この一行を追記する
alias javac='javac -J-Dfile.encoding=UTF-8'
alias java='java -Dfile.encoding=UTF-8'

【参考文献】
jitsu102の日記

Facebookの友達ネットワークを測定してR + igraphで描写する

今回は、NameGenWebというアプリケーションを使ったFacebookの友達ネットワークの解析について紹介します。

NameGenWebのプライバシーポリシーを記します。

Privacy Policy
NameGenWeb is a research application developed at the Oxford Internet Institute, University of Oxford by Joshua R. Melville and Bernie Hogan based on earlier code from Bernie Hogan and Arber Ceni. This application is designed principally as a research and teaching utility for accessing a particular social network, classically referred to as the 'personal network'. The principal motivation is to help individuals make sense of the connections within their own network, and to familiarize themselves with network analysis as an analytical technique.

要するに、オックスフォードの研究グループの個人ネットワークの研究のアプリケーションだそうです。アカデミアがベースになっているのは安心感があります。

今回は、NameGenDevで自分の友達ネットワークを解析し、解析結果をGraphML形式で取得。最後に、R + igraph環境で可視化をします。


# Step  0
Facebookの検索窓で"NameGenDev"を検索します。


# Step1
開発者からのコンタクトを希望するならば、下のチェックを入れます。


# Step 3
適当に属性を入れます。今回はデフォルトのFull Name & Facebook User IDだけを使用します。



# Step 3
ファイルをダウンロードします。
 # step 4
ダウンロードのファイル形式を選択します。今回は、GraphMLを選択します。また、プライバシーの観点からAnonymise Networkにチェックを入れました。

ダウンロードしたファイルをカレントディレクトリに移動させて(今回はmygraph.graphmlとする)、Rによる可視化作業に移行します。


##############以下 Rのスクリプト###############
#Rの起動
$ R

#igraphのロード
library(igraph)

#ダウンロードしたgraphmlファイルをロードしてgというオブジェクトにする
g <- read.graph("./mygraph.graphml", format=c("graphml"))

#vertexの大きさを1に統一
V(g)$size <- 1

#グラフを描写
png("mygraph.png")
plot(g, main = "My Facebook Friends Network")
dev.off()

大きなクラスターが3つと、小さなクラスターが4つ存在することがわかります。これは私の所属大学や出身高校のクラスターを反映しています。

次数分布も求めてみます。
ただし、ここで描写されるのは"私の友達ネットワーク"における次数分布であることに注意しなくてはなりません。このネットワーク内で多くの次数を持っている方(vertex)は、私の人生の様々なところで関わってくださった方と言えるかもしれません。

###########Rのソースコード : 次数分布を求める#############


#g次数分布の配列を計算
#握手問題を考慮して1/2倍している。
degree <- degree(g)/2

#次数分布を描写
png("degree-dsit.png")
hist(degree, xlab = "degree", ylab="Frequency")


次数中心度をノードの大きさに反映させる


#igraphのロード
library(igraph)

#n=50、p = 0.1の無向ランダムグラフを作成する。
g <- random.graph.game(50, p=0.1, direct=F)

#次数中心を計算する
c <- dgree(g)

#各vertexの次数中心度をvertexの大きさに反映させて描写
png("dgree.png")
 plot(g, vertex.size=c, main="random graph : n = 50, p = 0.1")
dev.off()

ClustalWを用いてマルチプルアラインメントを作成する

ClustalxとはGUIベースのマルチプルアラインメントソフトウェアです。今回は、ヒト、マウス、ゼブラフィッシュのrhodopsinのアミノ酸配列のアラインメントを行いたいと思います。

########ClustalX2.1のダウンロード###########

以下のサイトからclustalxのmac用のバイナリファイルをダウンロードして開きます。(clustalx-2.1-macosx.dmg)
http://www.clustal.org/clustal2/#Download

clustalx-2.1-macosx.dmgダブルクリックすると開いたフォルダの中にclustalx.appが入っているので、/Applicationsにコピーします
$ cp -r ~/Desktop/clustalx.app /Applications

clustalxを起動するにはopenコマンドを使用します。
$ open -a clustalx



########マルティプルアラインメントの作成##########

次にrhodopsinのアミノ酸配列を記述した次の配列ファイルを読み込みます。



$ cat rho.fasta
>gi|4506527|ref|NP_000530.1| rhodopsin [Homo sapiens]
MNGTEGPNFYVPFSNATGVVRSPFEYPQYYLAEPWQFSMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRT
PLNYILLNLAVADLFMVLGGFTSTLYTSLHGYFVFGPTGCNLEGFFATLGGEIALWSLVVLAIERYVVVC
KPMSNFRFGENHAIMGVAFTWVMALACAAPPLAGWSRYIPEGLQCSCGIDYYTLKPEVNNESFVIYMFVV
HFTIPMIIIFFCYGQLVFTVKEAAAQQQESATTQKAEKEVTRMVIIMVIAFLICWVPYASVAFYIFTHQG
SNFGPIFMTIPAFFAKSAAIYNPVIYIMMNKQFRNCMLTTICCGKNPLGDDEASATVSKTETSQVAPA

>gi|21717805|ref|NP_663358.1| rhodopsin [Mus musculus]
MNGTEGPNFYVPFSNVTGVVRSPFEQPQYYLAEPWQFSMLAAYMFLLIVLGFPINFLTLYVTVQHKKLRT
PLNYILLNLAVADLFMVFGGFTTTLYTSLHGYFVFGPTGCNLEGFFATLGGEIALWSLVVLAIERYVVVC
KPMSNFRFGENHAIMGVVFTWIMALACAAPPLVGWSRYIPEGMQCSCGIDYYTLKPEVNNESFVIYMFVV
HFTIPMIVIFFCYGQLVFTVKEAAAQQQESATTQKAEKEVTRMVIIMVIFFLICWLPYASVAFYIFTHQG
SNFGPIFMTLPAFFAKSSSIYNPVIYIMLNKQFRNCMLTTLCCGKNPLGDDDASATASKTETSQVAPA

>gi|18859317|ref|NP_571159.1| rhodopsin [Danio rerio]
MNGTEGPAFYVPMSNATGVVRSPYEYPQYYLVAPWAYGFVAAYMFFLIITGFPVNFLTLYVTIEHKKLRT
PLNYILLNLAIADLFMVFGGFTTTMYTSLHGYFVFGRLGCNLEGFFATLGGEMGLKSLVVLAIERWMVVC
KPVSNFRFGENHAIMGVAFTWVMACSCAVPPLVGWSRYIPEGMQCSCGVDYYTRTPGVNNESFVIYMFIV
HFFIPLIVIFFCYGRLVCTVKEAARQQQESETTQRAEREVTRMVIIMVIAFLICWLPYAGVAWYIFTHQG
SEFGPVFMTLPAFFAKTSAVYNPCIYICMNKQFRHCMITTLCCGKNPFEEEEGASTTASKTEASSVSSSS



1)ファイルのロード
File -> Load sequence
でファイルを選択。
2)マルティプルアラインメントの実行
Alignment -> Do complete Alignment
3)アラインメントの画像を出力
File -> Write alignment as postscript

以下の画像は結果を一部切り出しています。




R + igraphで作成したランダムグラフをcytoscapeで可視化する

まずは下記のサイトからcytoscapeをDL & installします。今回はv2.8.3です。
http://www.cytoscape.org/

インストール先のパスは/Applications/Cytoscape_v2.8.3です。


#Rの起動
$ R


#igraphのロード
library("igraph")

#テストとして、頂点50個、p = 0.1の無向ランダムグラフを作成する。
g <- random.graph.game(50, p=0.1, direct=F)
png("random.graph.png")
plot(g, main = "random graph n = 50, p = 0.1")
dev.off()


#グラフのedgelistのテキストファイルへの書き出し
write.graph(g, "random-graph.txt", "edgelist")


#Rの終了
q()

#グラフのedgelistファイルの確認
$ head random-graph.txt 
0 17
0 34
0 36
1 9
1 23
1 46
2 16
3 10
3 32
4 7

#cytoscapeの起動
$ open -a cytoscape

File->Import->Network from Table -> Select File(s)
でファイルを選択

Source interaction -> Column 1
Interaction Type -> Default interaction
Target interaction -> Column 2
以上です。あとはimportをクリックすればOKです。ちょっとLayoutを工夫(Circular)した最後に提示して終わります。



【参考文献】

ランダムグラフの性質を調べる



現実世界に実在する巨大なネットワークを解析するときは、個々の構成要素よりもネットワーク全体としての特徴が注目されます。その特徴とは主として、
  1. 平均距離
  2. クラスター係数
  3. 次数分布
の3つが挙げられます。
今回はランダムグラフを生成して、これら3つの性質を調べてみたいと思います。
※snaパッケージを使用します。snaパッケージはネットワークの情報を隣接行列で管理するような仕様となっています.


###snaパッケージを使用します####
#snaのインストール
install.packages("sna")
#ロード
library(sna)

#vertexが100個、p = 0.01のランダムグラフ(無向グラフ)を作成.
rg <- rgraph(100, tprob = 0.05, mode = "graph")

#####グラフの描写####
png("random_graph.png")
gplot(rg, main = "random graph : p = 0.05, vertex = 100", gmode="graph")
dev.off()



#####(1)平均距離を調べる####
distance <- geodist(rg)$gdist
#edgeを持たない頂点は平均距離が無限大になってしまうので、無限大の場合はのぞいて計算します
#対角にある0の値をのぞいて計算します
mean(distance[-c(which(distance == Inf), which(distance == 0))])
[1] 2.888283

#結果の解釈
平均距離が3程度ということは、このグラフから任意の二つの頂点を選択したとき、その二点の距離は平均して3程度であるということです。100個もvertexがあるのにも関わらず、案外小さな距離で任意の二点間を行き来することができます。





#####(2)クラスター係数を調べる####

#vertexごとのクラスター係数を計算する関数を定義
clust.coeff <- function(matrix){
n <- nrow(matrix)
output <- rep(0,n)
for(i in 1 : n){
m <- sum(matrix[i, ])
output[i] <-
sum(t(matrix * matrix[i, ]) * matrix[i, ])/(m * (m - 1))
}
output[which(output == "NaN")] <- 0
output}

#ネットワークのクラスター係数を計算
#各頂点に定義されるクラスター係数の平均値を取ればよい
mean(clust.coeff(rg))
[1] 0.05315657

#結果の解釈
#クラスター係数が0.05ということは、ある頂点に隣接する2つの頂点の間に辺がある確率が5%であるということです。これはグラフ全体で2つの頂点間にedgeのある確率(p = 0.05)と同じです。以上より、このグラフではグラフ内部に密度の高い集団(cluster)が形成されていないと結論づけることができます。






#####(3)次数分布を調べる####
#無向グラフであるため、度数表のカウントが2倍になることを考慮
degree <- degree(rg)/2
#ヒストグラムに描写
png("degree-dsit.png")
hist(degree, xlab = "degree", ylab="Frequency")
abline(h=0)
dev.off()

#結果の解釈
次数が3-5のあたりにピークがあることがわかります。これは明らかにスケールフリーネットワークで登場するベキ乗分布とは異なる性質です。


【まとめ】
一般的にランダムグラフは、頂点間の平均距離が短く、クラスター度が低く、次数分布にピークが見られるという傾向があるとされています。今回のシミュレーションでも同様の性質が確認できました。


【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、121 - 131pp



現実世界に実在する巨大なネットワークを解析するときは、個々の構成要素よりもネットワーク全体としての特徴が注目されます。その特徴とは主として、
  1. 平均距離
  2. クラスター係数
  3. 次数分布
の3つが挙げられまs。
今回はこれらのうち、平均の計算を行いたいと思います。
次数分布とはグラフに含まれる頂点の次数がどのように分布しているかを示すものです。
それではRを用いた具体的な計算です。次数分布を計算してヒストグラムで表示させます。


#igraphをロード
library(igraph)


####隣接行列を作成して、そこからグラフを作る####
A <- matrix(c(
0,1,1,1,1,0,0,0,0,
1,0,1,1,1,1,0,0,0,
1,1,0,1,0,0,1,0,0,
1,1,1,0,0,0,0,1,1,
1,1,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,0,
0,0,0,1,0,0,0,0,0),
nrow = 9)

#隣接行列よりグラフを作成
g <- graph.adjacency(A)

#グラフを描写
png("graph.png")
plot(g, main = "The graph for cluster coefficient calculation")
dev.off()



#最短距離を求める。
#第2引数no
mode = "out"は有向グラフを分析するときに必要である。
> shortest.paths(g, mode = "out")
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,] 0 1 1 1 1 2 2 2 2
 [2,] 1 0 1 1 1 1 2 2 2
 [3,] 1 1 0 1 2 2 1 2 2
 [4,] 1 1 1 0 2 2 2 1 1
 [5,] 1 1 2 2 0 2 3 3 3
 [6,] 2 1 2 2 2 0 3 3 3
 [7,] 2 2 1 2 3 3 0 3 3
 [8,] 2 2 2 1 3 3 3 0 2
 [9,] 2 2 2 1 3 3 3 2 0



#平均距離の計算
average.path.length(g)
[1] 1.888889

【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、121 - 131pp

次数分布の計算



現実世界に実在する巨大なネットワークを解析するときは、個々の構成要素よりもネットワーク全体としての特徴が注目されます。その特徴とは主として、
  1. 平均距離
  2. クラスター係数
  3. 次数分布
の3つが挙げられまs。
今回はこれらのうち、次数分布の計算を行いたいと思います。
次数分布とはグラフに含まれる頂点の次数がどのように分布しているかを示すものです。
それではRを用いた具体的な計算です。次数分布を計算してヒストグラムで表示させます。


#igraphをロード
library(igraph)


####隣接行列を作成して、そこからグラフを作る####
A <- matrix(c(
0,1,1,1,1,0,0,0,0,
1,0,1,1,1,1,0,0,0,
1,1,0,1,0,0,1,0,0,
1,1,1,0,0,0,0,1,1,
1,1,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,0,
0,0,0,1,0,0,0,0,0),
nrow = 9)

#隣接行列よりグラフを作成
g <- graph.adjacency(A)

#グラフを描写
png("graph.png")
plot(g, main = "The graph for cluster coefficient calculation")
dev.off()


#次数分布を計算
dd <- degree.distribution(g)

#片対数グラフを描写
png("degree.png")
plot(dd[-1],log = "x",  xlab = "degree", ylab = "frequency", main="Degree distribution")
dev.off()



【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、121 - 131pp

クラスター係数の計算


現実世界に実在する巨大なネットワークを解析するときは、個々の構成要素よりもネットワーク全体としての特徴が注目されます。その特徴とは主として、
  1. 平均距離
  2. クラスター係数
  3. 次数分布
の3つが挙げられまs。
今回はこれらのうち、クラスター係数の計算を行いたいと思います。
クラスター係数とは「中止となる点以外の各頂点間にどの程度つながりがあるかを示す指標」です。
具体的には、ある頂点を選んだときに、その頂点aと隣接する頂点すべてをピックアップします。これら隣接する頂点の間で張ることできるedgeの最大数をNとしたときに、実際に張られているedgeの数をnとします。そして、この頂点aに関するクラスター係数を n/N として定義します。
この計算を対象とするグラフの全vertexに対して行い、それらの平均値をとったものがグラフ全体のクラスター係数となります。

それではRを用いた具体的な計算です。

#igraphのロード
library(igraph)

####隣接行列を作成して、そこからグラフを作る####
A <- matrix(c(
0,1,1,1,1,0,0,0,0,
1,0,1,1,1,1,0,0,0,
1,1,0,1,0,0,1,0,0,
1,1,1,0,0,0,0,1,1,
1,1,0,0,0,0,0,0,0,
0,1,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,0,
0,0,0,1,0,0,0,0,0,
0,0,0,1,0,0,0,0,0),
nrow = 9)

#隣接行列よりグラフを作成
g <- graph.adjacency(A)

#グラフを描写
png("graph.png")
plot(g, main = "The graph for cluster coefficient calculation")
dev.off()




#####transitivity()を用いた計算方法#####

#vertexごとのクラスター係数を計算
clust <- transitivity(g, type = "local")
#次数が0や1の頂点はクラスター係数がNaNとなるため0に置換
clust[which(clust == "NaN")] <- 0
#クラスター係数の平均値を求める
mean(clust)
[1] 0.3185185


#####直接計算する方法#####

#vertexごとのクラスター係数を計算する関数を定義
clust.coeff <- function(matrix){
n <- nrow(matrix)
output <- rep(0,n)
for(i in 1 : n){
m <- sum(matrix[i, ])
output[i] <-
sum(t(matrix * matrix[i, ]) * matrix[i, ])/(m * (m - 1))
}
output[which(output == "NaN")] <- 0
output}

#すべてのvertexのクラスター係数の平均をとる
mean(clust.coeff(A))
[1] 0.3185185

【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、121 - 131pp

2つの頂点間に複数の辺がある場合を多重辺 multiple edgeと呼びます。また、ある頂点からその頂点自身に張られる辺をループ loopと呼びます。そして、multiple edgeやloopを含むグラフのことをmultiple graphと呼びます。
今回は、Rとigraphを用いてmultiple graphを作成します。nodeは2つです。

####以下スクリプト####
library(igraph)

#edge listを作成
g1 <- matrix(c(

"1","1",
"1", "2",

"1", "2",
"2", "1"
),
ncol=2, byrow=TRUE)

g <- graph.edgelist(g1, directed=TRUE)

#vertexの情報を表示
> V(g)
Vertex sequence:
[1] "1" "2"
#edgeの情報を表示
> E(g)
Edge sequence:
          
[1] 1 -> 1
[2] 1 -> 2
[3] 1 -> 2
[4] 2 -> 1

png("multiple.png")
plot(g, vertex.label=V(g)$name, main="multiple graph")
dev.off()



【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、11 - 12pp


重み付きグラフ


実際のネットワークでは、vertex間の関係の有無だけでなく、重みを考慮しなくてはなりません。
そのようなグラフを重み付きグラフ weighied graphまたは有値グラフ valued graphと呼びます。

今回は、Rとigraphパッケージを使用して、weighted graphを作成します。
igraph新たに学んだ点としては、E()とV()を用いてedgeやvertexの属性を操作することです。plotするときも、これらの関数使用することが必要となります。



#####以下 Rのスクリプト#####

library(igraph)

#edge listを作成
wg <- matrix(c(
"1", "2",
"1", "4",
"2", "3",
"2", "4"),
ncol=2, byrow=TRUE)

#edge listからグラフを作成
g <- graph.edgelist(wg, directed=FALSE)

###igraph付属のedgeを編集する関数を用いてedgeに重みを指定
#edgeを表示
> E(g)
Edge sequence:
          
[1] 2 -- 1
[2] 4 -- 1
[3] 3 -- 2
[4] 4 -- 2
#$weightの属性を調べる
> E(wg)$weight
NULL

#重みを追加
E(g)$weight <- c(2,4,3,1)

> E(g)$weight 
[1] 2 4 3 1

#vertexの確認
> V(g)
Vertex sequence:
[1] "1" "2" "4" "3"


###グラフを可視化
png("weighted-graph.png")
#vertex.labelとedge.labeをそれぞれ個別に与えていることに注意!!!!!!
plot(g, vertex.label=V(g)$name, edge.label=E(g)$weight, main = "weighted graph")
dev.off()



【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、13 - 15pp






フィードバック制御とフィードフォワード制御

####フィードバック制御####

  • 結果を見ながら操作を変える手法です。
  • 外乱の性質を知らなくても、外乱の範囲を抑制することができます(外乱の抑止効果)。
  • フィードバックの本質は情報の節約にあります。結果を見ながら修正動作しますので、あらかじめ細かく予測しておく必要はありません。すなわち前もって必要とされる情報が少なくてよいのです。

 ####フィードフォワード制御####

  • 制御対象についての正確な知識があり、外乱が存在しない場合に有用。
  • 制御量=基準量として計算し、必要な操作量を対象に加えれば、制御の目的、すなわち操作量を基準量と一致させることができます。
  • フィードフォワード制御とは制御量がどのような値であろうと、目的に向けて粛々と制御が行われます。
  • 制御量が完全に操作量の支配下にあり、操作量をどう動かせば制御量がどう動くかが完全にわかっていて、はじめて達成される制御方式です。
  • 以上のことからフィードフォワード制御は事前に知っておく情報量が大きくなります。


















【参考文献】
木村英紀『制御工学の考え方』講談社 2002 71 - 79pp 

制御工学の導入

###制御とは###
一言で言うと、ダイナミックスを持つ対象に対して、目的に向けた影響力の持続的行使を行うことといえる。

###基本用語###
・制御量
制御したい量。望ましいふるまいをさせたい量。大抵の場合、特定の物理量になる。

・操作量
制御のために操作する量。

・基準量
制御量のの望ましいふるまいを定量的にあらわしたもの。


###二つの制御アルゴリズムの決め方###
・モデルフリー制御
一つの制御系の実際の動きをみながら、制御器の可変なパラメータを調節していくやり方。直接調節による設計。30年前まではモデルフリー制御が制御の主流でした。なぜなら、試行錯誤でも使用を満たすことができたからだそうです。しかし、対象が複雑になり、要求される性能が高くなるにつれて、基幹となる制御系では次第にモデルベーストが使用されるになりました。モデルフリー制御の汎用方式にはPID制御と呼ばれるものがあります。P:比例、I:積分、D:微分の三項からなるアルゴリズムの形を与えてパラメータを調節していく方法だそうです。

・モデルベースト制御
制御対象を解析してそのモデルを求め、モデルにもとづいて理論的に制御器を導き出す方法。理論を用いた間接的な設計。モデルを作るには、対象の物理、化学的な属性を考え、対象が従う自然法則に基づいてモデルを作る場合もありますが、そのような対象の物理的な属性とは別の観点からモデルを求めることも多いそうです。

###モデルベースと制御とシステム同定(System Identification)###
モデルを立てるときに、制御対象の物理的な属性ではなく、入力と出力の信号解析からモデルを作る制御理論。これまで得られたたくさんの運転データから、制御対象が従う法則を導きだすことを目的としてます。システム同定を行う目的で、最小二乗法をはじめとした様々な数学的手法が研究されました。



【参考文献】
木村英紀『制御工学の考え方』講談社 2002 56 - 73, 114-120pp 

フォームの内容を条件文で判別


フォームの入力を解析して、条件を満たせば文1を、満たさない場合は文2を表示させるPHPスクリプト(quiz.php)です。クイズの本質そのものなので、quiz.phpと名付けています。

DocumentRoot
└── web
    ├── quiz.php

####以下より###

<?
        //答え
        $CorrectAnswer = "linux";
        header("Content-type: text/html; charset=UTF-8");
?>
<html>
<head>
<title>Linuxクイズ</title>
</head>



<body>

<!-- フォームを作成 -->
<form method="post" action="./quiz.php">
<table width="400" border="1">
<tr>
<td><b>問題</b></td>
</tr>
<tr>
<td>1991年、フィンランドのヘルシンキ大学在学中だったリーナス・トーバルズ氏が教育用のOSであるMINIXをお手本に独自に開発したUNIXライクなOS(カーネル)の名前を答えなさい.</td>
</tr>
<tr>
<td><input size="10" type="text" name="YourAnswer"></td>
</tr>
</table>
<input type="submit" value="GO!!!">
</form>

<?
//変数を取り出して$ansへ格納
$ans = $_POST['YourAnswer'];
//判別式
if($ans){
if($ans == $CorrectAnswer)
{
print("<font color=\"blue\"><b>その通り!</b></font>");
} else
{
print("<font color=\"red\"><b>残念。違います。</b></font>");
}
}
?>

</body>
</html>

####以上###




【参考文献】
Spencer K Ogawa『MySQL & PHPでつくるWebデータベース入門』 2002 エーアイ出版 42 - 43 pp

カンガルー 有袋類の一例

東山動物園のアカカンガルーを見てきました。太く発達した両足を使って跳ねるように移動するさまがなんとも愛らしかったです。


一般名
アカカンガルー
学名
Macropus  rufus
分類
: 動物界 Animalia
: 脊索動物門 Chordata
亜門 : 脊椎動物亜門 Vertebrata
: 哺乳綱 Mammalia
上目 : 有袋上目 Marsupialia
: カンガルー目 Diprotodontia
亜目 : カンガルー形亜目 Macropodiformes
上科 : カンガルー上科 Macropodoidea
: カンガルー科 Macropodidae
: カンガルー属 Macropus
: アカカンガルー M. rufus
コメント
オーストラリア大陸の草原地帯に広く分布し、50頭くらいの群れで生活し、さらに群れ内では年齢や性別で小さなグループが作られています。 育児嚢を腹部に持ち、なかには4つの乳首を持ちます。




【有袋類について】
有袋類は原始的な哺乳類であり、ジュラ紀の終わりか白亜紀のはじめ頃に誕生しました。全世界に展開しました。その後、真獣類に住みかを奪われ、海で隔絶されたオーストラリアを除いては、全滅してしまいました。真獣類は、私たちが”哺乳類”と聞いたときに想像する部類の動物です。ヒト、ライオン、ウマ、アザラシなど有名な動物が多数含まれます。

脊椎動物の系統

 哺乳類の分類




参考文献
ひがしやま動物園くらぶず~っといっしょ東山動物園公認ガイドブック 2012 中日新聞社 24 – 25 pp
東山動物園の動物ネームプレート
井出利憲「分子生物学講義中継 生物の多様性と進化の驚異」羊土社 2010 283, 286 - 288pp

真核生物の誕生からヒトに至るまで

真核生物が21億年前に誕生してから、今日のヒトに至る道のりがあります。

個人的には、襟鞭毛虫(えりべんもうちゅう)と分かれて、多細胞化を選んだ出来事は特に印象的です。一番原始的な多細胞動物と考えられている海綿には、襟鞭毛虫とそっくりの細胞が存在することが明らかにされているそうです。また、分子進化学的な解析からも両者の共通性が明らかになっているとのことです。



【参考文献】
井出利憲「分子生物学講義中継 生物の多様性と進化の驚異」羊土社 2010 252 - 258pp




絶滅危惧種のリスト

絶滅危惧種のリストのグローバルスタンダードは、IUCN Red Listと呼ばれるものです。
以下のサイトからアクセスして、どんな動物が指定されているかを調べることができます。

the red list of threatened species
the red list of threatened species

IUCN 日本委員会
http://www.iucn.jp/species/redlist.html
IUCN, the International Union for Conservation of Nature

例えば、pandaを検索すると、以下のようにジャイアントパンダがendangered されていることがよくわかります。

PHPを介してMySQLのデータベースの内容を操作するスクリプト


LAMP環境で、サッカー選手の背番号、名前、ポジションを管理するアプリケーションを作成しました。
作業工程は
(1)データベースの作成 
(2)登録用フォームの作成 
(3)サーバーサイドでデータベースにアクセスするPHPスクリプトの作成 
(4)データベースの情報を取得して表示するPHPスクリプトの作成 
の4つです。
ドキュメント以下のフィアル構成は下のようになります。

DocumentRoot
└── web
    ├── form.html
    ├── test.php
    └── uke.php


##### (1) データベース(player)の作成####
#playerデータベースを作成し、useする
mysql> create database player;
Query OK, 1 row affected (0.00 sec)
mysql> use player;
Database changed

#playerデータベースの中にplayerテーブルを作成
mysql> CREATE TABLE player (number smallint, name text, position text, date timestamp) engine=MyISAM;
Query OK, 0 rows affected (0.31 sec)

#データを入力
mysql> insert into player (number, name, position, date) values ( 1 , '川口能活', 'GK', now());
Query OK, 1 row affected (0.00 sec)

mysql> select number, name, position, date from player;
+--------+--------------+----------+---------------------+
| number | name | position | date |
+--------+--------------+----------+---------------------+
| 1 | 川口能活 | GK | 2013-01-07 23:11:37 |
+--------+--------------+----------+---------------------+
1 row in set (0.00 sec)

#####ここまで#####



#####(2)フォームの作成(/var/www/web/register.html)####

<html lang="ja">
<head>

<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>選手名鑑</title>
</head>

<body>
<form method="POST" action="register.php">
 <p>選手名鑑入力フォーム</p>
 <p>背番号 <input type="text" name="number"></p>
 <p>名前 <input type="text" name="name"></p>
 <p>ポジション <input type="text" name="position"></p>
 <input type="submit" value="登録">
</form>
<a href=./ichiran.php>登録選手一覧を見る</a>
</body>

</html>

####ここまで#####



####(3)フォームの入力情報をもとにデータベースにアクセスするスクリプト(register.php)###
<?php
//---------データの受け取り
$num = $_POST['number'];
$nam = $_POST['name'];
$pos = $_POST['position'];


//---------データベースのユーザー情報
$DBSERVER ="localhost";
$DBUSER="kappa";
$DBPASS ="kappa";
$DBNAME ="player";


///------------MySQLに接続
$con = mysql_connect($DBSERVER, $DBUSER, $DBPASS);
///------------エラー処理1
if(!$con){
 echo "データベース接続開始エラー<br>\n";
 mysql_close($con);
 exit;
}

///------------playerデータベースに接続
$selectdb = mysql_select_db($DBNAME);

///------------playerテーブルに入力
$query = "insert into player (number, name, position, date) values ('$num','$name','$pos',now())";

$result = mysql_query($query);
///------------エラー処理2
if(!$result){
 echo "データベースエラー<br>\n";
 mysql_close($con);
 exit;
}
?>

<html lang="ja">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<title>選手情報登録完了</title>
</head>
<body>
<p>登録が完了しました(〃 ̄∇ ̄)ノ</p>
<a href="./ichiran.php">選手情報の一覧を見る</a>
</body>
</html>


####ここまで####




#### (4)データベースの内容を表示するスクリプト#####

<?php

echo "<HTML lang=ja>\n";
echo "<HEAD>\n";
echo "<META HTTP-EQUIV=Content-Type CONTENT=text/html; CHARSET=UTF-8>\n";
echo "<TITLE>一覧表示</TITLE>\n";
echo "</HEAD>\n";
echo "<BODY>";
echo "<h3><p>選手一覧表示</h3></p>";
///-----------データベース情報
$DBSERVER ="localhost";
$DBUSER="kappa";
$DBPASS ="kappa";
$DBNAME ="player";

///------------MySQLに接続
$con = mysql_connect($DBSERVER, $DBUSER, $DBPASS);
///------------エラー処理1
if(!$con){
 echo "データベース接続開始エラー<br>\n";
 mysql_close($con);
 exit;
}


///------------データベースを選択
$selectdb = mysql_select_db($DBNAME);


///------------クエリを送る
$query = "select * from player; ";
///------------結果の取得
$result = mysql_query($query);

///------------エラー処理1
if(!$result){
 echo "データベースエラー<br>\n";
 mysql_close($con);
 exit;
}

///------------行数を取得
$num_row = mysql_numrows($result);
$num_field = mysql_num_fields($result);
echo "該当件数".$num_row."件です<br>\n";


echo "<table border=1>\n";
echo "<tr>\n";
///+++++++++ 列名 ++++++++++
for($i =0; $i < $num_field; $i++){
 echo "<th>".mysql_field_name($result, $i)."</th>";
}

///+++++++++ レコード表示 ++++++++++
for($j =0 ; $j < $num_row; ++$j){
 $row = mysql_fetch_array($result);
echo "<tr>";
  for($k=0; $k < $num_field; ++$k){
   echo "<td>".$row[$k]."</td>";
  }
echo "</tr>\n";
}
echo "</table>";

echo "<hr>計 $num_row 件<hr>\n";


///+++++++++ mysqlを切断 ++++++++++
mysql_close($con);

echo "<a href=./register.php>選手登録に戻る</a>";
echo "</BODY></HTML>";

?>


####ここまで#####
【参考文献】
清水正人 『6時間でできるLAMPサーバー構築ガイド』ソシム 2007 98 - 109 ,132 - 143pp

MySQLの基本操作集


#mysqlにログイン
$ mysql -u kappa -p
#testdbという名前のデータベースを作成
mysql> CREATE DATABASE testdb;
Query OK, 1 row affected (0.00 sec)

#現時点でのすべてのデータベースを表示
mysql> show DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kokyaku            |
| mysql              |
| phpmyadmin         |
| player             |
| testdb             |
+--------------------+
6 rows in set (0.03 sec)

#testdbを選択
mysql> use testdb;
Database changed
 
#現在使用指定いるdatabaseを表示
mysql> select database();
+------------+
| database() |
+------------+
| testdb     |
+------------+
1 row in set (0.00 sec)

#テーブルtesttbを作成
mysql> create table testtb (col1 int, col2 varchar(10));
Query OK, 0 rows affected (0.02 sec)

mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| testtb           |
+------------------+
1 row in set (0.00 sec)

#テーブルtesttb2を作成
mysql> create table testtb2  (col3 int, col4 varchar(10));
Query OK, 0 rows affected (0.03 sec)

#現在使用中のデータベース内のすべてのテーブルを表示
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| testtb           |
| testtb2          |
+------------------+
2 rows in set (0.00 sec)

#テーブルtesttbのテーブル構造を表示

mysql> desc testtb;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| col1  | int(11)     | YES  |     | NULL    |       |
| col2  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

#テーブルtesttb2のテーブル構造を表示
mysql> desc testtb2;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| col3  | int(11)     | YES  |     | NULL    |       |
| col4  | varchar(10) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

#testtbにレコードの追加
mysql> insert into testtb values(1, 'test');
Query OK, 1 row affected (0.00 sec)

#testtbにレコードの追加
mysql> insert into testtb values(2, 'test2');
Query OK, 1 row affected (0.00 sec)

#testtbのすべてのカラムの確認
mysql> select * from testtb;
+------+-------+
| col1 | col2  |
+------+-------+
|    1 | test  |
|    2 | test2 |
+------+-------+
2 rows in set (0.00 sec)

#testtbの内容をすべてコピーして新たなテーブルtesttb3を作成
mysql> create table testtb3 select * from testtb;
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

#テーブルを確認
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| testtb           |
| testtb2          |
| testtb3          |
+------------------+
3 rows in set (0.00 sec)

#testtb3のレコードを一覧
 mysql> select * from testtb3;
+------+-------+
| col1 | col2  |
+------+-------+
|    1 | test  |
|    2 | test2 |
+------+-------+
2 rows in set (0.00 sec)

#testtb3テーブルを削除(drop)する。
mysql> drop table testtb3;
Query OK, 0 rows affected (0.00 sec)

mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| testtb           |
| testtb2          |
+------------------+
2 rows in set (0.00 sec)

#testtbデータベースを削除
mysql> drop database testdb;
Query OK, 2 rows affected (0.02 sec)

#データベースの確認
#testtbが削除されていることが確認することができる。
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| kokyaku            |
| mysql              |
| phpmyadmin         |
| player             |
+--------------------+
5 rows in set (0.00 sec)

【参考文献】
西沢夢路『基礎からのMySQL』SoftBank Creative2012 30 - 58 ,  96 - 110pp



Relational Databaseの基本

#データベースの定義
データベースとは、何らかの規則性を持ったデータの集まりを意味します。ただやみくもに集めたデータの集合はデータベースとは呼びません。

#データベースの起源
第二次世界大戦後の米軍が、膨大な資料を効率的に管理することを目的として、情報を1つの基地に集めました。この集められた情報の基地をデータベース(Database) と読んだのが始まりと言われているそうです。

#Relational Database
1件のデータをレコード、項目をカラム(列)と呼びます。レコードの集まりである表をテーブルと呼びます。1つのデータベースは複数のテーブルを保持します。



#RDBMS
RDBMS: Relational DataBase Management Systemの略。Oracle, Access, PostgreSQL, MySQLが含まれます。

#MySQLの特徴
・動作が速い
・オープンソース
・多くのOSで動作する
・多くのプログラム言語が対応している
・無償および有償の2つの形態がある


【参考文献】
西沢夢路『基礎からのMySQL』SoftBank Creative2012 2 - 8pp

辺リスト

#パッケージのロード
library(igraph)

#辺リストの作成
e.list <- c(1,2,1,3,2,1,2,3,4,1)
e.matrix <- matrix(e.list, ncol = 2, byrow = TRUE)
e.matrix
     [,1] [,2]
[1,] 1 2
[2,] 1 3
[3,] 2 1
[4,] 2 3
[5,] 4 1
g <- graph.edgelist(e.matrix)
png("graph.png")

plot(g, vertex.label=V(g)$name)
dev.off()



【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、2 - 6 pp



ランダムグラフの作成


ランダムグラフの作り方

まずn個の頂点を用意します。各2点間(全部で n(n-1)/2ペア)について、それぞれさいころをふって出た数によって確率pでエッジを与え、確率1-pで与えないだけです。
頂点の数n = 50の条件で、pの値を0.01, 0.05, 0.1, 0.3と変化させて、どのようなグラフができるかを見てみます。

library(igraph)

#pの値を変化させて目的のグラフを作成
g1 <- random.graph.game(50, p=0.01, direct=F)
g2 <- random.graph.game(50, p=0.01, direct=F)
g3<- random.graph.game(50, p=0.1, direct=F)
g4 <- random.graph.game(50, p=0.3, direct=F)

#各々をプロットする
png("random.graph.png")
par(mfrow=c(2,2))
plot(g1, main = "random graph n = 50, p = 0.01")
plot(g2, main = "random graph n = 50, p = 0.05")
plot(g3, main = "random graph n = 50, p = 0.1")
plot(g4, main = "random graph n = 50, p = 0.3")
dev.off()



pの値が小さいと、ネットワークが分断してしまいました。pの値を大きくすると、ネットワークは密になり、pが0.3では極めて密なネットワークが生成しました。

【参考文献】
増田直紀 今野紀雄 『「複雑ネットワーク」とは何か』 講談社 2006 54 - 57pp

ネットワーク分析 - 歴史、トピック、用語集


###歴史的な視点から####
#グラフ理論の創始者
オイラー(1707 - 1783)
ケーニヒスベルグの橋の問題

#グラフ理論を数学的に体系化 
ジョージ・ポリア(1887 - 1985)

#近代グラフ理論の父
フランク・ハラリー(1921 - 2005)
グラフ理論の数学的側面だけでなく、応用面にも広く興味を示した。
グラフ理論が様々な分野で実用化される契機を作った立役者
数学、物理学、人類学、生物学、化学、コンピュータ科学、地理学、言語学、音楽、政策科学、心理学など多岐にわたる分野で論文を約700報執筆

#日本のグラフ理論の開拓者
秋山仁
アメリカにハラリーに師事

###トピック###
#エルデシュ数
20世紀の大数学者、ポール・エルデシュ(1913 - 1996)の共著関係のネットワーク。
エルデシュからスタートして、ある研究者に到達するのに必要な枝数をエルデシュ数と呼ぶ。
#ケビン・ベーコンゲーム
アメリカの有名俳優ケビン・ベーコンと他の俳優の共有関係を結びつけるゲーム
ケビン・ベーコンの神託(http://oracleofbacon.org//movielinks.php)

Kevin Baconとleonardo DiCaprioの関係

#ベースボールのネットワーク
アメリカのベースボールで同じチームでプレイしたことのある選手を結んだ線によるネットワーク
ベースボールの神託(http://www.baseball-reference.com/oracle/)
#ミルグラムのスモールワールド実験
1960年代後半、アメリカの心理学者スタンレー・ミルグラム(1933 - 1984)のチームが行った社会実験。アメリカ東海岸北部にあるボストンにすむX氏に向けて、ボストン市内やアメリカ中部から手紙をリレーして届けるというものである。現実の人間関係ネットワークを模擬するために、手紙を渡していい相手はファースト・ネームで呼び合えるくらいの関係に限定。この実験の結果、平均6回程度のリレーでX氏まで手紙が到達した。すなわちネットワークの平均距離は6であるといえる。

#ワッツのスモールワールド実験
コロンビア大学のダンカン・ワッツ(1971 -)の率いるスモールワールド・プロジェクトによって行われた、現代版スモールワールド実験。国をまたぐ形で実験計画が組まれた。その結果、スタートとゴールが同じ国の場合は5, 違う国の場合は7と推定された。これは、ミルグラムのスモールワールド実験を指示する結果であった。

#スモールワールド実験が示唆するもの
異なる職業の人々や離れたところに住む人々を結びつける近道が、たくさんではないにしても適量存在することが、情報を早く伝えるためには重要である。

#現実のネットワークが持っているべき特徴
・スモールワールド性(小さい平均距離、大きいクラスター係数)
・大きすぎない平均次数

#ネットワークの種類と比較



###用語###
#ネットワークの平均距離
ネットワークのすべての頂点対の距離の平均。
ネットワークの平均距離が6の場合、「6次の隔たり」と呼ぶことがある。

#次数
一つの頂点から出る枝のこと数のこと。

#クラスター係数
ネットワーク全体の三角形を数えて、最も多いときを1、最も少ないときを0とするおうに調節して、クラスター係数は定義されている。


###ネットワークの種類####


【参考文献】
増田直紀 今野紀雄 『「複雑ネットワーク」とは何か』 講談社 2006 

隣接行列から有向グラフを作成する



##以下, Rのスクリプト##

dg <- matrix(c(0,1,1,0,  1,0,1,0,  0,0,0,0,  1,0,0,000) , nrow = 4, ncol = 4, byrow = T)

dg
      [,1] [,2] [,3] [,4]
[1,]    0    1    1    0
[2,]    1    0    1    0
[3,]    0    0    0    0
[4,]    1    0    0    0

#igraphで利用可能なグラフオブジェクトを作成する。
g <- graph.adjacency(dg, mode="directed")

png("directed-graph.png")
plot(g)
dev.off()

【参考文献】
金明哲『Rで学ぶデータサイエンス 8 ネットワーク分析』2009 共立出版 序文、2 - 5 pp


######数式のtexスクリプト#####
%graph.tex
\documentclass{jarticle}
\usepackage{amsmath}
\begin{document}
ある特定のネットワークを数学的にグラフ$G$として表記するには以下のようにします。
\begin{eqnarray} 
G = (V, E)
\end{eqnarray}
ここで$V$と$E$はそれぞれ頂点と辺の集合を表しています。\\
今、頂点と辺の数を各々$i$, $j$とすると、$V$と$E$は以下のように表すことができます。
\begin{eqnarray} 
V = \{v_1, v_2, \dots, v_i\} \\
E = \{e_1, e_2, \dots, e_j\} 
\end{eqnarray}
グラフの特徴を知るにためにはさまざまな演算をするので、グラフを隣接行列: adjacency matrixによって
表現します。隣接行列は、頂点間の関係性の有無を総当たりで記述するものですので、$n$個の頂点から構成される
グラフの隣接行列$A$は$n \times n$の正方行列となります。
\begin{eqnarray} 
A= (a_{k,l})
=\left[ 
\begin{array}{ccc}
a_{0,0} & \cdots & a_{1,n} \\
\vdots & \ddots & \vdots \\
a_{n,1} & \cdots & a_{n,n} \\
\end{array} 
\right]
\end{eqnarray}
ただし、$a_{i,j}$は以下の値を取る。
\begin{eqnarray}
a_{i,j} = \begin{cases}
1 & 頂点iから頂点jへの辺がある \\
0 & 頂点iから頂点jへの辺がない
\end{cases}
\end{eqnarray}
隣接行列から有向グラフを作成する例として、以下の隣接行列を考えたい。
\begin{eqnarray}
\left(
\begin{array}{cccc}
0 & 1 & 1 & 0\\
1 & 0 & 1 & 0 \\
0 & 0 & 0 & 0 \\
1 & 0 & 0 & 0 \\
\end{array}
\right)
\end{eqnarray}
この隣接行列が示す有向グラフをRを用いて作成する。
\pagestyle{empty}
\end{document}



#####ここまで####