質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
強化学習

強化学習とは、ある環境下のエージェントが現状を推測し行動を決定することで報酬を獲得するという見解から、その報酬を最大限に得る方策を学ぶ機械学習のことを指します。問題解決時に得る報酬が選択結果によって変化することで、より良い行動を選択しようと学習する点が特徴です。

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

Q&A

解決済

1回答

1429閲覧

統計Rで、不正な文字列を指摘されるものの、指摘された行はコメントアウト済である。

YYJP

総合スコア23

強化学習

強化学習とは、ある環境下のエージェントが現状を推測し行動を決定することで報酬を獲得するという見解から、その報酬を最大限に得る方策を学ぶ機械学習のことを指します。問題解決時に得る報酬が選択結果によって変化することで、より良い行動を選択しようと学習する点が特徴です。

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

統計

統計は、集団現象を数量で把握することです。また、調査で得られた性質や傾向を数量的に表したデータのことをいいます。

0グッド

0クリップ

投稿2021/05/13 10:13

編集2021/05/13 10:18

教科書掲載のRコードをRstudioで動かそうとすると、不正な文字列を指摘されてしまう。

一般書籍の文中及びgithubサポートページにに掲載のある、
Rコードが、動きません。
不正な文字列を指摘されるのですが、指摘された行は、
コメントアウト済みで、なぜ動かないのかが、分かりません。

ファイルの内容は、一切書き換えていません。
途方に暮れています・・・。

本当に簡単な操作で、動くようになると思うので、
原因がお分かりになられる方がいらっしゃったら、
お力添え頂けますと幸いです。

何卒、宜しくお願い致します。

*なお、書籍は片平健太郎著「行動データの計算モデリング 強化学習を例として」で、
コードはchapter2のQ学習モデルのものになります。

発生している問題・エラーメッセージ

エラー: 構文解析中に不正なマルチバイト文字列がありました (14 行) > } エラー: 予想外の '}' です in " }"

該当のソースコード

R

