C++で統計解析

先月開催されたJapan.R 2013の懇親会で,「C++で統計解析を行うための良いライブラリは?」という話がありました.

統計解析と一口に言っても結構広いので,ここでは以下の4つのカテゴリ

  • 記述統計量(最大値,最小値,平均値,分散等)
  • 統計的検定(t検定,χ2乗検定等)
  • 多変量解析(線形回帰,一般化線形モデル,判別分析,主成分分析,因子分析等)
  • 機械学習(サポートベクタマシン,ランダムフォレスト等)

に分けてライブラリがサポートする機能を整理してみると,下表のようになります*1.ここでは,Scytheなどの数値計算用のライブラリ,Shogun, Vowpal Wabbitなどの機械学習に特化したライブラリは対象外としています.他にもこんなライブラリがあるよ!という方は是非教えてください.

ライブラリ 記述統計量 統計的検定 多変量解析 機械学習
Boost.Accumulators
×
×
×
Apophenia
×
ROOT
GSL
×(?)
×(?)
ALGLIB

○:多くの手法を提供 △:少数の手法を提供 ×:非提供

機能の網羅性という観点からはALGLIBが良さそうなので,本記事ではこのライブラリについて調べてみましょう.

ALGLIBとは

ALGLIBは,GPLライセンスのもとでOSSとして提供される数値計算およびデータ処理のためのソフトウェアです.C++, C#, Python, VBAなど多くのプログラミング言語から呼び出すことができます.商用版もあり,マルチスレッドIntel Math Kernel Libraryを用いた最適化・高速化などに対応しています.

以下のような機能を提供しています.

ダウンロードと解凍

以下のコマンドによりファイルをダウンロードし,解凍します.

$ wget http://www.alglib.net/translator/re/alglib-3.8.2.cpp.zip
$ unzip alglib-3.8.2.cpp.zip

cppというディレクトリが作成されます.

$ ls
cpp

ALGLIBが提供する機能は,cpp/srcディレクトリに格納されているヘッダファイルとcppファイルに記述されています.

$ ls cpp/src/
alglibinternal.cpp  dataanalysis.h      interpolation.cpp  solvers.h
alglibinternal.h    diffequations.cpp   interpolation.h    specialfunctions.cpp
alglibmisc.cpp      diffequations.h     linalg.cpp         specialfunctions.h
alglibmisc.h        fasttransforms.cpp  linalg.h           statistics.cpp
ap.cpp              fasttransforms.h    optimization.cpp   statistics.h
ap.h                integration.cpp     optimization.h     stdafx.h
dataanalysis.cpp    integration.h       solvers.cpp

データ構造

ALGLIBでは,以下のようなデータ構造が提供されています.

  • 扱える型
    論理値(boolean),整数(integer),倍精度浮動小数点(real),複素数(complex)の4つ.複素数については,ALGLIB独自の実装も提供している.
  • 1次元の配列
    扱える型に応じて,boolean_1d_array, integer_1d_array, real_1d_array, complex_1d_arrayの4つ.
  • 2次元の配列
    扱える型に応じて,boolean_2d_array, integer_2d_array, real_2d_array, complex_2d_arrayの4つ.

使用例1) 相関係数の算出

まずはサンプルを参考に, x = (0, 1, 4, 9, 16, 25, 36, 49, 64, 81)^{\mathrm{T}} y = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)^{\mathrm{T}}の間の相関係数を算出してみましょう.

#include <iostream>
#include "statistics.h"

using namespace std;
using namespace alglib;

int main()
{
  // ALGLIBを用いた相関係数の算出

  real_1d_array x = "[0,1,4,9,16,25,36,49,64,81]";
  real_1d_array y = "[0,1,2,3,4,5,6,7,8,9]";
  double v;

  cout.precision(8);

  // 共分散
  v = cov2(x, y);
  cout << "共分散: " << double(v) << endl;

  // Pearsonの相関係数
  v = pearsoncorr2(x, y);
  cout << "Pearsonの相関係数: " << double(v) << endl;

  // Spearmanの相関係数
  v = spearmancorr2(x, y);
  cout << "Spearmanの相関係数: " << double(v) << endl;

  return 0;
}

real_1d_arrayは1次元の倍精度浮動小数点の配列です.このデータ構造に,カンマ区切りの値を"[]"で囲んで文字列として代入しています.

