Rできれいな図を描く(棒グラフ) Part 2

touch-sp.hatenablog.com

mydata <- c(1.6,1.2,1.23,1.08,1.01,1.00,1.12,1.06,1.15,1.28,1.35)

mycol <- rep(rgb(90,155,215, maxColorValue=255),11)
mycol[6] <- "red"

png("myGraph.png", width=900, height=600, bg="transparent")

#外枠を描く
plot(0,0,type="n", ylim=c(0,2.2), xlim=c(0,1), ann=F, yaxs="i", xaxs="i", axes=F)
rect(0,0,1,2.2, col = "white")
rect(0.283,0,0.717,2.2, col=rgb(253,230,200, maxColorValue=255), border=NA)

#軸を描く
abline(h=0.5, col="black", lty="dashed")
abline(h=1.5, col="black", lty="dashed")
abline(h=2, col="black", lty="dashed")
abline(h=1, col="red", lwd=2,lty="solid")
abline(h=2.2, col="black", lty="solid")

#棒グラフを描く
par(new=T)
barplot(mydata, col=mycol, ylim=c(0,2.2), yaxt="n", space=0.5)

dev.off()

f:id:touch-sp:20180425115826p:plain:w500

Excel VBAだと横軸の一本だけ色やスタイルを変えることはできない。
また折れ線グラフと棒グラフを一緒に描くと必ず折れ線グラフが上にくる。

VBAで折れ線グラフの線やマーカーを変更する

Sub chart()

    ActiveSheet.ChartObjects("graph").Activate
    ActiveChart.FullSeriesCollection(3).Select
    
'マーカーの型とサイズを指定
    With Selection
        .MarkerStyle = 8
        .MarkerSize = 5
    End With

'マーカーの色を指定
    With Selection
        .MarkerBackgroundColor = RGB(255, 0, 0)
        .MarkerForegroundColor = RGB(255, 0, 0)
    End With

'ラインの色と太さと型を指定
    With Selection.Format.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(255, 0, 0)
        .Weight = 2.25
        .DashStyle = msoLineSolid
    End With
    
    ActiveChart.FullSeriesCollection(1).Select
'マーカーを消す
    Selection.MarkerStyle = xlNone
'ラインの色と太さと型を指定
    With Selection.Format.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(0, 0, 255)
        .Weight = 1.5
        .DashStyle = msoLineSysDash
    End With

    ActiveChart.FullSeriesCollection(2).Select
'マーカーを消す
    Selection.MarkerStyle = xlNone
'ラインの色と太さと型を指定
    With Selection.Format.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(0, 0, 255)
        .Weight = 1.5
        .DashStyle = msoLineSysDash
    End With

End Sub

WindowsでMXNet-Gluon-Style-Transferを使う(GPUあり)

2018年4月3日動作確認

環境

Windows10 Pro 64bit
CUDA9.1
cudnn7.1.2

Anacondaで仮想環境を作成

conda create -n mxnet python=3.6 anaconda
activate mxnet

mxnetのダウンロード、インストール

こちら』から「mxnet_cu91-1.2.0b20180402-py2.py3-none-win_amd64.whl」をダウンロードしてインストール

pip install mxnet_cu91-1.2.0b20180402-py2.py3-none-win_amd64.whl

MXNetのソースをダウンロード

こちら』から最新のソースコードをダウンロードして解凍

imageのダウンロード

Linuxsvnコマンドが含まれるため、bash on Windowsを使用しないといけない
まずはsubversionのインストール

sudo apt-get install subversion

続いて、『incubator-mxnet-master/example/gluon/style_transfer』フォルダ内に移動して以下を実行

python3 download_images.py

学習済みモデルのダウンロード

こちらは、通常のWindowsから実行可能
『incubator-mxnet-master/example/gluon/style_transfer』フォルダ内に移動して以下を実行

python models/download_model.py

実行

