2017-09-17

Fedora 27 のリリーススケジュール

Fedora [fɪˈdɒr.ə] は、レッドハット社が支援するコミュニティー Fedora Project によって開発されている RPM 系Linuxディストリビューションです。Fedora のリリースサイクルは概ね春と秋の年二回ですが、いつもリリースの遅れが目立っていました。次回リリースされる Fedora 27 ではアルファリリースを廃止し、ベータリリースを経て正式リリース (GA) になります。なお、Fedora の開発版は従来通り Rawhide です。

Fedora 27 のリリーススケジュールを参考サイト [1] から抜き出しました。

Fedora 27 Key Milestones

2017-02-28 Branch Fedora 26 from Rawhide (Rawhide becomes future F27)
2017-06-20 Change Checkpoint: Proposal submission deadline (Changes requiring mass rebuild)
2017-07-04 Change Checkpoint: Proposal submission deadline (System Wide Changes)
2017-07-11 Fedora 26 Release
2017-07-12 Mass Rebuild
2017-07-25 Change Checkpoint: Proposal submission deadline (Self Contained Changes)
2017-08-01 Change Checkpoint: Completion deadline (testable)
Software String Freeze
2017-08-15 Branch Fedora 27 from Rawhide (Rawhide becomes future F28)
2017-08-29 Software Translation Deadline
Bodhi activation point
2017-09-05 Beta Freeze (*)
Change Checkpoint: 100% Code Complete Deadline
2017-09-19 Beta Release (Target date) (actual)
2017-09-26 Beta Release (Rain date) (actual)
2017-10-10 Final Freeze (*)
2017-10-24 Fedora 27 Final Release (GA) (Target date) (actual)
2017-10-31 Fedora 27 Final Release (GA) (Rain date)

 

参考サイト

  1. Releases/27/Schedule - FedoraProject

 

ブログランキング・にほんブログ村へ
にほんブログ村

2017-09-03

Fedora で Cinnamon デスクトップ環境

Cinnamon(シナモン)は、GTK+ 3 ツールキットをベースとしたデスクトップ環境で、元々 Linux Mint(リナックス・ミント)のために開発されました。2011 年に初版がリリースされていますので、比較的新しいデスクトップ環境です。今回は、プライベートで愛用している Fedora で、デスクトップ環境を GNOME から Cinnamon 変更しましたので、変更の仕方や使用感などを報告したいと思います。

Cinnamon デスクトップ

動作環境は次の通りです。

  • OS: Fedora 26 (x86_64)

いままでのデスクトップ GNOME

ここ数年は、Fedora でデフォルトの GNOME のデスクトップ環境を使ってきました。しかし、安物の PC (HP Stream 11) に Linux (Fedora) をインストールして使っているので、あまり高精細でないディスプレイの解像度 1366×768 では GNOME はちょっと使いにくいと感じていました。

GNOME デスクトップ (1366×768)

そもそも GNOME のデスクトップに期待していたことは、タブレットの環境でタッチパネルの操作に適した UI の操作感を Linux で試してみたいと思ったことだったのですが、現実は、そこそこ使える格安の PC に Linux をインストールすることに満足してしまい、いまだに自分はタッチパネルの世界で Linux を使っていません。

Cinnamon デスクトップ

Cinnamon はもともと Linux Mint のために開発されたのですが、この Linux ディストリビューションでは、洗練され、最新で快適な Linux デスクトップを提供することを目標としている Ubuntu をベースとしたディストリビューションです。たしかに Linux Mint のデスクトップは洗練されたものに見えるので、デスクトップだけでも使ってみたいと思っていたのですが、幸い今では他のディストリビューションでも Cinnamon を利用できるようになっており、Fedora でも利用できるようになっていますので、切り替えてみました。

切り替え方法は後述するとして、Cinnamon にデスクトップ環境を変更した結果を下記に紹介します。

Cinnamon デスクトップ (1366×768)

使用したテーマは以下のようにしました(メニュー → 設定(システム設定) → テーマ)。

デスクトップのテーマ設定

システム情報は次のようになっています(メニュー → 設定(システム設定) → システム情報)。

システム情報

Cinnamon デスクトップ環境での操作は、仕事で使っている Microsoft Windows 7 の操作と似ており、細かいところはさておき、なんなく使えるようになりました。日本語メッセージにもよく対応していると思います。

GNOME → Cinnamon への変更手順

話が前後しましたが、GNOME から Cinnamon にデスクトップ環境を変更する方法をまとめました。