srcディレクトリ内のすべてのヘッダファイルとcppファイル,および上記のソースコードのファイル(ここでは"test_cor.cpp"とします)を同じディレクトリに格納し,以下を実行します.

$ g++ -o test_cor *.cpp
$ ./test_cor 
共分散: 82.5
Pearsonの相関係数: 0.96269074
Spearmanの相関係数: 1

使用例2) 線形回帰

線形回帰は以下のように実行します(参照ページ).

#include <iostream>
#include <vector>
#include "dataanalysis.h"

using namespace alglib;
using namespace std;

int main()
{
  // ALGLIBを用いた線形回帰

  // データセットの作成
  vector<double> xrange;
  vector<double> yrange;

  xrange.push_back(1.0); xrange.push_back(2.3); xrange.push_back(3.1);
  xrange.push_back(4.8); xrange.push_back(5.6); xrange.push_back(6.3);

  yrange.push_back(2.6); yrange.push_back(2.8); yrange.push_back(3.1);
  yrange.push_back(4.7); yrange.push_back(5.1); yrange.push_back(5.3);

  if (!xrange.empty() && !yrange.empty()) {
    // real_2d_arrayへのデータの格納
    int npoints = min(xrange.size(), yrange.size());//points
    real_2d_array xy;
    xy.setlength(npoints, npoints);
    for (int i = 0; i < npoints; i++) {
      xy(i, 0) = xrange[i];
      xy(i, 1) = yrange[i];
    }

    // 線形回帰の実行
    ae_int_t nvars = 1;
    ae_int_t info = 0;
    linearmodel lm;
    lrreport ar;
    lrbuild(xy,
            npoints,
            nvars,
            info,
            lm,
            ar);

    real_1d_array v;
    lrunpack(lm, v, nvars);

    // 回帰係数の出力
    // y = mx + b:
    // m (slope)  :  0.5842
    // b (y - int)  :  1.6842

    cout.precision(8);
    if (nvars > 0) {
      cout << "m: " << v(0) << " b: " << v(1) << endl;
    }
  }

  return 0;
}

real_2d_arrayにデータを格納して,lrbuild関数で線形回帰を実行し,lrunpack関数で回帰結果を取得しています.

コンパイルして実行します.

$ g++ -o test_lsfit *.cpp
$ ./test_lsfit 
m: 0.58418428 b: 1.6842239

使用例3) ランダムフォレスト

ALGLIBでは,Breiman(2001)のランダムフォレストのアルゴリズムを発展させたランダム決定フォレスト(Random Decision Forest)が実装されています.
インタフェースを調査中.分かり次第,書きます!

所感

統計解析は普段R(やPython)で行っているため,C++でこうした処理を行うこと自体が不思議な感じですが,やはり探索的なデータ解析には向いていないという印象です.
また,Rではデータフレームという型を中心として各種の統計解析の手法が実装されていますが,C++では特に複数のソフトウェアを用いる場合,共通した型がないためシームレスな連携が難しそうです.例えば,ALGLIBで主成分分析した結果をVowpal Wabbitで機械学習したいなどというニーズに応えるためには,型の変換や共通化が必要になるでしょう.

また機会があったら調べてみたいと思います.

*1:MCMCベイズ的な手法など多くが漏れていますが,それらについてはまた今度別に整理したいところです

Million Song Dataset

あけましておめでとうございます.今年もよろしくお願いいたします.

Rでbigmemoryffなどを使用して大規模なデータを扱うときのサンプルデータとして,Data Expo 2009のフライトデータが用いられることが多いようです.しかし,このデータのサイズは約12GBであり,最近のコンピュータではメモリに載ってしまうという指摘もよく受けるようになって来ました.

そこで,より大規模なデータセットを探してみました.次のようなデータセットが手軽に利用できます.

この中から,"Million Song Dataset"を選んでみましょう.

HDF5とは

Million Song Datasetは,HDF5というデータ形式で提供されています.HDF5は,Hierarchical Data Format 5の略で,データを階層的に保持するデータ形式で,衛星データなどでよく用いられているようです.
HDF5のデータ形式のモチベーションについては,id:salondunordさんの「HDF5フォーマットに関するメモ書き」CSVとの対比の説明が分かりやすいです.

データのダウンロード

Million Song Datasetは,infochimpsおよびAWSで提供されています.

今回は10,000レコードに限定したMillion Song Subsetを利用してみましょう.まずファイルをダウンロードして解凍します.

