自分のための備忘録的なブログです。

Ubuntu14.04LTS を使って、ディープラーニングの勉強をしています。
記載されているコードは、他の OS には互換性がない可能性があります。


DNN:
マシン性能別 学習速度の比較, TFチュートリアルをmodifyする
python3:
オブジェクト指向プログラミングとは, システムコマンド(os), ファイル・フォルダ名取得, 画像の前処理,
R lang:
R基本コマンド, Rデータ形式, RStudio文字化け(os), RStudio背景黒,
Ubuntu14 の初期設定:
Ubuntu14初期設定, 初期設定-2, cudaなども, 初期設定-3

R データ形式の基本

参考:

http://www.kabipan.com/computer/r/quick.html プログラマ向け?

参考図書:

R による医療統計学, 丸善

RStudioで始める Rプログラミング入門 O'Reilly

 

 

準備

インストール

 afni インストール時に、合わせてインストールされている。

1.1.2. Ubuntu Linux (15.10 and earlier): The essential system setup — AFNI, SUMA and FATCAT: v17.3.09

 RStudio を使うつもりなので、合わせてインストール。

Download RStudio – RStudio

$ sudo dpkg -i filename

でインストールした気が。

 

実践

データ形式

基本のデータ型(type)は6つ。

 double(倍精度浮動小数点数), integer(整数), character(文字), logical(論理値), complex(複素数), raw(バイナリ)

 このうちで頻繁に使うのは、double, character, logical。

 logical は Python でいうところの boolean: true or false. ただし R では、全て大文字の TRUE, FALSE が使われる。

 

 type は 属性 attribute の一種で、typeof( ) 関数でアクセスする。

事前に規定されている属性には、type, mode, class があり、それぞれ typeof( ), mode( ), class( ) 関数でアクセスでる。"double", "numeric" など、 NULL ではない値が割り当てられている。

 names 属性は特殊で関数 names( ) があるが、names 属性は初期値が NULL となっている。

> a <- 1

> typeof(a)

"double"

> a <- "test"

> typeof(a)

"character"

 

プログラミング言語としての R

R はオブジェクト指向プログラミング言語であり、データをオブジェクトとして扱う。

オブジェクト指向プログラミング(OOP)とは

動的プログラミング言語でもあり、実行前にコンパイルは行わない。

 

オブジェクトの最小単位

最小単位は「アトミックオブジェクト」 atomic object

これはアトミックベクタ atomic vector とほぼ同義。違いは分からないけれど。 

 

オブジェクトの生成

 アルファベットや記号を用いてオブジェクトを作成できる。アルファベットの大文字と小文字は区別され、数字や大部分の記号は先頭に来ることはできない。

 記号について、先頭に使うのは他のプログラミング言語と同様、アンスコ(_ アンダースコア)だけとするのがいいと思われ。例えばピリオドは先頭に来ることができるが、特殊な意味を持つらしく、使わない方が良いらしい。

 

 オブジェクトに数値、文字列など、前述の「基本のデータ型」を代入できる。

 

 代入記号は、普通のプログラミング言語の = イコールではなく、 "<-" 左向き矢印。 

 

> a <- 1  ### a というオブジェクトに 数字の 1 を代入する。

> A <- 2  ### A というオブジェクトに 数字の 2 を代入する。

> a

# 1

> A

# 2

> is.atomic(a)  ### オブジェクト a はアトミックオブジェクト。

# TRUE

 

 

一つのオブジェクトに複数データを入力する。

 一つのオブジェクトには、複数のデータを入れることができる。ただしデータ型は統一しなければならない。

 

 複数のデータを挿入するときに頻用されるのが c( ) 関数(construct)。これは複数のデータをまとめたり、python でいう list.append( ) のような機能があったり。

 連続する数値を入力するときには : が便利で、これは python で言う range 関数のようなもの。違うけど。 

 

> c <- c(1, 2, 3) # オブジェクト c に、浮動小数点数 1, 2, 3 を代入する。

> c

# 1 2 3

> typeof(c)

# "double"

> typeof(a) # a <- 1 で作成したオブジェクト a も、浮動小数点数

# "double"

> length(a)

# 1

> length(c)

# 3

 

整数か浮動小数点数か?

 数値を普通に代入すると、多くの場合は浮動小数点数になっている。

 integer にするには、「L を使って明示的に指定する」、「コロン:を使って連続する数値を代入する」などがある。が、普通に使うには、double で問題なさそうであるが・・・

 

> int_a <- 1L # L を使って、数字を明示的に integer にする。