まず、GNOME 端末などの端末エミュレータを起動してルート権限で操作します。ここでは su でルートにログインして操作しています。

$ su
パスワード:
#

利用可能なグループパッケージを表示します。

# dnf grouplist
メタデータの期限切れの確認は、1:49:31 時間前の 2017年09月03日 06時54分52秒 に実施しました。
Available Environment Groups:
   Fedora Custom Operating System
   最小限のインストール
   Fedora Server Edition
   Fedora Workstation
   Fedora Cloud Server
   KDE Plasma デスクトップワークスペース
   Xfce デスクトップ
   LXDE デスクトップ
   Hawaii Desktop
   LXQt Desktop
   Cinnamon デスクトップ
   MATE デスクトップ
   Sugar デスクトップ環境
   開発環境とクリエイティブワークステーション
   Web サーバー
   インフラサーバー
   基本的なデスクトップ環境
インストール済みグループ:
   C 開発ツールとライブラリー
   開発ツール
   ...
   (以下省略)
   ...

Available Environment Groups にある Cinnamon デスクトップ をインストールします。

# dnf groupinstall "Cinnamon デスクトップ"
   ...
   ...
   ...
トランザクションの要約
================================================================================
インストール  137 パッケージ

総ダウンロードサイズ: 193 M
パッケージ展開後のサイズ: 518 M
これでいいですか? [y/N]: y
パッケージをダウンロードしています;
   ...
   (以下省略)
   ...
完了しました!
#

ログアウトしてログインし直すだけで十分のはずですが、念の為、再起動します。

# reboot

ログイン画面でログインするアカウントを選択し、下記のようにギア状のアイコンをクリックしてデスクトップ環境を変更します。なお、以降のスクリーンショットは実機では取れないので、Oracle VirtualBox 上にインストールした Fedora 26 のスクリーンショットを使っています。

デスクトップ環境の変更

選択肢を見ると、既に Cinnamon にチェックが入っていますが、不具合なのでしょうか、この状態でログインしても実際には GNOME デスクトップ環境のままです。ですので、面倒なようですが、一旦 GNOME を明確に選択(チェック)して(GNOME デスクトップ環境へ)ログインします。

デスクトップ環境を切り替える専用のツールに switchdesk というのがありますが、うまく動かなかったので、このようなやり方をしています。

GNOME で一旦ログイン

ログアウトしてから、あらためて Cinnamon を選択(チェック)してログインし直すと、Cinnamon のデスクトップ環境に切り替わります。デスクトップの切り替えに問題があるのは、このように後で他のデスクトップ環境を追加した直後だけで、以降は切り替えに問題はありません。

ログアウト後、Cinnamon をあらためて選択(チェック)してログイン

なお、Fedora のインストール時から Cinnamon をデスクトップに使いたい場合は Fedora Spins で Cinnamon 用のインストールイメージ [1] が用意されています。

 

参考サイト

  1. Fedora Cinnamon デスクトップ

 

ブログランキング・にほんブログ村へ
にほんブログ村

2017-08-06

【備忘録】JavaFX GUI メッセージの国際化 --- NetBeans IDE

JavaFX で GUI アプリケーションを作るとき、表示する文字列は英語でなければならない案件ばかりだったため、GUI アプリケーションの国際化について考えてきませんでした。しかし最近になって、ついにというか、ようやくというか、少なくとも英語環境と日本語環境の両方に対応する必要がある案件が出てきましたので、やり方を調べました [1]

使用している環境は以下の通りです。

  • OS: Fedora 26 (x86_64)
  • Java: jdk1.8.0_141-1.8.0_141-fcs.x86_64 (Oracle)
  • IDE: NetBeans IDE 8.2

この環境のロケール [2] は下記のようになっています。

$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
$

国際化の目標

ここでの目標は、ソースを再コンパイルすることなく、実行環境のロケールに応じたメッセージを表示することです。今回は英語をデフォルトとして日本語環境で日本語メッセージを表示することを目標とします。

Hello World!

サンプルとして、NetBeans IDE で空の JavaFX アプリケーションのプロジェクトを作成したときに生成される Hello World! のソースを国際化対応することにします。

メイン・メニューから「ファイル(F)」→「新規プロジェクト(W)...」を選んで、新規プロジェクトを作成するダイアログを開きます。

 

新規プロジェクトのダイアログの「プロジェクト(P)」の欄で JavaFXアプリケーション を選択し、下の「 次 > 」ボタンをクリックして次へ進みます。

 