python main.py eval --content-image images/content/venice-boat.jpg --style-image images/styles/wave.jpg --model models/21styles.params --content-size 1024 --cuda 1

WindowsのRでmxnetを使う(GPUなし)

2018年4月2日動作確認

環境

Windows7 64bit
R 3.4.4

MXNetをインストール

公式サイトとおりに実行

cran <- getOption("repos")
cran["dmlc"] <- "https://apache-mxnet.s3-accelerate.dualstack.amazonaws.com/R/CRAN/"
options(repos = cran)
install.packages("mxnet")

バージョンの確認

> packageVersion("mxnet")
[1] ‘0.10.1’

2018年4月2日現在、いまだに0.10.1がインストールされる。
R版MXNetは置いてけぼり・・・。

Windowsでmxnet-ssdを使う(GPUなし)

2018年3月10日動作確認

環境

Windows10 Pro 64bit

Anacondaで仮想環境を作成

conda create -n mxnet python=3.6 anaconda
activate mxnet

mxnetのダウンロード、インストール

pip install mxnet-1.2.0b20180308-py2.py3-none-win_amd64.whl

MXNetのソースをダウンロード

こちら』から最新のソースコードをダウンロードして解凍

openCVをインストール

  • openCV3.4.1を選択してダウンロード
  • 解凍してパスを通す(C直下の場合には以下のパス)
C:\opencv\build\x64\vc14\bin
pip install opencv_python-3.4.1-cp36-cp36m-win_amd64.whl

imageのダウンロード

bash on Windowsを使用しないといけない
『incubator-mxnet-master/example/ssd/data/demo』フォルダ内に移動して以下を実行

python download_demo_images.py

学習済みモデルのダウンロード

  • こちら』のサイト内から学習済みモデルをダウンロードして解凍
  • modelフォルダに中身のみコピー(jsonファイルとparamsファイル)

実行

python demo.py --cpu --images ./data/demo/person.jpg

WindowsでMXNet-Gluon-Style-Transferを使う(GPUなし)

2018年3月9日動作確認

環境

Windows10 Pro 64bit

Anacondaで仮想環境を作成

conda create -n mxnet python=3.6 anaconda
activate mxnet

mxnetのダウンロード、インストール

こちら』から「mxnet-1.2.0b20180308-py2.py3-none-win_amd64.whl」をダウンロードしてインストール

pip install mxnet-1.2.0b20180308-py2.py3-none-win_amd64.whl

MXNetのソースをダウンロード

こちら』から最新のソースコードをダウンロードして解凍

imageのダウンロード

Linuxsvnコマンドが含まれるため、bash on Windowsを使用しないといけない
まずはsubversionのインストール

sudo apt-get install subversion

続いて、『incubator-mxnet-master/example/gluon/style_transfer』フォルダ内に移動して以下を実行

python download_images.py

学習済みモデルのダウンロード

こちらは、通常のWindowsから実行可能
『incubator-mxnet-master/example/gluon/style_transfer』フォルダ内に移動して以下を実行

python models/download_model.py

実行

python main.py eval --content-image images/content/venice-boat.jpg --style-image images/styles/wave.jpg --model models/21styles.params --content-size 1024 --cuda 0

「text2vec」パッケージを使ってSCDVのようなことをやってみる

================================================
word2vecの代わりに「text2vec」パッケージのGloveを使用
GMMは「ClusterR」パッケージを使用
================================================

環境

Windows10 Pro 64bit
Microsoft R open 3.4.3

library(checkpoint)
checkpoint("2018-02-23", checkpointLocation = "F:/", scanForPackages = FALSE)
> packageVersion("text2vec")
[1] ‘0.5.1’
> packageVersion("tm")
[1] ‘0.7.3’
> packageVersion("ClusterR")
[1] ‘1.1.0’

本来の用途とは異なるが「checkpoint」パッケージを使用すると仮想環境作成に近いことが可能である。

データの準備

