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を用いた最適化・高速化などに対応しています.
以下のような機能を提供しています.
- 常微分方程式の数値計算法
- 線形方程式・非線形方程式の求解
- 行列・ベクトル演算
- 固有値・固有ベクトルの計算法
- 数値積分
- 補間・フィッティング
- 最適化
- FFT, 畳み込み, 相互相関
- 統計: 一般的なアルゴリズム
分布(F分布, χ2乗分布,2項分布,Poisson分布,Studentのt分布,正規分布,誤差関数),記述統計量(平均値,中央値,分散,標準偏差,歪度,尖度,分位点) - 仮説検定
Studentのt検定,F検定,χ2乗検定,符号検定,Wilcoxonの符号順位検定,Mann–WhitneyのU検定,Jarque–Bera検定,相関係数の有意性検定 - データ解析: 分類,回帰,その他のアルゴリズム
線形回帰,多変量ロジスティック回帰分析,ニューラルネットワーク,ニューラルネットワークアンサンブル,ランダムフォレスト,線形判別分析,主成分分析,クラスタリング - 特別な関数
- その他のアルゴリズム
ダウンロードと解凍
以下のコマンドによりファイルをダウンロードし,解凍します.
$ 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では,以下のようなデータ構造が提供されています.
使用例1) 相関係数の算出
まずはサンプルを参考に,との間の相関係数を算出してみましょう.
#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)が実装されています.
インタフェースを調査中.分かり次第,書きます!
Million Song Dataset
あけましておめでとうございます.今年もよろしくお願いいたします.
Rでbigmemoryやffなどを使用して大規模なデータを扱うときのサンプルデータとして,Data Expo 2009のフライトデータが用いられることが多いようです.しかし,このデータのサイズは約12GBであり,最近のコンピュータではメモリに載ってしまうという指摘もよく受けるようになって来ました.
そこで,より大規模なデータセットを探してみました.次のようなデータセットが手軽に利用できます.
- Million Song Dataset
楽曲の音声やそのメタデータに関するデータセットです.全体で約280GBあります. - Page view statistics for Wikimedia projects
Wikipediaの各ページのページビューを時間単位で集計したデータです.全体で約2.3TBあります. - NCDC Hourly Global Weather Measurements
米国の時間単位での気象観測データです.全体で約59GBあります. - 1998 World Cup access logs
1998年のワールドカップ時のアクセスログです.全体で約123GBあります.
この中から,"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形式のデータを扱うためのパッケージはPyTablesとh5pyの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
- 作者: Wes McKinney
- 出版社/メーカー: O'Reilly Media
- 発売日: 2012/11/01
- メディア: ペーパーバック
- この商品を含むブログ (6件) を見る
米国フライトデータの元データの取得
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