プロジェクト名(N)」は HelloWorld としました。「終了(F)」ボタンをクリックしてダイアログを終了します。

 

実行すると(いつものように)以下のように表示されます。

 

Java のソースは以下のようになっています。コメント行は取り除きました。

リスト:HelloWorld.java 
package helloworld;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class HelloWorld extends Application {
    
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction((ActionEvent event) -> {
            System.out.println("Hello World!");
        });
        
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        
        Scene scene = new Scene(root, 300, 250);
        
        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }  
}

プロパティ・ファイルの追加

国際化に対応させる文字列は、プロパティ・ファイルに保存します。プロパティ・ファイルはキーと値がペアになった形式になっており、キーはプログラムがテキストを読み出すために使用する識別子、値は実際のテキストになります。各ロケールに対して、プロパティ・ファイルを作成しますが、キーは各ロケール共通で、文字列のみが異なります。まずはデフォルトのプロパティ・ファイルを作成します。

HelloWorld パッケージを選択、右クリックでプルダウンメニューを表示させ、「新規」→「その他...」を選択します。

 

「新規ファイル」のダイアログが表示されますので、「カテゴリ(C)」のリストから「その他」を選び、「ファイル・タイプ(F)」のリストで「プロパティ・ファイル」を選びます。下の「 次 > 」ボタンをクリックして次へ進みます。

 

「New プロパティ・ファイル」ダイアログで作成するプロパティ・ファイル名を設定します。ここではプロジェクト名と同じ HelloWorld とします。

 

ブランクの HelloWorld.propertier が生成されます。

 

国際化ウィザードの利用

国際化ウィザードは対象となるソースから文字列を抽出し、プロパティ・ファイルにキーとペアを書き出して、Java プログラムがプロパティ・ファイルと連携するよう、ソースの文字列の箇所に java.util.ResourceBundle.getBundle() を埋め込んでくれます。

国際化ウィザードを利用するには、メイン・メニューから、「ツール(T)」>「国際化(Z)」>「国際化ウィザード(I)」を選択します。

 

国際化ウィザートのダイアログの最初のステップ「1. 国際化するソースを選択する」では、国際化の対象となるソースを選択します。この例では HelloWorld.java のみです。下の「 次 > 」ボタンをクリックして次へ進みます。

 

次のステップ「2. ソースのリソースを選択」では、ソースとリソースであるプロパティファイルを対応させるのですが、この例では同じ名前の HelloWorld.propeties しかありませんので、そのまま下の「 次 > 」ボタンをクリックして次へ進みます。

 

「3. フィールドの生成」ステップでは、この場合、何も変更せず、下の「 次 > 」ボタンをクリックして次へ進みます。

 

最後の「4. 見つかった文字列の変更」ステップではウィザードは抽出した文字列からキーが先生されて表示されます。この例ではこのまま「終了(F)」ボタンをクリックしてウィザードを終了させます。

 

ウィザード終了後、HelloWorld.java の文字列の箇所は下記のように java.util.ResourceBundle.getBundle() で置換されています。

リスト:HelloWorld.java(国際化ウィザード終了後) 
package helloworld;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class HelloWorld extends Application {
    
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText(java.util.ResourceBundle.getBundle("helloworld/HelloWorld").getString("SAY 'HELLO WORLD'"));
        btn.setOnAction((ActionEvent event) -> {
            System.out.println(java.util.ResourceBundle.getBundle("helloworld/HelloWorld").getString("HELLO WORLD!"));
        });
        
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        
        Scene scene = new Scene(root, 300, 250);
        
        primaryStage.setTitle(java.util.ResourceBundle.getBundle("helloworld/HelloWorld").getString("HELLO WORLD!"));
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }   
}

空だった HelloWorld.properties には以下のようにキーと値のペアが書き込まれています。

リスト:HelloWorld.properties 
SAY\ 'HELLO\ WORLD'=Say 'Hello World'
HELLO\ WORLD!=Hello World!

日本語ロケールの追加

国際化に対応した HelloWorld.java と、デフォルトの HelloWorld.properties ファイルの準備ができたので、今度は日本語のメッセージを用意します。

デフォルトの HelloWorld.properties ファイルを選択して右クリックしてプルダウンメニューを表示させ、「追加(A)」→「ロケール...」を選択します。

 

「新規ロケール」のダイアログが表示されますので、「事前定義ロケール(P)」のリストから ja_JP を選択して「 OK 」ボタンをクリックしてダイアログを閉じます。