PubMedからXMLファイルをダウンロードしてAbstractTextを抽出する。
(注)なかには多言語でアブストラクトが記載されている場合がある。
(例えばこちら

using System;
using System.Text;
using System.Xml.Linq;
using System.IO;
using System.Diagnostics;
using System.Collections.Generic;
using System.Xml;

namespace pubmed
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("ファイル名を入力してください");
            string s;
            s = Console.ReadLine();

            string PMID = s.Replace(".xml", "_pmid.txt");
            string ABST = s.Replace(".xml", "_Absts.txt");

            Stopwatch watch = new Stopwatch();
            watch.Start();

            StreamWriter pmid = new StreamWriter(PMID, false, Encoding.GetEncoding("shift_jis"));

            StreamWriter absts = new StreamWriter(ABST, false, Encoding.GetEncoding("shift_jis"));

            foreach (XElement el in mystream(s))
            {
                if (el.Element("MedlineCitation").Element("Article").Element("Language").Value == "eng")
                {
                    string Absts = "";
                    foreach (XElement x2 in el.Element("MedlineCitation").Element("Article").Descendants("AbstractText"))
                    {
                        Absts = Absts + " " +  x2.Value;
                    }

                    if (Absts != "")
                    {
                        //アブストラクトに改行文字がふくまれることがある
                        //改行を消すときはスペースで置換しないと単語が連なることがある
                        Absts = Absts.Replace("\r", " ").Replace("\n", " ");
                        pmid.WriteLine(el.Element("MedlineCitation").Element("PMID").Value);
                        absts.WriteLine(Absts);
                    }
                }
            }
            pmid.Close();
            absts.Close();

            watch.Stop();

            Console.WriteLine("経過時間の合計 = {0}", watch.Elapsed);
            Console.ReadLine();
        }
        static IEnumerable<XElement> mystream(string file_name)
        {
            XmlReaderSettings settings = new XmlReaderSettings();
            settings.DtdProcessing = DtdProcessing.Parse;

            using (XmlReader reader = XmlReader.Create(file_name, settings))
            {
                while (reader.Read())
                {
                    if (reader.Name == "PubmedArticle")
                    {
                        yield return XElement.ReadFrom(reader) as XElement;
                    }
                }
            }
        }
    }
}

GloVeでワードベクトル作成まで

library(text2vec)

Absts <- readLines("Absts_for_text2vec.txt")

it <- itoken(Absts, tolower, word_tokenizer)

#text2vec_vocabularyの作成
voc <- create_vocabulary(it)
voc <- prune_vocabulary(voc, doc_count_min = 3L)

library(tm)
new_stopwords <- c(stopwords("en"), "can", "could", "may", "might", "also", "however")

voc <- voc[!(voc$term %in% new_stopwords),]

#TCM(term-co-occurence matrix)の作成
tcm <- create_tcm(it, vocab_vectorizer(voc), skip_grams_window = 10L)

#ワードベクトルの作成
glove <- GloVe$new(word_vectors_size = 50, vocabulary = voc, x_max = 10)
main <- glove$fit_transform(tcm, n_iter = 50)
context <- glove$components
word_vectors <- normalize((main + t(context)), norm = "l2")

混合ガウスモデルクラスタリング

まずはクラスター数をいくつにするかの検討

library(ClusterR)
Optimal_Clusters_GMM(word_vectors, 100, criterion = "BIC", "maha_dist", "random_subset", km_iter = 10, em_iter = 10, plot_data = TRUE)

f:id:touch-sp:20180223120223p:plain:w600
元文献の通り60くらいが妥当なのかな?

gmm <- GMM(word_vectors, 60, "maha_dist", "random_subset", km_iter = 10, em_iter = 10)
pr <- predict_GMM(word_vectors, gmm$centroids, gmm$covariance_matrices, gmm$weights)
proba <- pr$cluster_proba

idfの計算

number_of_docs <- attr(voc, "document_count")
idf <- log((Number_of_docs + 1) / (voc$doc_count + 1)) + 1

この記事は書きかけです。