cocomoff("blog")

@cocomoffの奇妙な日常.

ランダムにしゃふしゃふしゃふ

Scalaの乱数ライブラリ(scala.util.Random)に面白い関数があったので使ってみた.

scala> import scala.util.Random.shuffle
import scala.util.Random.shuffle

scala> val Ids = for(i <- 0 until 10) yield i
Ids: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)

scala> val rIds = shuffle(Ids)
rIds: scala.collection.immutable.IndexedSeq[Int] = Vector(9, 6, 8, 5, 7, 4, 0, 1, 2, 3)

ランダムにシャッフルしてくれる.

配列

scala> val a = Array.ofDim[Int](2, 3)
a: Array[Array[Int]] = Array(Array(0, 0, 0), Array(0, 0, 0))

こんな知らんし…(多次元配列)

Macで綺麗なEPSファイルを作ってTeXに使いたい.

僕のクソい流れ.

1. Keynoteでオブジェクト配置

2. それらを選択してPreview.appに貼付け

3. Print→PSで保存

4. ps2epsでPSファイルをEPSファイルに.

Scalala使ってHITSアルゴリズムの計算(笑)を書いてテストしていた

前回,ようやくScalalaが使えるようになったので,ようやく線形代数のライブラリが使えるようになりました.統計とかはあんまり入ってないのでScipyっぽくは使えないのですが,まぁ我慢するとしましょう.行列とベクトル程度で書けるようなものがすぐ思いつかなかったので(後で思いついたのですが,線形回帰とか主成分分析も書けますね),HITSアルゴリズムのハブとオーサの計算をテストしてみた.自分で例題を考えたわけではなく,これらのサイトを参考にしてきました(ありがとうございます).

準備

昨日の記事でビルドしたscalalaの出力してくれたjarファイルを使います.具体的にはこの2つ.

  • scalala_2.9.1-1.0.0.RC3-SNAPSHOT.jar
  • scalala_2.9.1-1.0.0.RC3-SNAPSHOT.min.jar

ところでこういうiterativeなメソッドってvalの変数と相性悪いですよね,リストにするのかな?本当は.僕はそういう高度な技術は持ってないので普通にvarの変数使います.

import scalala.scalar._
import scalala.tensor.::
import scalala.tensor.mutable._
import scalala.tensor.dense._
import scalala.tensor.sparse._
import scalala.library.Library._
import scalala.library.LinearAlgebra._
import scalala.library.Statistics._
import scalala.library.Plotting._
import scalala.operators.Implicits._

object Main{
  def main(arg: Array[String]) = {

    // L
    val L = DenseMatrix.zeros[Double](6,6)
    L(0,2) = 1.0; L(0,4) = 1.0
    L(1,0) = 1.0
    L(2,4) = 1.0
    L(4,2) = 1.0; L(4,3) = 1.0
    L(5,4) = 1.0
    
    // initial value of y and repeat 20 times
    val y0 = DenseVector.ones[Double](6)
    val iterMax = 20
    val _xi = L.t * y0
    var xi = _xi / _xi.sum
    var yi = y0
    for( i <- 0 until iterMax ) {
      xi = L.t * yi
      xi = xi / xi.sum
      yi = L * xi
      yi = yi / yi.sum
    }

    // output
    println(" -- L.T * L -- ")
    println(L.t * L)

    println(" -- x 20 -- ")
    xi.foreach{ ch => printf(" %2.4f¥n", ch) }
    
    println(" -- y 20 -- ")
    yi.foreach{ ch => printf(" %2.4f¥n", ch) }    

  }
}

APIがあまりよくわかってないのは秘密ですわよ.

Scalalaを使う方法を調べた

公式サイトに書いてあるけど,まだ微妙に使えないのかもしれない.

1. sbtに任せる

sbtに任せる場合,公式サイトのやり方だとNGだったので,少しbuild.sbtを変更しないといけない.

name := "sample"

version := "1.0"

scalaVersion := "2.9.0"

libraryDependencies  ++= Seq(
  "org.scalala" %% "scalala" % "1.0.0.RC2-SNAPSHOT"                               
)
resolvers ++= Seq(
  "Scala Tools Snapshots" at "http://scala-tools.org/repo-snapshots/",
  "ScalaNLP Maven2" at "http://repo.scalanlp.org/repo"
)

あとはsbtを起動してreload→updateすると準備してくれる.

2. 公式から取ってきてビルドする

git clone git://github.com/scalala/Scalala.git

して,配布されている中身のsbtを使って起動,準備されたあとにproguardする.こうするとconsoleですぐにScalalaのライブラリが使えた.配布物はtarget/scala-2.9.1直下にjarファイルが生成されて,docするとドキュメントも生成される.

# val x = DenseVector(1, 2, 3)
# x.t * x
res0: Int = 14

Markdown記法がDayOneでも使えるようだ

DayOneは以前紹介したアプリだけど,Markdown記法で入力しておくとあとで少しだけ反映されるらしい.どれほど使えるかはわからないけど….

# 見出し1 #
## 見出し2 ##

1. リスト
2. リスト
3. リスト

**強調**
*斜体*

これぐらいは使えるようだ

[TeX]論文を添削してもらう時のダブルスペース

論文を添削してもらうとき,行間を広めに取っておくといろいろと捗ります.こういうときは簡単に,setspace.styを利用しましょう.プリアンブルに

\usepackage{setspace}
\singlespacing
% \onehalfspacing
% \doublespacing