※「事前定義…」ってなんだ?と思いましたが、英語版のメッセージは Predefined ですので、要するに「定義済み…」という意味なのでしょう。

 

HelloWorld_ja_JP.properties が生成されます。生成後は HelloWorld.properties と同じ内容になっていますので、次のように編集しました。

リスト:編集後の HelloWorld_ja_JP.properties 
SAY\ 'HELLO\ WORLD'=「こんにちは、世界!」と出力
HELLO\ WORLD!=こんにちは、世界!

あらためてプロジェクトをビルド・実行すると。以下の通り、ばっちりメッセージが日本語に変わりました(下左図)。

念の為 HelloWorld.jar を Windows 10(日本語版, 32bit)へコピー・実行して確認してみたところ、同様に日本語メッセージが表示されました(下右図)。

 

参考サイト

  1. GUIフォームの国際化 - NetBeans IDEチュートリアル
  2. ロケールとは - 国際化対応言語環境の利用ガイド

 

国際化に関しては、こんなに古い本しか出回っていません。😢

ブログランキング・にほんブログ村へ
にほんブログ村

2017-07-28

Oracle、32件の脆弱性を修正した「Java SE 8 Update 141」を公開 - 窓の杜

Java SE 8 Update 141 を Oracle 社が公開したのは 7 月 18 日のことですので、すいぶん時間が経ってしまいましたが、OpenJDK 8 の Update 141 (java-1.8.0-openjdk-1.8.0.141-1.b16.fc26.x86_64) が Fedora でもそれから数日遅れで利用可能になりました。

今回は Fedora 26 上で、OpenJDK と OenJFX の組み合わせでバージョン表示をしてみました。

参考サイト

  1. Oracle、32件の脆弱性を修正した「Java SE 8 Update 141」を公開 - 窓の杜
  2. OpenJDK
  3. bitwalk123/JavaVersion

 

ブログランキング・にほんブログ村へ
にほんブログ村

2017-06-18

【備忘録】Rのplsパッケージの使い方

PLS 回帰, Partial Least Squares Regression(部分的最小二乗回帰)とは、目的変数 Yを予測するために係数を最適化する手法のひとつです。

業務でこの手法を応用したツールを使っているのですが、導き出した結果を検証する環境を探していたところ、R の pls パッケージであれば十分な検証ができそうだということが判りました。そこで、この pls パッケージの使い方を備忘録的にまとめました。

動作環境は次の通りです。

  • OS: Fedora 26 x86_64 (beta)
  • R-core-3.4.0-2.fc26.x86_64
  • rstudio-1.0.143-1.x86_64

ここでは参考サイト [1] に従って、自分で動作を確認して備忘録にすることが目的なので、統計的解釈に深くは立ち入っていないことをご了承下さい。また、あとで得た知見で書き直したり書き足したりすることもあります。

pls パッケージのインストール

R を起動して、以下のコマンドで pls パッケージをインストールします。

> install.packages("pls")
 パッケージを ‘/home/bitwalk/R/x86_64-redhat-linux-gnu-library/3.4’ 中にインストールします 
 (‘lib’ が指定されていないため) 
 --- このセッションで使うために、CRAN のミラーサイトを選んでください --- 
 URL 'https://cran.ism.ac.jp/src/contrib/pls_2.6-0.tar.gz' を試しています 
Content type 'application/x-gzip' length 809111 bytes (790 KB)
==================================================
downloaded 790 KB

* installing *source* package ‘pls’ ...
**  パッケージ ‘pls’ の解凍および MD5 サムの検証に成功しました 
** R
** data
*** moving datasets to lazyload DB
** inst
** preparing package for lazy loading
** help
*** installing help indices
  converting help for package ‘pls’
    finding HTML links ...  完了 
    biplot.mvr                              html  
...
...
** building package indices
** installing vignettes
** testing if installed package can be loaded
* DONE (pls)

 ダウンロードされたパッケージは、以下にあります 
  ‘/tmp/RtmpBE2Z3b/downloaded_packages’ 
> 

最初に、pls パッケージを library でロードしておきます。

> library(pls)
 次のパッケージを付け加えます: ‘pls’ 

 以下のオブジェクトは ‘package:stats’ からマスクされています: 

     loadings 

> 

使用するサンプル

以下のサンプルデータを用いますので、data でロードします。

> data(gasoline)

データの精度を4桁に設定します。

> options(digits = 4)

サンプルデータ gasoline の解析

> ?gasoline
gasoline                  package:pls                  R Documentation

Octane numbers and NIR spectra of gasoline