1# ----------------------------------------------------- # 2# Q学習モデルのシミュレーションにより選択データを生成し, 3# そのデータから最尤推定をする。 4# ----------------------------------------------------- # 5 6# メモリ,グラフのクリア 7rm(list=ls()) 8graphics.off() 9 10# 描画のためのライブラリ読み込み 11library(tidyverse) 12library(gridExtra) 13 14# 乱数のシードの設定 15set.seed(141) 16 17# Q学習モデルのシミュレーションによるデータ生成 ------------------------------------------------- 18 19# 試行数 20T <- 80 21 22# Q 値の初期化( 選択肢の数x T) 23Q <- matrix(numeric(2*T), nrow=2, ncol=T) 24 25c <- numeric(T) 26r <- numeric(T) 27pA <- numeric(T) 28 29alpha <- 0.3 # 学習率 30beta <- 2.0 # 逆温度 31 32# それぞれの選択肢の報酬確率 33pr <- c(0.7,0.3) 34 35for (t in 1:T) { 36 37 # ソフトマックスで選択肢A の選択確率を決定する 38 pA[t] <- 1/(1+exp(-beta*(Q[1,t]-Q[2,t]))) 39 40 if (runif(1,0,1) < pA[t]) { 41 # Aを選択 42 c[t]<-1 43 r[t] <- as.numeric(runif(1,0,1) < pr[1]) 44 } else { 45 # Bを選択 46 c[t] <- 2 47 r[t] <- as.numeric(runif(1,0,1) < pr[2]) 48 } 49 50 # 行動価値の更新 51 if (t < T) { 52 53 Q[c[t],t+1] <- Q[c[t],t] + alpha * (r[t] - Q[c[t],t] ) 54 55 # 選択肢していない行動の価値はそのままの値を次の時刻に引き継ぐ。 56 # 3-c でc=1 なら2, c=2 なら1, というように 57 # 逆側の選択肢のインデックスが求まる。 58 Q[3-c[t],t+1] <- Q[3-c[t],t] 59 } 60} 61 62# フィットするモデルの設定 ------------------------------------------------------------ 63 64# Q-learning 65func_qlearning <- function(param, choice, reward) 66{ 67 T <- length(choice) 68 alpha <- param[1] 69 beta <- param[2] 70 71 # 短い名前の変数に持ち替える 72 c <- choice 73 r <- reward 74 75 pA <- numeric(T) 76 77 # Q 値の初期化( 選択肢の数x T) 78 Q <- matrix(numeric(2*T), nrow=2, ncol=T) 79 80 # 対数尤度を格納する変数 81 ll <- 0 82 83 for (t in 1:T) { 84 85 # ソフトマックスで選択肢A の選択確率を決定する 86 pA[t] <- 1/(1+exp(-beta * (Q[1,t]-Q[2,t]))) 87 88 # 試行tの対数尤度は実際の選択がA (c=1) であれば log(pA[t]), 89 # B (c=2) であればlog(1 - pA[t]) となる 90 ll <- ll + (c[t]==1) * log(pA[t]) + (c[t]==2) * log(1-pA[t]) 91 92 # 行動価値の更新 93 if (t < T) { 94 95 Q[c[t],t+1] <- Q[c[t],t] + alpha * (r[t] - Q[c[t],t] ) 96 97 # 選択肢していない行動の価値はそのままの値を次の時刻に引き継ぐ 98 Q[3-c[t],t+1] <- Q[3-c[t],t] 99 } 100 } 101 return(list(negll = -ll,Q = Q, pA = pA)) 102} 103 104# 最適化により最小化する負の対数尤度を返すラッパー関数 105func_minimize <- function(modelfunc, param, choice, reward) 106{ 107 ret <- modelfunc(param, choice, reward) 108 109 # 負の対数尤度のみ返す 110 return(ret$negll) 111} 112 113# 非線形最適化による最尤推定 ----------------------------------------------------------- 114 115# 負の対数尤度の最小値を格納する変数 (最初は無限大にしておく) 116fvalmin <- Inf 117 118for (idx in 1:10) { 119 120 # 初期値を一様乱数から決める 121 initparam <- runif(2, 0, 1.0) 122 123 # 最適化の実行 124 res <- optim(initparam, func_minimize, 125 hessian = TRUE, 126 modelfunc = func_qlearning, 127 choice=c, reward=r) 128 129 # 今までの解より負の対数尤度が小さかったらその結果を採用する 130 if (res$value < fvalmin) { 131 paramest <- res$par 132 fvalmin <- res$value 133 } 134} 135 136print(sprintf("alpha - True value: %.2f, Estimated value: %.2f", alpha, paramest[1])) 137print(sprintf("beta - True value: %.2f, Estimated value: %.2f", beta, paramest[2])) 138print(sprintf("Model 1: log-likelihood: %.2f, AIC: %.2f", -fvalmin, 2*fvalmin + 2*2)) 139 140# 求めた最尤推定値をもとに,行動価値や選択確率のP(a=A)を改めて計算する 141ret <- func_qlearning(paramest, choice=c, reward=r) 142Qest <- ret$Q 143pAest <- ret$pA 144 145# 結果の描画 ------------------------------------------------------------------- 146 147# プロットする最大試行数 (50にすると本文の図のように50試行までをプロット) 148maxtrial <- Inf 149ggplot() + theme_set(theme_bw(base_size = 18)) 150 151x11() 152gQ <- list() 153 154# データフレームに格納 155df <- data.frame(trials = 1:T, 156 Q1est = Qest[1,], 157 Q2est = Qest[2,], 158 Q1 = Q[1,], 159 Q2 = Q[2,], 160 c = c, 161 r = as.factor(r), 162 pA = pA, 163 pAest = pAest) 164 165dfplot <- df %>% filter(trials <= maxtrial) 166 167# Q(A) の図の作成 168idxc <- 1 169g_qvalues <- ggplot(dfplot, aes(x = trials, y = Q1)) + 170 geom_line(aes(y = Q1), linetype = 1, size=1.2) + 171 geom_line(aes(y = Q1est), linetype = 5, size=1.0) + 172 geom_point(data = dfplot %>% filter(c==idxc & r == 1), 173 aes(x = trials, y = 1.12), shape = 25, size = 1.5) + 174 scale_y_continuous(breaks=c(0, 0.5, 1.0), labels = c(0,0.5,1)) + 175 geom_linerange(data = dfplot %>% filter(c==idxc), 176 aes( 177 x = trials, 178 ymin = 1.0, 179 ymax = 1.06), 180 size=1) + 181 theme(legend.position = "none") + 182 xlab("試行") + 183 ylab("Q(A)") 184 185gQ[[idxc]] <- g_qvalues 186 187# Q(B) の図の作成 188idxc <- 2 189g_qvalues <- ggplot(dfplot, aes(x = trials, y = Q2)) + 190 geom_line(aes(y = Q2), linetype = 1, size=1.2) + 191 geom_line(aes(y = Q2est), linetype = 5, size=1.0) + 192 geom_point(data = dfplot %>% filter(c==idxc & r == 1), 193 aes(x = trials, y = 1.12), shape = 25, size = 1.5) + 194 geom_linerange(data = dfplot %>% filter(c==idxc), 195 aes( 196 x = trials, 197 ymin = 1.0, 198 ymax = 1.06), 199 size=1) + 200 theme(legend.position = "none") + 201 scale_y_continuous(breaks=c(0, 0.5, 1.0), labels = c(0,0.5,1)) + 202 xlab("試行") + 203 ylab("Q(B)") 204 205gQ[[idxc]] <- g_qvalues 206 207# P(a=A) の図の作成 208g_pA <- ggplot(dfplot, aes(x = trials, y = pA)) + 209 xlab("試行") + 210 ylab("P(a = A)") + 211 geom_line(aes(y = pA), linetype = 1, size=1.2) + 212 geom_line(aes(y = pAest), linetype = 2, size=1.0) + 213 geom_point(data = dfplot %>% filter(c==1 & r == 1), 214 aes(x = trials, y = 1.12), shape = 25, size = 1.5) + 215 geom_point(data = dfplot %>% filter(c==2 & r == 1), 216 aes(x = trials, y = -0.12), shape = 2, size = 1.5) + 217 theme(legend.position = "none") + 218 geom_linerange(data = dfplot %>% filter(c==1), 219 aes( 220 x = trials, 221 ymin = 1.0, 222 ymax = 1.05), 223 size=1) + 224 scale_y_continuous(breaks=c(0, 0.5, 1.0), labels = c(0,0.5,1)) + 225 geom_linerange(data = dfplot %>% filter(c==2), 226 aes( 227 x = trials, 228 ymin = -0.05, 229 ymax = 0.0), 230 size=1) + 231 geom_path(size = 1.2) 232 233grid.arrange(gQ[[1]], gQ[[2]],g_pA, nrow=3) 234 235# 図を保存する場合は以下を実行 236# g <- arrangeGrob(gQ[[1]], gQ[[2]], g_pA, nrow=3) 237# ggsave(file="./figs/qlarning_fit.eps", g) 238 239

試したこと

pr <- c(0.7,0.3)

までは、問題なく動きます。
その次のfor文ですが、中身のif文は、それぞれ全て、ちゃんと動くものの、
for文全体を動かそうとすると、
コメントアウト済の文が
不正な文字列であると指摘されます。、

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

問題なく動きましたよ。(少々ワーニングが出ましたけど)

イメージ説明

投稿2021/05/13 11:44

編集2021/05/13 11:45
technocore

総合スコア7225

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YYJP

2021/05/13 14:21

ご回答ありがとうございます。 やはり、自分のPCだと動かないのですが、コード以外の環境等の問題だと、どのようなことが考えられそうでしょうか…?
YYJP

2021/05/13 15:40

試しに、別のPCでRstudioを動かしたところ、うまくいきました!本当に助かりました。ありがとうございました。^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問