このコロナ禍、気軽に旅行にも行けません。暫し、近所のちょっとした水場を散策する日々です。そんな時に出会った小さな生き物たち、何か安らぎを与えてくれます。以下の写真は、ニホンアマガエルとハグロトンボと思われます。
I am a professor emeritus of CS at Kanagawa Institute of Technology, Japan. Originally my specialty was parallel and distributed systems. My current interests include machine learning, natural language processing, creating mobile apps with MIT App Inventor, and quantum computing. In the web version of this blog, clicking the icon on the right (a plastic sphere) will take you to the "List of Quantum Computing Articles". - Fujio Yamamoto (for e-mail, add "@ieee.org" after "yamamotof")
2021年6月28日月曜日
2021年6月20日日曜日
A list of my articles about MIT App Inventor apps
I have written about 300 posts on this blog, including articles on computer science and smart phone applications. Most of them are written in Japanese. However, some of them on MIT App Inventor were written in English, so that people outside Japan can also read them.
Here is a list of articles about MIT App Inventor written in English. I would be very happy if people who are going to use App Inventor to develop new apps can refer to them.
# Various apps using App Inventor
Make a mini calendar app for Android, celebrating the New Year
Beautiful mountain view comes automatically to your smartphone
Finally arrived! Beautiful mountain photos that were automatically recognized!
Supporting social dilemma experiments with App Inventor
Voice Calculator: well-crafted AI tutorial
Using the MIT App Inventor FaceExtension (for Facemesh)
Identify the position from the key point number in Facemesh
Enjoy finding out Hamiltonian Cycles
Enjoy Reinforcement Learning in Tic-tac-Toe
Enjoy live cameras from across the world on your smartphone
Timer Overhead(in MIT App Inventor)
# Using the App Inventor Extensions (JSON, AWS, etc.)
A JSON Decoding Extension for App Inventor (1)
A JSON Decoding Extension for App Inventor (2)
Another example using JSON Decoding Extension
Decoding JSON by using new Dictionary Blocks
A good example of Extension for App Inventor
Using MIT App Inventor AWS AI Services Extension
Creating my own extension blocks for App Inventor
# Linking App Inventor and micro:bit
Cooperation between micro:bit and MIT App Inventor with Eddystone signals (No.1)
Cooperation between micro:bit and MIT App Inventor with Eddystone signals (No.2)
Cooperation between micro:bit and MIT App Inventor (No.3)
# Using JavaScript in App Inventor
Make MIT APP Inventor more powerful with JavaScript
Writing formulas in both AppInventor and JavaScript
# More App Inventor resources
Rapid Prototyping Using App Inventor in Information and Computer Sciences Course
Empowering Students to Develop Mobile Applications by Using App Inventor for Android
2021年6月18日金曜日
ちょっと惹かれるPython1行コード(その2)
【what is this】前回に引き続き、短くて美しい1行コードを検討します。参考文献[1]を参考にしています。Pythonの初心者が中級へステップアップするのに適しています。小生もこれに該当しますので、個人的な忘備録でもあります。
■例題:漁獲高の平均を上回る漁港をリストアップする
今回データ分析の対象とするデータ(参考文献[2]を参考とした)を以下に示します。Python numpy配列であるFHには、主要な漁港名9つを格納しています。そして、別のnumpy配列Vには、この漁港の順に、2014年〜2018年の5年間の漁獲高(水揚げ量)を万トン単位で格納してあります。
上記1行コードをすぐに理解できる人は少ないかもしれません。そこで、その中身を分解してみます。最後には、「なるほど、素晴らしい!」となるでしょう。
2021年6月11日金曜日
ちょっと惹かれるPython1行コード(その1)
【what is this】誰でも、短くて美しいコードに憧れます。参考文献[1]には、Pythonによる1行コード(Python One-Liners)の考え方と実例がたくさん載っています。それを参考に1行コードを2つほど書いてみました。
■例題:キノコの毒性に関するデータの学習と学習結果による予測
機械学習の分類問題として、キノコを有毒か無毒かに分類することをやってみます。図1には、キノコの色(赤、青、黄)、笠の形(丸、角)、柄の長さ(長、短)、場所(地面、樹木)の特性によって、それが有毒か無毒かのデータ(参考文献[2]から引用)があります。これを機械学習によって学習させ、さらに、その学習データが正しく分類(予測)されたかどうかを確認します。
2つの手法(SVM-サポートベクタマシンとRandomForest)によるPython1行コードとその予測結果を示します。図2は、SVMの場合です。Python numpy配列のスライシング(特性データと正解レベルを分離するため)を行い、学習(.fit)結果を予測(.predict)へ接続しています。確かに、素早く簡潔なコーディングとなりました。学習に用いたデータに対する予測結果は、正解率89%でした。9件のうち1件のみが誤まった判定となりましたが、こんな少ないデータでも良く予測できることが確認できました。
さて、参考文献[1]の最後に、以下のような叙述がありました。納得ですね。
2021年6月9日水曜日
「強化学習理論入門」の最終章は深層学習だった
【what is this】強化学習理論入門を書籍[1]で学んできましたが、その最終章(第5章)は深層学習でQ-Learningを行うものでした。ここでその技術を述べることはできませんが、最後の例題「あるけあるけゲーム」でその魅力に浸りたいと思います。
■DQN(Deep Q Network)これまでに、行動ポリシーπについて、状態価値関数Vπ(s)や、行動-状態価値関数qπ(s, a)を計算して、最善の行動ポリシーを求めることをやってきました。しかし、状態(s)の数が非常に大きい場合などは、全ての状態についてこれらの関数値を保存しながら利用することは困難となります。(例えば、囲碁の場合、盤面の状態の数は10の172乗というとてつもない数になると言われています。)
ここでとりあげる「あるけあるけゲーム」の規則は、図1の右側の説明にあります。キャラクターは障害物(および自分の辿った場所)を避けて、できるだけ長く歩く、というものです。何の方策もなく歩くと、図1の結果のように、長さ(Length)5程度で短く終わる場合が多いです。自分の軌跡に戻ってしまってゲーム終了となる場合も多いです。
このゲームを、如何にしてベルマン方程式に結びつけるか(アクション、報酬、状態の設計)、そして、さらにどのようにニューラルネットワークで学習させるのか、それを学べるのが、この書籍の第5章なのです。図4はその最終的な結論としてのDQNのネットワーク構成です。詳細を掴むにはこの書籍を読んで戴く必要がありますが、画像認識で多用されている畳み込みフィルター(conv2d層)が使われている点がポイントの一つです。これは、別々のレイヤーに置かれたキャラクタと障害物の位置関係を把握するためです。
基礎から始めて高度な強化学習理論が実に丁寧に説明されており、最後まで挫折せずに読めました。書籍によっては、最初は緻密な説明がなされていても、途中から杜撰な叙述になったり、急に飛ばしはじめたりする場合もあるのですが、本書は全くぶれることなく、最後まで緻密な説明で貫かれています。Pythonのコードの説明も、同様に非常に詳しく、読者にとってとてもありがたい。完全に理解したとは言えないかも知れないが、この強化学習理論の専門書(5章構成、全283ページ)を丸々一冊読み上げたということで、力がついた気がします。
2021年6月4日金曜日
強化学習:モンテカルロ法とQ-Learning
【what is this】強化学習に関するさらなる続編です。前回のレンタカーショップ問題とは異なり、環境モデルが分からない場合の例としての迷路問題をとりあげます。そして、その解法としての、モンテカルロ法とQ-Learningの性能を観察します。
■迷路問題とレンタカーショップ問題先のレンタカーショップ問題では、ある状態Sにおいて行動aを取った場合に、得られる報酬rと次の状態S'が起こる条件付き確率が分かっている(計算できる)必要がありました。しかし、現実の問題ではそれを満たさない場合も多いです。以下に述べる迷路問題(開始点から終点までの最短経路を求める)もその一つです。
ここでは、迷路問題に対する解法として、モンテカルロ法とQ-Learningなどを検討しています。本記事は、実際のところ、これまでと同じく、中井悦司著[1]の第4章を学んだ成果を簡単に書いたものです。
2021年5月28日金曜日
レンタカーショップ問題(強化学習での行動ポリシー最適化)
【what is this】強化学習における「状態価値関数」をとりあげてきましたが、今回もその続編です。理論と手法の詳細は参考文献[1]を熟読戴くことにして、ここでは、「レンタカーショップ問題」と呼ばれる複雑な問題がこれに基づいて解けることを楽しみたいと思います。
■レンタカーショップ問題(Jack's Car Rental)この問題は著名なSuttonの著作[2]にありますが、簡潔に1ページに纏められており、そこから自分でプログラムを作るのは難しそうです。しかし、中井悦司著[2]では、実に丁寧にこの問題の設定と具体的な解法(Pythonプログラム付き)が解説されており、非常に有用です。このブログ記事は、それにしたがって学んだ結果を小生なりにまとめたものです。
この問題を解くためのベースとなる状態遷移を図3のように定めます。ある時点の状態は、店Aと店Bに現在残っている車の台数のペアとします。営業終了時(午前中は貸出しのみ、午後は返却のみ)の状態をSとします。それに対するアクションa(行動a)は、夜間に店Aから店Bへ|a|台の車を移動させることを意味します。逆向きの移動ではaの値は負値になります。その行動が終わり、さらに翌日の営業が終了した時点の状態をS'とします。つまり、状態Sにアクションaを適用した結果の状態がS'です。
この方法は(詳細はここには書けませんが)、行動-状態価値関数計算とGreedyポリシーの更新と状態価値関数の更新をセットとして、全ての可能な状態(店Aと店Bに残っている台数のあらゆる組合せ)について行います。それを、すべての状態について変動がなくなるまで反復します。反復一回あたり計算量(可能なあらゆる台数についての確率計算を含む)は相当に大きくなりますが、種々の効率化手法がとられます。最終的には、比較的少ない反復回数(数十回程度)で収束解(最適解)が得られるようです。図4は、収束の途中の解(行動ポリシー)を示しています。
冒頭に述べた中井悦司著[1]は、全体で5章の構成、本文全276頁です。今回の話題は、そのうちに第3章(全体の約6割)までの集大成と言えます。つまり、状態遷移を表す条件付き確率が全て計算できる「環境が分かっている」場合の基本的な強化学習理論の結論であると言えましょう。
[2] Richard S. Sutton and Andrew G. Barto, "Reinforcement Learning : An Introduction", second edition, The MIT Press, 2018.
2021年5月22日土曜日
MIT App Inventor Summer Appathon(ハッカソン)のご紹介
2021年5月17日月曜日
利尻岳(北海道)五月の風景
最近になって、北海道にも新型コロナウィルスに関する緊急事態宣言が発令されました。現地へ出かけることはできませんが、利尻町のホームページで公開されているライブカメラで利尻岳(利尻富士とも呼ばれる日本百名山の一つで標高1,721m)の様子を楽しむことができます。最近そこで閲覧した、残雪の美しい山の風景を以下に載せたいと思います。
2021年5月15日土曜日
トランザクションデータのグループ化(JavaとPython)
【what is this】トランザクションデータなど、複数のカラム(キー)からなるデータを、特定のいくつかのカラムについて、階層的にグループ化したい場合があります。JavaとPythonを使って、簡単な例で試してみます。
本記事で扱う小さなデータ(csvファイル)とソースコード(JavaとNotebook形式Python)はこちらにありますので、よろしければお使い下さい。
■例題:トランザクションデータ(通貨取引)のグループ化何をしたいのかを、図1で説明します。図1(a)は、参考資料[1]のcsvデータを若干編集したものです。先頭行は、3つのカラム名(City, Currency, Value)を示しています。2行目以降のトランザクションを集約して、右側の(b)に示すように、取引所(City)でグループ化し、さらに通貨(Currency)毎の取引額(Value)の平均値を求めたい。この処理は、初歩的なプログラミングでも可能ではありますが、恐らく、込み入ったものになるでしょう。ここでは、分かりやすく、効率的なプログラムにしたいのです。
図2に示したJavaプログラムは、StreamとCollectionのチュートリアルである参考資料[1]を参考にしています。まず、1〜2行目で上記のcsvデータを読み込み、3行目でトランザクションを3つのカラム対応のデータに分割しますが、データの先頭行は不要なので4行目のfilterで削除します。5行目では、各トランザクションに対するオブジェクトを生成しています。そのクラスの定義は(b)にあります。このオブジェクトのプロパティを利用して、6〜7行目で、Cityについてグループ化し、さらにCurrencyについて纏めてそれらの平均値を得ています。ストリームに対するgroupingByが2重に適用されているところがポイントです。ここで、例えば、「Tranz::getCity」は、トランザクションオブジェクトに対して、一斉にクラスTranzのメソッドを適用する(Cityデータを得る)ことを意味します。8〜11行目は結果の出力表示です。



