$ wget http://static.echonest.com/millionsongsubset_full.tar.gz
$ tar xzvf millionsongsubset_full.tar.gz

作成されたMillionSongSubsetディレクトリのdataディレクトリにデータが入っています.階層的にデータが格納されていることを確認できます.

$ ls 
MillionSongSubset millionsongsubset_full.tar.gz
$ tree MillionSongSubset/ | head -n 35
MillionSongSubset/
├── AdditionalFiles
│   ├── LICENSE
│   ├── README
│   ├── subset_artist_location.txt
│   ├── subset_artist_similarity.db
│   ├── subset_artist_term.db
│   ├── subset_msd_summary_file.h5
│   ├── subset_track_metadata.db
│   ├── subset_tracks_per_year.txt
│   ├── subset_unique_artists.txt
│   ├── subset_unique_mbtags.txt
│   ├── subset_unique_terms.txt
│   └── subset_unique_tracks.txt
└── data
     └── A
        ├── A
        │   ├── A
        │   │   ├── TRAAAAW128F429D538.h5
        │   │   ├── TRAAABD128F429CF47.h5
        │   │   ├── TRAAADZ128F9348C2E.h5
        │   │   ├── TRAAAEF128F4273421.h5
        │   │   ├── TRAAAFD128F92F423A.h5
        │   │   ├── TRAAAMO128F1481E7F.h5
        │   │   ├── TRAAAMQ128F1460CD3.h5
        │   │   ├── TRAAAPK128E0786D96.h5
        │   │   ├── TRAAARJ128F9320760.h5
        │   │   ├── TRAAAVG12903CFA543.h5
        │   │   └── TRAAAVO128F93133D4.h5
        │   ├── B
        │   │   ├── TRAABCL128F4286650.h5
        │   │   ├── TRAABDL12903CAABBA.h5
        │   │   ├── TRAABJL12903CDCF1A.h5
        │   │   ├── TRAABJV128F1460C49.h5
        │   │   ├── TRAABLR128F423B7E3.h5

HDF5は,C++, R, Pythonなど様々なアプリケーションで使用できます.ここでは,Million Song Datasetの説明に従って,Pythonを使用してみます.

PythonでHDF5を扱う

PythonでHDF5形式のデータを扱うためのパッケージはPyTablesh5pyの2つです.データ解析パッケージのpandasはPyTablesへのインタフェースを提供しています.

import pandas as pd

def readHDF5(fn):
  store = HDFStore(fn)
  print(store)


参考文献

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

Python for Data Analysis: Data Wrangling with Pandas, NumPy, and IPython

米国フライトデータの元データの取得

Data Expo 2009でコンテストの題材とされた米国のフライトデータは,R界隈でも大規模データセットの例として頻繁に使用されます.

上記のData Expo 2009のページで配布されているデータは,コンテストのために必要なデータ項目だけが抽出されています.元データは,米国運輸省の調査・革新技術庁(RITA : Research and Innovative Technology Administration)の下部組織である米国運輸統計局(BTS : Bureau of Transportation Statistics)のページから取得が可能です.なお,BTSは,フライトデータだけでなく,高速道路や鉄道など運輸全般のデータを公開しています.

BTSは,フライトデータの元データを月ごとにzipファイルで提供しており,以下のスクリプトにより取得できます(参考ページ).

getdata.sh

:

# BTSのデータ公開のURL
BASE_URL="http://transtats.bts.gov/Download/On_Time_On_Time_Performance"

# 1987年は9月以前はヘッダのみのデータのzipファイルが提供されているので,10月以降を取得
YEAR=1987
for MONTH in {10..12}
do
  echo $MONTH
  wget ${BASE_URL}_${YEAR}_${MONTH}.zip
done

# 1988年以降は各月に対してzipファイルが提供されている
for YEAR in {1988..2013}
do
  echo $YEAR
  for MONTH in {1..12}
  do
    wget ${BASE_URL}_${YEAR}_${MONTH}.zip
  done
done

こうして取得したデータは,以下のスクリプトにより一つのファイルに集約できます.

makedata.sh

:

BASE_IFN="On_Time_On_Time_Performance"
OFN="airline.csv"

# 出力ファイルが既に存在する場合は削除する
if [ -e $OFN ]; then
  rm $OFN
fi