Description:

     A data set with NIR spectra and octane numbers of 60 gasoline
     samples.  The NIR spectra were measured using diffuse reflectance
     as log(1/R) from 900 nm to 1700 nm in 2 nm intervals, giving 401
     wavelengths.  Many thanks to John H. Kalivas.

Usage:

     gasoline
     
Format:

     A data frame with 60 observations on the following 2 variables.

     ‘octane’ a numeric vector.  The octane number.

     ‘NIR’ a matrix with 401 columns.  The NIR spectrum.

Source:

     Kalivas, John H. (1997) Two Data Sets of Near Infrared Spectra
     _Chemometrics and Intelligent Laboratory Systems_, *37*, 255-259.

サンプルの gasoline データ(オクタン価とガソリンの拡散反射の近赤外線分光データ、NIR スペクトル)を解析します。データは以下のような構造になっています。

> names(gasoline)
[1] "octane" "NIR"   
> gasoline$octane
 [1] 85.30 85.25 88.45 83.40 87.90 85.50 88.90 88.30 88.70 88.45 88.75 88.25
[13] 87.30 88.00 88.70 85.50 88.65 88.75 85.40 88.60 87.00 87.15 87.05 87.25
[25] 86.85 88.65 86.60 86.00 86.10 86.50 86.30 84.40 84.70 84.60 84.50 88.10
[37] 85.25 88.40 88.20 88.40 88.55 88.35 88.20 85.30 88.50 88.25 88.00 88.85
[49] 88.45 88.70 88.10 87.60 88.35 85.10 85.10 84.70 87.20 86.60 89.60 87.10
> gasoline$NIR
      900 nm    902 nm    904 nm    906 nm    908 nm    910 nm    912 nm
1  -0.050193 -0.045903 -0.042187 -0.037177 -0.033348 -0.031207 -0.030036
2  -0.044227 -0.039602 -0.035673 -0.030911 -0.026675 -0.023871 -0.022571
...
...
 [ reached getOption("max.print") -- 58 行を無視しました ] 

gasoline$octane の要素は、波長ごとに NIR スペクトルのリスト(ベクトル)になっています。もう少し詳しく調べてみます。