> int_a

# 1

> typeof(int_a)

# "integer"

> mode(int_a)

# "numeric"

> int_b <- c(1:3) # コロンを使った連続する整数の入力

> int_b

# 1 2 3

> typeof(int_b)

# "integer"

> mode(int_b)

# "numeric"

 

文字列の入力

 文字列の入力はシングルクォートまたはダブルクォート 'char' または "char"。

 何かの教科書に ダブルクォート " の方がいいと書いてあった。 ' と ` が紛らわしいから。

 

> d <- "test"

> d

# "test"

> typeof(d)

# "character"

> mode(d)

# "character"

 

R object の様々な型

 R でオブジェクトは "typeof" の他に "mode", "class", "names" などの型がある。 各種の型には、"attribute( )" 関数でアクセスできる。

 (多分) typeof と mode は上書きできない特殊な型だが、他の型は明示的に上書きすることができる様子(後述)。

 

> mode(a)

# "numeric"

> length(a)

# 1

> mode(d)

# "character" 

 

 

vector とは

 "「ベクトル」というのは、たんに(mode と length と names 以外の)属性を持たないオブジェクトということである。"

引用 http://www.kabipan.com/computer/r/quick.html, Accessed: Jan/3/2018

※ すべてのオブジェクトは typeof, mode, length の他に class 属性を持っているので、上記の定義は厳密には間違っているはず・・・ 

 

 一般には 1次元の配列をベクトルと呼ぶ。しかし、R では違うらしい。教科書では比較的最初のほうで「ベクトル」という単語が、定義なしで出てきて、R 初学者を悩ませる。

 さて、R コンソールで、typeof( ), mode( ), class( ) などでオブジェクトを調べても "vector" という用語は出てこない(教科書にはたくさん出てくるのに!)。 おそらく "vector" とは「list( ) などではない、その他のオブジェクト」ということなのでしょう。

 

 これまでに mode と length は出てきた。names とは?

 

属性 "names" の設定

> names(a)

# NULL

> names(a)  <- "test_object"

> names(a)

# "test_object"

> names(a) <- 1

> names(a)

# "1"

> names(a) <- TRUE

> names(a)

# "TRUE"

 

 ということで、オブジェクトの "names" 属性には文字列を挿入することができる。numeric や logical データを挿入しようとしても、character に変換される。

 

atomic object 内の、データ型の変換

 一つのオブジェクトに異なるデータを入れようとすると、データ型は変換される。

 

> e <- c(1, "test")

> e

# "1", "test"

> typeof(e)

# "character"

> mode(e)

# "character"

 

atomic object 内でのデータ変換の規則は

1.文字列型があれば文字列型へ

2.数値型があれば数値型へ

3.論理型のみなら論理型。

 

 

論理型の変換規則

 数値データに変換される場合、TRUE が 1, FALSE が 0。

 文字列型に変換される場合、TRUE は "TRUE", FALSE は "FALSE" へ。 

  ここはトラップな印象。論理型→数値型→文字列型 と順々に変更すると "1", "0" になるのに対し、論理型→文字列型 にダイレクト変換だと "TRUE", "FALSE" になる。

 

文字列 vector, 論理値 vector の作成  

> Prime <- c("Abe", "Trump", "Kim")

> Prime

"Abe" "Trump" "Kim"

> log_vec <- c(T, T, F)   ### TRUE, FALSE は、それぞれ T, F と省略できる。

> log_vec

TRUE, TRUE, FALSE

 

要素の抽出(Python でいう スライス)

> Prime[1]    # 添字は 1からスタートする

# "Abe"

> Prime[2]

# "Trump"

 

> Prime[3]

# "Kim"    ### よしよし。

> Prime[4]

# NA        ### なるほど

> Prime[0]

# character(0)     ### ??

> Prime[-1]

# "Trump", "Kim"    ### えっ?

> Prime[-2]

# "Abe", "Kim"      ### ええええーっ?

 

ブロードキャスト, vector recycling

numpy.array で、各要素一気に計算するブロードキャスト(broadcasting)は、R では標準ライブラリに入っている(vector recycling)。

 

> data_list <- c(1, 2, 3, 4, 5, 6)

> data_list / 2

# 0.5, 1.0, 1.5, 2.0, 2.5, 3.0 

 

> tmp <- c(1, 2)

> data_list / tmp

# 1, 1, 3, 2, 5, 3    ### 1/1, 2/2, 3/1, 4/2, 5/1, 6/2 という風に、要素数が少ないほうがリサイクルされる: vector recycling

 