# 1987年10月はヘッダごと出力ファイルにコピー,以降はヘッダを除いてコピーする
YEAR=1987 
echo $YEAR
for MONTH in {10..12}
do
  ifn=${BASE_IFN}_${YEAR}_${MONTH}
  unzip -o $ifn.zip
  if [ ! -e $OFN ]; then
    cp $ifn.csv $OFN
  else
    tail -n +2 $ifn.csv >> $OFN
  fi
done
  
# 1988年以降は各月に対して,ヘッダを除いてコピーする
for YEAR in {1988..2013}
do
  echo $YEAR
  for MONTH in {1..12}
  do
    ifn=${BASE_IFN}_${YEAR}_${MONTH}
    if [ -e $ifn.zip ]; then
      unzip -o $ifn.zip
      tail -n +2 $ifn.csv >> $OFN
    fi
  done
done

このようして作成したファイルは,約1億5,000レコード,64GBというサイズになっています.

$ wc -l airline.csv
152636070 airline.csv
$ ls -lh airline.csv
-rw-r--r-- 1 sfchaos sfchaos 64G Dec 31 19:40 airline.csv

Data Expo 2009で提供されたデータは29項目しかありませんでしたが,元データは112項目となっています.

$ head airline.csv
"Year","Quarter","Month","DayofMonth","DayOfWeek","FlightDate","UniqueCarrier","AirlineID","Carrier","TailNum","FlightNum","OriginAirportID","OriginAirportSeqID","OriginCityMarketID","Origin","OriginCityName","OriginState","OriginStateFips","OriginStateName","OriginWac","DestAirportID","DestAirportSeqID","DestCityMarketID","Dest","DestCityName","DestState","DestStateFips","DestStateName","DestWac","CRSDepTime","DepTime","DepDelay","DepDelayMinutes","DepDel15","DepartureDelayGroups","DepTimeBlk","TaxiOut","WheelsOff","WheelsOn","TaxiIn","CRSArrTime","ArrTime","ArrDelay","ArrDelayMinutes","ArrDel15","ArrivalDelayGroups","ArrTimeBlk","Cancelled","CancellationCode","Diverted","CRSElapsedTime","ActualElapsedTime","AirTime","Flights","Distance","DistanceGroup","CarrierDelay","WeatherDelay","NASDelay","SecurityDelay","LateAircraftDelay","FirstDepTime","TotalAddGTime","LongestAddGTime","DivAirportLandings","DivReachedDest","DivActualElapsedTime","DivArrDelay","DivDistance","Div1Airport","Div1AirportID","Div1AirportSeqID","Div1WheelsOn","Div1TotalGTime","Div1LongestGTime","Div1WheelsOff","Div1TailNum","Div2Airport","Div2AirportID","Div2AirportSeqID","Div2WheelsOn","Div2TotalGTime","Div2LongestGTime","Div2WheelsOff","Div2TailNum","Div3Airport","Div3AirportID","Div3AirportSeqID","Div3WheelsOn","Div3TotalGTime","Div3LongestGTime","Div3WheelsOff","Div3TailNum","Div4Airport","Div4AirportID","Div4AirportSeqID","Div4WheelsOn","Div4TotalGTime","Div4LongestGTime","Div4WheelsOff","Div4TailNum","Div5Airport","Div5AirportID","Div5AirportSeqID","Div5WheelsOn","Div5TotalGTime","Div5LongestGTime","Div5WheelsOff","Div5TailNum",
1987,4,10,19,1,1987-10-19,"CO",19704,"CO","","597",10821,1082102,30852,"BWI","Baltimore, MD","MD","24","Maryland",35,12266,1226601,31453,"IAH","Houston, TX","TX","48","Texas",74,"1650","1649",-1.00,0.00,0.00,-1,"1600-1659",,"","",,"1850","1858",8.00,8.00,0.00,0,"1800-1859",0.00,"",0.00,180.00,189.00,,1.00,1235.00,5,,,,,,"",,,,,,,,"",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","",
1987,4,10,20,2,1987-10-20,"CO",19704,"CO","","597",10821,1082102,30852,"BWI","Baltimore, MD","MD","24","Maryland",35,12266,1226601,31453,"IAH","Houston, TX","TX","48","Texas",74,"1650","1651",1.00,1.00,0.00,0,"1600-1659",,"","",,"1850","1905",15.00,15.00,1.00,1,"1800-1859",0.00,"",0.00,180.00,194.00,,1.00,1235.00,5,,,,,,"",,,,,,,,"",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","",
1987,4,10,21,3,1987-10-21,"CO",19704,"CO","","597",10821,1082102,30852,"BWI","Baltimore, MD","MD","24","Maryland",35,12266,1226601,31453,"IAH","Houston, TX","TX","48","Texas",74,"1650","1653",3.00,3.00,0.00,0,"1600-1659",,"","",,"1850","1916",26.00,26.00,1.00,1,"1800-1859",0.00,"",0.00,180.00,203.00,,1.00,1235.00,5,,,,,,"",,,,,,,,"",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","",
1987,4,10,22,4,1987-10-22,"CO",19704,"CO","","597",10821,1082102,30852,"BWI","Baltimore, MD","MD","24","Maryland",35,12266,1226601,31453,"IAH","Houston, TX","TX","48","Texas",74,"1650","1649",-1.00,0.00,0.00,-1,"1600-1659",,"","",,"1850","1854",4.00,4.00,0.00,0,"1800-1859",0.00,"",0.00,180.00,185.00,,1.00,1235.00,5,,,,,,"",,,,,,,,"",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","",
1987,4,10,23,5,1987-10-23,"CO",19704,"CO","","597",10821,1082102,30852,"BWI","Baltimore, MD","MD","24","Maryland",35,12266,1226601,31453,"IAH","Houston, TX","TX","48","Texas",74,"1650","1647",-3.00,0.00,0.00,-1,"1600-1659",,"","",,"1850","1916",26.00,26.00,1.00,1,"1800-1859",0.00,"",0.00,180.00,209.00,,1.00,1235.00,5,,,,,,"",,,,,,,,"",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","",
1987,4,10,24,6,1987-10-24,"CO",19704,"CO","","597",10821,1082102,30852,"BWI","Baltimore, MD","MD","24","Maryland",35,12266,1226601,31453,"IAH","Houston, TX","TX","48","Texas",74,"1650","1650",0.00,0.00,0.00,0,"1600-1659",,"","",,"1850","1857",7.00,7.00,0.00,0,"1800-1859",0.00,"",0.00,180.00,187.00,,1.00,1235.00,5,,,,,,"",,,,,,,,"",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","",
1987,4,10,25,7,1987-10-25,"CO",19704,"CO","","597",10821,1082102,30852,"BWI","Baltimore, MD","MD","24","Maryland",35,12266,1226601,31453,"IAH","Houston, TX","TX","48","Texas",74,"1650","1653",3.00,3.00,0.00,0,"1600-1659",,"","",,"1850","1906",16.00,16.00,1.00,1,"1800-1859",0.00,"",0.00,180.00,193.00,,1.00,1235.00,5,,,,,,"",,,,,,,,"",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","",
1987,4,10,26,1,1987-10-26,"CO",19704,"CO","","597",10821,1082102,30852,"BWI","Baltimore, MD","MD","24","Maryland",35,12266,1226601,31453,"IAH","Houston, TX","TX","48","Texas",74,"1650","1651",1.00,1.00,0.00,0,"1600-1659",,"","",,"1850","1857",7.00,7.00,0.00,0,"1800-1859",0.00,"",0.00,180.00,186.00,,1.00,1235.00,5,,,,,,"",,,,,,,,"",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","",
1987,4,10,27,2,1987-10-27,"CO",19704,"CO","","597",10821,1082102,30852,"BWI","Baltimore, MD","MD","24","Maryland",35,12266,1226601,31453,"IAH","Houston, TX","TX","48","Texas",74,"1650","1648",-2.00,0.00,0.00,-1,"1600-1659",,"","",,"1850","1858",8.00,8.00,0.00,0,"1800-1859",0.00,"",0.00,180.00,190.00,,1.00,1235.00,5,,,,,,"",,,,,,,,"",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","","",,,"",,,"","",