> dim(gasoline$NIR)
[1]  60 401
> dimnames(gasoline$NIR)
[[1]]
 [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14" "15" "16"
[17] "17" "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" "31" "32"
[33] "33" "34" "35" "36" "37" "38" "39" "40" "41" "42" "43" "44" "45" "46" "47" "48"
[49] "49" "50" "51" "52" "53" "54" "55" "56" "57" "58" "59" "60"

[[2]]
  [1] "900 nm"  "902 nm"  "904 nm"  "906 nm"  "908 nm"  "910 nm"  "912 nm"  "914 nm" 
  [9] "916 nm"  "918 nm"  "920 nm"  "922 nm"  "924 nm"  "926 nm"  "928 nm"  "930 nm" 
...
...
[393] "1684 nm" "1686 nm" "1688 nm" "1690 nm" "1692 nm" "1694 nm" "1696 nm" "1698 nm"
[401] "1700 nm"

イメージしやすいように、gasoline$octane のデータについて、波長を横軸にとってプロットしてみました。もっとスマートなプロットの仕方があると思いますが、とりあえず、これでお許しください。

> y.values <- gasoline$NIR
> x.label <- colnames(y.values)
> x.value <- as.numeric(substring(x.label, 1, nchar(x.label) - 3))
> plot(x.value, y.values[1,], type = "n", main = "NIR spectra of gasoline samples", xlab = "wavelength", ylab = "log(1/R)")
> for (i in 1:nrow(y.values)) lines(x.value, y.values[i, ], type = "l")

このデータ解析の目的は、

octane = f(NIR) = f(NIRwavelength1, NIRwavelength2, ...)

という関数関係を求めて、スペクトルからオクタン価を予測することなのですが、401 個の変数(NIR スペクトル)、60 組のデータでは、従来の重回帰分析を使おうとしても自由度が全然足りなくて解析できません。しかし、401 個のデータは互いに独立した関係にないので、これら NIR スペクトルの代わりに、主成分分析で主成分に分解し、目的変数と相関のある成分 compn から関数関係を求めます。

octane = g(compwavelength1, compwavelength2, ...)

まず、データをトレーニング用とテスト用の二つに分けます。

> gasTrain <- gasoline[1:50,]
> gasTest <- gasoline[51:60,]

フィッティングはトレーニング用のデータ gasTrain を用いて次のようにします。

> gas1 <- plsr(octane ~ NIR, ncomp = 10, data = gasTrain, validation = "LOO")

このフィッティングでは 10 個の成分で行われ、一個抜き交差検証, leave-one-out (LOO) cross-validated predictions が実施されています。

フィッティングと検証結果は summary で確認できます。

> summary(gas1)
Data:  X dimension: 50 401 
 Y dimension: 50 1
Fit method: kernelpls
Number of components considered: 10

VALIDATION: RMSEP
Cross-validated using 50 leave-one-out segments.
       (Intercept)  1 comps  2 comps  3 comps  4 comps  5 comps  6 comps  7 comps  8 comps  9 comps  10 comps
CV           1.545    1.357   0.2966   0.2524   0.2476   0.2398   0.2319   0.2386   0.2316   0.2449    0.2673
adjCV        1.545    1.356   0.2947   0.2521   0.2478   0.2388   0.2313   0.2377   0.2308   0.2438    0.2657

TRAINING: % variance explained
        1 comps  2 comps  3 comps  4 comps  5 comps  6 comps  7 comps  8 comps  9 comps  10 comps
X         78.17    85.58    93.41    96.06    96.94    97.89    98.38    98.85    99.02     99.19
octane    29.39    96.85    97.89    98.26    98.86    98.96    99.09    99.16    99.28     99.39>

ちなみに、gas1 は以下のような構造になっています。

> names(gas1)
 [1] "coefficients"    "scores"          "loadings"        "loading.weights"
 [5] "Yscores"         "Yloadings"       "projection"      "Xmeans"         
 [9] "Ymeans"          "fitted.values"   "residuals"       "Xvar"           
[13] "Xtotvar"         "fit.time"        "ncomp"           "method"         
[17] "validation"      "call"            "terms"           "model"

実測値と予測値の最小二乗誤差 RMSEP, Root Mean Square Error of Prediction が小さいほどフィッティングが良いと考えることができます。gas1 では成分 (comps) が 10 までの関係を調べてありますので、成分の数とフィッティング (RMSEP) との関係をプロットしてみます。

> plot(RMSEP(gas1), legendpos = "topright")

このプロットによると、octane を表現するのに二成分あればほぼ十分であるということが判ります。二成分のときの RMSEP は 0.2966 です。

成分の数が決まれば、その成分で予測した値と実測値との相関を確認することができます。

> plot(gas1, ncomp = 2, asp = 1, line = TRUE)

次に最初の3つの成分の得点 score の一覧表を作ります。

> plot(gas1, plottype = "scores", comps = 1:3)

この例では、特に目立った傾向が見られません。成分の得点一覧は次のように explvar で表示できます。

> explvar(gas1)
    Comp 1     Comp 2     Comp 3     Comp 4     Comp 5     Comp 6     Comp 7     Comp 8     Comp 9    Comp 10 
78.1707683  7.4122245  7.8241556  2.6577773  0.8768214  0.9466384  0.4921537  0.4723207  0.1688272  0.1693770 
>

成分の負荷量 loading をプロットすることは、成分を解釈するためによく使われます。

> plot(gas1, "loadings", comps = 1:2, legendpos = "topleft", labels = "numbers", xlab = "nm")

解析を始める前にデータをトレーニング用とテスト用の二つに分けましたが、テスト用のデータ gasTest を用いて、二つの成分で予測値を計算するには次のようにします。

> predict(gas1, ncomp = 2, newdata = gasTest)
, , 2 comps

     octane
51 87.94125
52 87.25242
53 88.15832
54 84.96913
55 85.15396
56 84.51415
57 87.56190
58 86.84622
59 89.18925
60 87.09116

> 

テスト用のデータ gasTest は octane の実測値が含まれていますので、各成分数ごとの予測値との RMSEP を算出することができます。

> RMSEP(gas1, newdata = gasTest)
(Intercept)      1 comps      2 comps      3 comps      4 comps      5 comps      6 comps      7 comps      8 comps      9 comps     10 comps  
     1.5369       1.1696       0.2445       0.2341       0.3287       0.2780       0.2703       0.3301       0.3571       0.4090       0.6116  
> 

まとめ

参考サイト [1] の一部を、自分で確認してきましたが、これでおおよその使い方を掴めました。あとは、自分のデータを使って、業務で使っているツールが導き出す結果を検証できるように、もう少しこのパッケージを使い込んでいきたいと考えています。

参考サイト

  1. Introduction to the pls Package

 

ブログランキング・にほんブログ村へ
にほんブログ村