行列を作る

numpy で言うところの、

>>> a = np.arange(12).reshape( (3, 4)) 

>>> a

array([[ 0, 1, 2, 3],
          [ 4, 5, 6, 7],
          [ 8, 9, 10, 11]])

 

 複数の要素を持つ vector に、属性 dim( ) を与えることで、行列や配列を作ることができる。二次元の属性 dim( ) を持つ配列が行列。

 

> a <- 1:12

> dim(a) <- c(3, 4)

> a

      [,1] [,2] [,3] [,4]
[1,]   1    4    7   10
[2,]   2    5    8   11
[3,]   3    6    9   12

 

Python は数字は 0 からスタート。R で数字は 1 からスタート。

2次元の np.array はデフォルトで行優先で並べる。R は列優先で並べるので、np.array と同じように並べるには

> matrix(1:12,nrow=3,byrow=T)

      [,1] [,2] [,3] [,4]
[1,]   1    2    3    4
[2,]   5    6    7    8
[3,]   9  10  11  12

 

ヘルプの表示は ?function_name

> ?matrix

....

Usage

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE,
dimnames = NULL)

....

# なるほど、行か列のどちらか(nrow か ncol)指定すれば、行列のもう一個の方は自動で計算されるのね。

 

行列と配列

R による医療〜 によると、行列とは 2次元の配列っぽい。逆に言えば多次元の行列が配列であると。ちゃんと書いていないけれど、1 次元のデータが vector, 2次元が 行列、多次元が 配列ということか。

 

ファクタ

R による医療〜 より。カテゴリカルデータの保持に有用とのこと。

 

リスト

 リストはアトミックオブジェクトではない

 リストは複数のアトミックオブジェクトやリストを一つのオブジェクトにまとめることができるもの。Python で言うところの・・・なんだろう。Python の tuple とは異なり、ミュータブルである。  

 

> a <- 1

> b <- c("1", "test")

> L <- list(a, b)

> L

1

[1] 1

2

[1] "1", "test"

> typeof(L)

# "list"

> mode(L)

# "list"

 

リスト内の要素へのアクセス

> L1

# 1

> L2

# "1", "test"

> L2[1]

# "1"

 

オブジェクトに属性を与える

> ?attr

....

Usage

attr(x, which, exact = FALSE)
attr(x, which) <- value

....

 

 object x の which という属性(which は文字列)にアクセスして、value という属性を与える。value に NULL で属性を削除できる。

 

> tmp <- 1:12

> tmp

1 2 3 4 5 6 7 8 9 10 11 12

> attr(tmp, "tmp_attr") <- "empty"

> attr(tmp, "tmp_attr")

"empty"

> tmp

1 2 3 4 5 6 7 8 9 10 11 12

attr(tmp, "tmp_attr")

"empty"

 

属性を削除する

> attr(tmp,  "tmp_attr") <- NULL

> attr(tmp, "tmp_attr")

# NULL

> tmp

[1] 1 2 3 4 5 6 7 8 9 10 11 12

 

 

特殊な属性

 前述の通り、 typeof と mode は上書きできない型の様子。

 その他、names( ) と class( ) は標準ライブラリに関数が設定されている特殊な型だが、typeof や mode と異なり、上書きすることができる。

 

> a <- 1:6

> a

1 2 3 4 5 6

> typeof(a)

"integer"

> mode(a)

"numeric"

 

> attr(a, typeof") <- "tmp"

> typeof(a)

"integer"   ### 変更不可

 

> attr(a, "mode") <- "tmp"

> mode(a)

"numeric"  ### 変更不可

 

> class(a)

"integer"

> dim(a) <- c(2, 3)

> class(a)

"matrix"   ### オブジェクトを配列に変換すると、class は "matrix" に。

> attr(a, "class") <- "tmp"

> class(a)

"tmp"

 

> a <- 1:6

> dim(a) <- c(2,3)

> class(a)

"matrix"

> class(a) <- "tmp"   ### attr( ) を使わず、class( ) でもアクセスできる。

> class(a)

"tmp"

 

基本的に、class は自動的に設定された値を使用するべき。

class に基づいてメソッドが呼び出されるため、 class の変更はバグの一因になりうる。

ただし、自分で 明示的にオブジェクトを作成する場合には、適切な処理を行うために class を明示的に指定する必要があるかもしれない。

 

名前属性 names( )

 名前属性は特殊な attribute で、この属性を持っていても vector でいることができる。基本的には > attr(tmp, "names") でアクセスするが、> names(tmp) でもアクセスすることができる