それでは来年も良いお年を!

NOAA気象データセットの加工

NOAA気象データセットは,米国の国立気候データセンター(National Climatic Data Center; NCDC)が公開しているデータセットです.1900年から最新までのデータが公開されています.

このデータセットに対して,以下のようなスクリプトを用いてCSV形式に変換します.

# -*- coding: utf-8 -*-
import csv;

# 入力ファイル
ifn = open("010010-99999-1934")
reader = csv.reader(ifn)

# 出力ファイル
ofn = open("010010-99999-1934.csv", "w")
writer = csv.writer(ofn)

# 各レコードに対して項目を抽出しファイルに出力する
writer.writerow(["usaf_id","wban_id","year","month","day","hour","minute","latitude","longitude","height","calllet","qcpname","winddir","winddir_qcode","winddir_tcode","windspeed","windspeed_qcode","lcloud","lcloud_dcode","lcloud_ccode","visdist","visdist_qcode","visdist_vcode","visdist_qvcode","temp","temp_qcode","dptemp","dptemp_qcode","pressure","pressure_qcode"])
for row in reader:
        for elem in row:
                usaf_id = elem[4:10] # USAF気象情報ステーション識別子
                wban_id = elem[11:16]        # WBAN気象情報ステーション識別子
                year = elem[15:19] # 観測年
                month = elem[19:21]        # 観測月
                day = elem[21:23]        # 観測日
                hour = elem[23:25] # 観測時間
                minute = elem[25:27] # 観測分
                latitude = long(elem[28:34])/1000 # 緯度
                longitude = long(elem[35:41])/1000        # 経度
                height = elem[46:51] # 標高
                calllet = elem[51:56] # 呼出符号識別子
                qcpname = elem[56:60] # 品質プロセス名
                winddir = elem[60:63] # 風向き
                winddir_qcode = elem[63:64] # 風向きの品質コード
                winddir_tcode = elem[64:65] # 風向きのタイプコード
                windspeed = elem[65:70] # 風速
                windspeed_qcode = elem[70:71] # 風速の品質コード
                lcloud = elem[71:76] # 雲低高度
                lcloud_qcode = elem[76:77] # 雲低高度の品質コード
                lcloud_dcode = elem[77:78] # 雲低高度の決定コード
                lcloud_ccode = elem[78:79] # 雲低高度のCAVOKコード
                visdist = elem[79:84] # 視界
                visdist_qcode = elem[84:85] # 視界の品質コード
                visdist_vcode = elem[85:86] # 視界の変数コード
                visdist_qvcode = elem[86:87] # 視界の品質変数コード
                temp = long(elem[87:92])/10 # 気温
                temp_qcode = elem[92:93] # 気温の品質コード
                dptemp = long(elem[93:98])/10 # 露点気温
                dptemp_qcode = elem[98:99] # 露点気温の品質コード
                pressure = long(elem[99:104])/10 # 気圧
                pressure_qcode = elem[104:105] # 気圧の品質コード
                writer.writerow([usaf_id,wban_id,year,month,day,hour,minute,latitude,longitude,
                                         height,calllet,qcpname,winddir,winddir_qcode,winddir_tcode,windspeed,windspeed_
                                         qcode,lcloud,lcloud_dcode,lcloud_ccode,visdist,visdist_qcode,visdist_vcode,visdist_qvcode,
                                         temp,temp_qcode,dptemp,dptemp_qcode,pressure,pressure_qcode])

