ニシキヘビってかわいいよね、実際みたことないけど。

いよかん国でプログラミングとかの備忘録を書いてます。 一日一食たまごかけごはん。

Amazonアソシエイトに登録してはてなブログに貼り付けるまで

広告収入で月に1回宅配ピザを食べたいです。
画像投稿の練習も兼ねて。

まず、管理画面の「アカウント設定」から項目「Amazon アソシエイトID」の「変更する」をクリック。
f:id:nyanmao:20160125124804p:plain

こんな画面にとびます。項目「Amazon アソシエイトID」の「取得方法」をクリック。
f:id:nyanmao:20160125124847p:plain


つぎはこんな画面にとびます。「Amazonアソシエイト・プログラムのアカウントを取得する」をクリック。
f:id:nyanmao:20160125124901p:plain
Amazonアソシエイトのページに飛びます。無料アカウント作成をクリック。しばらくは指示通りに入力欄を埋めていく。
f:id:nyanmao:20160125124954p:plain
Amazonの買い物の方でログインしていたら、住所入力はすぐ終わります。
途中でWebサイトの登録欄が出るので、忘れずにブログのURLをコピペする。
f:id:nyanmao:20160125125004p:plain

最後に電話のPIN認証がある。自動応対なので僕みたいに話すの怖いよとビビる必要はないです。
コレが終わると下のような画面になる。赤で塗りつぶしているところにアソシエイトIDがでるので、
あとで2枚目の画像のAmazon アソシエイトID入力欄にコピペする。
f:id:nyanmao:20160125125034p:plain このあと「支払い方法を今指定する」をクリックして、ギフト券なり銀行振込なり設定。

その入力も終わるとアソシエイトのユーザー画面に入る。一段落つく。

次はバナーの貼付け。 Amazonで商品を見ると、上にバナーが増えていて、「このページへのリンクを作成する」というボタンがあるのでクリック。 f:id:nyanmao:20160125125052p:plain

するとこんなポップアップが表示されるので、HTMLをコピペして。 f:id:nyanmao:20160125125100p:plain

ブログに貼り付ける。

やすいよ!おいしいよ!たまごかけごはんみたいに汁っぽいものと相性いいよ!
(申し訳程度の宣伝)

gensimのLdaModel実行時に「too few updates ~」 と怒られた時

投稿の練習,昨日Qiitaで書いたやつ.

なんすかこれ...
passesかiterationsをいじればいいっぽいけど
数値計算のパラメタ調整とか中身知らないので本当に怖い.

model_lda = LdaModel(corpus=corpus, num_topics=30, id2word=corpus.id2word)
WARNING:gensim.models.ldamodel:too few updates, training might not converge; consider increasing the number of passes or iterations to improve accuracy

ソースコードを見てみる
問題はinit最後に実行されるupdateメソッド616行付近

if updates_per_pass * passes < 10:
    logger.warning("too few updates, training might not converge; consider "
                   "increasing the number of passes or iterations to improve accuracy")

passesは LdaModelのinitパラメタpassesをそのまま使ってる.
デフォルトで1が代入されている.
updates_per_pass... むむむ...

updateメソッド内_607行らへん

updates_per_pass = max(1, lencorpus / updateafter)

lencorpusはupdateメソッドの585行目付近で len(corpus)の値が代入されている.
要は文書数.この警告が出ている時の文章数は4019.
updateafter...

updateメソッド内_599行目あたり

if update_every:
    updatetype = "online"
    updateafter = min(lencorpus, update_every * self.numworkers * chunksize)
else:
    updatetype = "batch"
    updateafter = lencorpus

updateメソッドの引数指定が無いなら,
update_everyには,initパラメタupdate_everyと同じものが代入される.初期値は1.
updatetypeはonlineになる.
self.numworkersには,initパラメタdistributedがFalseのままなら1が入っている.

chunksizeは...

updateメソッド内_たぶん595行

chunksize = min(lencorpus, self.chunksize)

self.chunksizeはinitパラメタchunksizeとおなじ.デフォルトは2000.

つまり...
updateafter = min(4019, 112000) = 2000
updates_per_pass = max(1, 4019 / 2000) ≒ 2
で,ifの左の評価式は 2*1 になる.アウト.

対策は
・passesを増やす.今回の場合ではpasses=5で怒られなくなる.
・updateafterを小さくする=update_everyかchunksizeを小さくする.
_今回の場合でchunksizeだけを変えるなら400ぐらいにしたら怒られなくなる.

このパラメタについては疲れたので別の日に調べます.