ifn.close()
ofn.close()

ウェブページのファイルの一括ダウンロード

サンプルデータの取得などで,ウェブページにリストアップされているファイルを一括ダウンロードしたいことがある.こんなときは,wgetコマンドを用いて,以下の2つの操作

  • 再帰的にファイルを取得する回数を1回に指定
  • ファイルの拡張子の指定

を行えばよい.

例えば,国立気候データセンター(National Climatic Data Center; NCDC)が公開している気象データを取得するには,以下のコマンドを実行する.

$ # 2013年のデータの取得(拡張子が"gz"のファイルが対象)
$ wget -r -l 1 -A gz -w 5 -nd ftp://ftp.ncdc.noaa.gov/pub/data/noaa/2013/

便利!!

参考文献

最新のTexLiveをインストールする方法

リンクのページを参照して,最新のTexLiveをインストールする.

texlive-backports PPAの追加

$ sudo add-apt-repository ppa:texlive-backports/ppa

aptレポジトリのアップデート

$ sudo apt-get update

texliveのインストール

$ sudo apt-get install texlive

mlpyライブラリのインストール

mlpyライブラリをインストールするには,GSL(GNU Scientific Library)の開発環境が必要.

$ sudo apt-get install libgsl0-dev

続いて,このサイトからmlpyのソースコードをダウンロードして以下を実行.

$ sudo easy_install mlpy-3.5.0.tar.gz