<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Okazawa Ryusuke on Medium]]></title>
        <description><![CDATA[Stories by Okazawa Ryusuke on Medium]]></description>
        <link>https://medium.com/@SEKAINOOKAZAWA?source=rss-2f57c3ad8306------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*JYXZbcz4dm-oi1Ug.</url>
            <title>Stories by Okazawa Ryusuke on Medium</title>
            <link>https://medium.com/@SEKAINOOKAZAWA?source=rss-2f57c3ad8306------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 13:45:07 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@SEKAINOOKAZAWA/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[日本語で見る fastai Lesson1]]></title>
            <link>https://medium.com/@SEKAINOOKAZAWA/fastai-lesson1-69e78485e417?source=rss-2f57c3ad8306------2</link>
            <guid isPermaLink="false">https://medium.com/p/69e78485e417</guid>
            <dc:creator><![CDATA[Okazawa Ryusuke]]></dc:creator>
            <pubDate>Thu, 08 Mar 2018 16:21:26 GMT</pubDate>
            <atom:updated>2018-12-17T06:52:30.857Z</atom:updated>
            <content:encoded><![CDATA[<p>無料でDeep learningが学べるという<a href="http://course.fast.ai/lessons/lesson1.html">fast.ai</a>.</p><p>Lesson1はFast.aiの全体像や環境設定・Deep learningを手軽に試せるチュートリアルになっています。</p><p>以降、タイムラインごとに動画の要約をします。</p><p><a href="http://course.fast.ai/lessons/lesson1.html">Deep Learning For Coders-36 hours of lessons for free</a></p><p>＊追記：crestle使ってもいいですが、私はGoogle colabを推奨します。</p><p><a href="https://note.mu/ryuwryyy/n/ne10fea9f3e6a">Google ColabでGUPを無料で使ってfast.aiの設定をする｜おかざわ｜note</a></p><h3>サーバーの設定が超簡単 crestle</h3><p>・<a href="https://youtu.be/IPBSB1HLNLo?t=4m11s">00:04:11</a> <a href="http://crestle.com/">crestle.com</a>でGPUを借りて高速で処理してみる</p><p>日本でこの講義を受けるのであれば、GPUはcrestleがいいと思います。</p><p>理由は、paperspaceが日本で使えない（公開時点では）のと、AWSだと設定が難しいのと値段を心配しなければいけないのに対し、</p><p>crestleは設定はほぼ不要です!<br>また、値段も時間ごとの課金なので、初心者でAWS使いすぎて多額の請求が来るという事態も避けれます。私は多額の請求きました(泣)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BDkX94Suz0wikgK3fCq83Q.png" /></figure><h4>fastaiの進め方はボトムアップ式 手を動かしながら学習</h4><p>crestleを立ち上げれたら、物は試し。とりあえず、コードを動かしていきます。動画内ではこれをボトムアップ式と呼んでおり、数学やプログラミング（Linaxなど）を全てを学んでいくトップダウン式は莫大な時間がかかるので、この講座ではボトムアップつまり実際に動かしながらあとから、具体的に詰めていこうという方針です。</p><p>なので、<strong>何をやっているか全て分かる必要はありません</strong>。</p><p>この勉強法は大学の教育でも使われてほしいですねといってました。そのとおりです。大学の講義は何のためにやってるかわかんなくなります（筆者は経済学部でいやいや経済学をやってる身なのでよくわかります）プログラミングなんかとくに。全部わかってる必要ないですからね。全部わかろうとすれば、C言語からやらないといけなくなるし。Pythonは1行でいろんな事できますし。あるとき、教授は一から参考書をやろうと助言し、インターンではとりあえず実務を、目の前のタスクを死ぬ気で乗り越えていこうかと助言され、どっちが学習効率いいかと言うと後者のとりあえず手を動かす方が私には合いました。ボトムアップがいいよね...というオチのない話。閑話休題</p><h3>Dogs vs Cats</h3><p>とりあえずコードを動かしてみます。Crestleでfastaiのlesson1.ipynbを開きます。</p><ul><li><a href="https://youtu.be/IPBSB1HLNLo?t=12m30s">00:12:30</a> ‘Dogs vs Cats’をJupyterで動かしながら見ていく</li></ul><pre># 自動で読み込み、インラインでかけるように、全てのノートブックでこれらのコードを書きます<br>%reload_ext autoreload<br>%autoreload 2<br>%matplotlib inline</pre><ul><li>事前に用意されたライブラリを読み込みます。ありがたいです。</li></ul><pre><strong>from</strong> <strong>fastai.imports</strong> <strong>import</strong> *</pre><pre><strong>from</strong> <strong>fastai.transforms</strong> <strong>import</strong> *<br><strong>from</strong> <strong>fastai.conv_learner</strong> <strong>import</strong> *<br><strong>from</strong> <strong>fastai.model</strong> <strong>import</strong> *<br><strong>from</strong> <strong>fastai.dataset</strong> <strong>import</strong> *<br><strong>from</strong> <strong>fastai.sgdr</strong> <strong>import</strong> *<br><strong>from</strong> <strong>fastai.plots</strong> <strong>import</strong> *</pre><ul><li>使いたいデータにパスを通します</li></ul><pre>PATH = &quot;data/dogscats/&quot;</pre><ul><li>sz は早く処理するために画像をリサイズすることを可能にする単位<br>あとのたくさんのコースで扱いますが、今は224とします。</li></ul><pre>sz=224</pre><ul><li>Crestleを使う場合は以下のコードのコメントアウトを外します。</li></ul><pre><em># os.makedirs(&#39;data/dogscats/models&#39;, exist_ok=True)</em><br><br><em># !ln -s /datasets/fast.ai/dogscats/train {PATH}</em><br><em># !ln -s /datasets/fast.ai/dogscats/test {PATH}</em><br><em># !ln -s /datasets/fast.ai/dogscats/valid {PATH}</em><br><br><em># os.makedirs(&#39;/cache/tmp&#39;, exist_ok=True)</em><br><em># !ln -fs /cache/tmp {PATH}</em></pre><h4>実際に使う写真を確かめてみる</h4><ul><li>画像がどうやって処理されていくかを見ていきます</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/769/1*L2AvcVE7OUgm51I1iUOOiQ.png" /></figure><p>img[:4,:4]は色（赤・青・黄）の値を示してます。これからオリジナルで画像を認識していく上で必要なないようなので目を通しておきましょう。</p><h4>たった3行でDeep learningを体感してみる</h4><ul><li><a href="https://youtu.be/IPBSB1HLNLo?t=20m20s">00:20:20</a> とりあえず体験してみる<br> ‘resnet34’ というアーキテクチャと epochと accuracy on validation setを実行してみます.これも後ほど詳しく見ます。</li></ul><pre><em># Uncomment the below if you need to reset your precomputed activations</em><br><em>shutil.rmtree(f&#39;{PATH}tmp&#39;, ignore_errors=True)</em></pre><ul><li>この3行を理解するために詳しくはLesson2で見ていきますが、とりあえず動かしてみます</li></ul><pre>arch=resnet34<br>data = ImageClassifierData.from_paths(PATH, tfms=tfms_from_model(arch, sz))<br>learn = ConvLearner.pretrained(arch, data, precompute=<strong>True</strong>)<br>learn.fit(0.01, 2)</pre><p>私はCrestleで実行してみて結構2:36-&gt;00:12-&gt;00:16秒と意外と時間かかりました。Pepaerspaceはもっと早いようですが。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/502/1*j9IIW50QeonORboz5gQx2g.png" /></figure><h4>結果を分析してみる</h4><ul><li><a href="https://youtu.be/IPBSB1HLNLo?t=24m11s">00:24:11</a> lesson1.ipynbでディープラーニングの結果を見ていきます</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ng_4Rmr4qRWZX9fIEEVq2w.png" /></figure><p>自信のあるものがDog:1,Cat:0なので、0.5が判断が曖昧なものです。この曖昧なものや自信あるのに間違っている画像を減らすべくLesson2以降で学んでいきます!</p><h3>fast.aiの全体像</h3><ul><li><a href="https://youtu.be/IPBSB1HLNLo?t=33m45s">00:33:45</a> 8 stepsで進める全体像</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TQxN_UZpEMGi3SqjEKUGfw.png" /></figure><ul><li>コンピュータビジョンと呼ばれる画像認識をKaggleで実際に提出してみて、そのあとRNNで自然言語処理を行います。その後に協調フィルタリングによるレコメンドシステムを行い、その後、ResNetでまた画像認識に戻ってきます。</li></ul><p>この講義は一周してみてくださいと作者のジェレミーは言っています。一周後によく復習してくださいと。まあ1周するのにも1講義10時間はかかるのですが（笑）AIって騒がれてるけど、現実は厳しいようです（泣）諦めないことが最大の鍵になりそうです。</p><h3>そもそもDeep learningとは?機械学習の一種?</h3><ul><li><a href="https://youtu.be/IPBSB1HLNLo?t=44m11s">00:44:11</a> そもそもDeep learningとは?</li></ul><p>世間では囲碁で機会が人間に勝ったり、ガンを見つけたりして一躍有名になりました。Googleは2014年から力を入れてやっていたようです。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/598/1*hRTniIeVyc-5obbTTXH7zw.png" /></figure><h3>深層学習の最も原理的な表現保証 ポイントは3つ</h3><ul><li><a href="https://youtu.be/IPBSB1HLNLo?t=49m11s">00:49:11</a> 深層学習の最も原理的な表現保証</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*OjdnGe4zeZryWcxMQQuWnQ.png" /></figure><p>深層学習を可能たらしめているポイントは3つです。</p><ol><li>無限微分可能関数（Infinitely flexible function）</li><li>万能なパラメータフィッティング</li><li>高速でスケーラブル</li></ol><h4>1.ニューラルネットワーク（Infinitely flexible function）</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5QHbLBMXxdPJNKkHHhFEUA.png" /></figure><p>ニューラルネットの発展によってより深く学習が可能になりました。</p><h4>2.万能なパラメータフィッティング（最急降下法）</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*phydfYp7_AKuvSPE5jyXyQ.png" /></figure><p>パラメータを最小化するには勾配法が最適です。過学習には気をつけないといけませんが。</p><h4>3.高速でスケーラブル（GPUとニューラルネットワーク）</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*6aqdfOkOqaJ2mnuXWjE5AQ.png" /></figure><p>GPUの発展により値段も下がり、今まで1日かかっていた深層学習が一瞬で終わったりすることが実はAIブームを作り出したということです。</p><h4>Deep Leaningの実際の例</h4><ul><li><a href="https://youtu.be/IPBSB1HLNLo?t=58m11s">00:58:11</a> Deep Leaningの具体例<br>course in ML1 (Machine Learning 1)<br>Deep learningがどのようなビジネスに使えるかを紹介しています</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YeO3GJdVGj4wjBW2uWAPFQ.png" /></figure><ol><li>不正利用検知</li><li>ユーザーのレテンション（関係維持）/チャーン（乗り換え客）の予測</li><li>優先顧客の見極め</li><li>売上の予測</li><li>レコメンドシステム</li><li>コールセンターの効率化</li><li>プロダクト失敗の予測</li><li>広告最適化</li><li>ストアのレイアウト</li><li>クレディットのリスク回避</li><li>履歴書のスクリーニング</li><li>社内のスケジュール管理</li><li>値段の最適化</li><li>マネーロンダリングの回避</li><li>実店舗の場所を最適化</li></ol><p>ほかにもいろいろできそうです。私は心の予測をAIでしてみたいです。AIは今後インフラとなることは間違いないので、Fastaiもがんばって最後まで続けていきたいところです。</p><ul><li><a href="https://youtu.be/IPBSB1HLNLo?t=1h2m11s">01:02:11</a> 非線形モデル（シグモイド・Relu・SGD関数）</li></ul><h4>畳み込みネットワークのイメージ</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*j9zeIrnt5blARZzZFkpoEg.png" /></figure><p>私は参考書でやってたのですが、数式とコードだけではなんとなくイメージがつきにくいんですね。</p><p>そのあと、この動画をみてCNNのイメージがはっきりできるようになり頭がクリアになりました。最初からこの動画を見ていたかったと思うくらいに。</p><p><a href="http://setosa.io/ev/image-kernels/">Image Kernels explained visually</a></p><h4>シグモイドの重みとバイアス付のイメージ</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*PpZhT7Svmc0Bq5EvydY-DQ.png" /></figure><p>これまた、初学者のときに見ておけば、ニューラルネットにおける重みとバイアスのイメージもすんなりできたであろう良いサイトです。</p><p><a href="http://neuralnetworksanddeeplearning.com/chap4.html">Neural networks and deep learning</a></p><h4>最急降下法のイメージ</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BQYBm8bnPiAn87G7tX35Jg.png" /></figure><p>この動画もしかり、学習回数を重ねるにつれ、回帰直線が実測値に近づいていくというイメージをしやすい動画です。Jupyterで動画表示もできるようです。驚きの連続です。後ほどやってみます。</p><h4>勾配法とLearning rateの説明</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qmx8kffTB-gMS9HhSyS18Q.png" /></figure><p>イメージができたところで、理論的な話がさらっとでてきます。</p><p>ここではチュートリアルなのでさらっと流れましたが</p><p>要約をすると、</p><p>Xn+1 ＝ Xn + 傾き* l（学習率）</p><p>というのを頭に入れておけばここではOKかな</p><h3>先程、実行したLesson1のコード（CNN）を図解</h3><ul><li><a href="https://youtu.be/IPBSB1HLNLo?t=1h8m20s">01:08:20</a> CNNの理論を図解してみていく</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pZ_Fgc6PI16_cyW6_QHVcw.png" /></figure><ul><li>lr_findというライブラリをFastaiは用意している。これは100％を超えるまえに処理を止める機能がある。</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FH2EPfAJYTGNF_sgDZYArw.png" /></figure><p>上記のグラフでは、10^-2 つまり、0.01あたりで最小値を出しており、この値をLearning rate(学習率)としている。くわしくは後ほど見ていくそうだ。</p><h4>エポック</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*blab1Ui1UGWwj33EwH1R7w.png" /></figure><p>ここではエポックを3に増やしてみて、評価値が下がっていることを確認している。</p><p>実際に,右から3つ目の値が評価値なのですが</p><p>0.98975</p><p>0.99219</p><p><strong>0.98975</strong></p><p>と2回目の方が3回目よりよい評価となっており、これを最適化する方法を今後見ていくそう。</p><h3>Jupyter Notebookの便利な機能</h3><ul><li><a href="https://youtu.be/IPBSB1HLNLo?t=1h21m30s">01:21:30</a> Jupyter Notebookの便利な機能</li></ul><p>Jupyterの3つの便利な機能</p><ul><li>tab：予測変換</li><li>shift + tab ：ドキュメントが見れる 2回連続ですると詳細が見れる</li><li>?：ドキュメントの詳細がポップアップする</li><li>??：リソースが表示される</li></ul><p>こんな便利機能があるんですね。Jupyter様様です。ほんとに（泣）GoやSolidityやJSなど他の言語を使うときによく思うのですが、Jupyterほど書きやすくて高機能なエディタはないと常日頃思っております。意外と知らなかった機能がたくさんあったのでJupyterをもっと使いこなしてみたい。</p><p>Fastaiもそういったこまかい技まで教えてくれる超実践的でドキュメントもわかりやすい神教材だと思います！これが無料…</p><h3>Lesson1まとめ</h3><p>こんかいはチュートリアルなので、理論的なことは私も飛ばして書きました。</p><p>要点としては</p><ul><li><strong>crestleでGPUサーバーが楽に!</strong></li><li><strong>CNN（画像認識）を3行で試しに動かしてみた 詳細は次の章で!</strong></li><li><strong>そもそもFast.aiの全体像と進め方</strong></li><li><strong>Deep learningがなぜスゴイのか 3Point (ニューラルネットワーク・勾配法・GPUと高速処理)によって実現が可能に</strong></li><li><strong>CNN（畳み込みネットワーク）のチュートリアル（CNNの仕組み・シグモイド・勾配法の動画によるイメージ付け）</strong></li><li><strong>Lesson2への布石（学習率やエポックの説明をさっと行い、なぜこれらを指定するのかに注意を向ける）</strong></li></ul><p>といった感じでしょうか。少々荒い解説ですが、本題は次章からなので、あまりチュートリアルに時間をさくもの違うと思うので、Lesson1はこれにて。</p><p>Lesson2からはもっとコードメインの解説をしていくことになりそうです。</p><p>最後に個人的に言いたいことは、fastaiはわかりやすくて詳しいドキュメントあるし、無料だし、初心者でも分かるように教えてくれるので最高です。</p><p>2017verのfastaiではAWSの処理が遅くて高額なのと所々おこるエラーの対処でうまく進まなかったのですが、2018にアップデートされ、丁度やりたかったPytorchも学べるということで!<br>また、ドキュメントの質もアップグレードしてます。日に日に急速な進化を続けるAI分野ですが、やるならfastai一択だと思います!Couピーraも有名ですが、言語はOctaveだっけ?あれは私も1万かけてやろうとおもって挫折してますし、機械学習より深層学習、なによりPythonでやりたいなという気持ちがあったので、そんなときに探しまわった結果Fastaiさんと運命的な出会いで（笑）余談がすごいですが、結構疲れますね。量が多くて。</p><p>Lesson2続きます!挫折しないようにがんばります。</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=69e78485e417" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ブロックチェーンプログラミング"3.ビットコインの暗号技術"]]></title>
            <link>https://medium.com/@SEKAINOOKAZAWA/%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-f494ef3fdde9?source=rss-2f57c3ad8306------2</link>
            <guid isPermaLink="false">https://medium.com/p/f494ef3fdde9</guid>
            <category><![CDATA[ruby]]></category>
            <category><![CDATA[bitcoin]]></category>
            <category><![CDATA[blockchain]]></category>
            <dc:creator><![CDATA[Okazawa Ryusuke]]></dc:creator>
            <pubDate>Mon, 26 Feb 2018 17:48:46 GMT</pubDate>
            <atom:updated>2018-02-26T17:50:42.140Z</atom:updated>
            <content:encoded><![CDATA[<p>ブロックチェンをフロムスクラッチで勉強していく過程でのまとめ・頭の整理をする目的でこの記事を書いています。</p><p>参考書はブロックチェーンプログラミングです。</p><p>１．ビットコインの暗号技術</p><p>１-２暗号学的ハッシュ関数</p><p>１-３公開鍵暗号</p><p>２．ECDSA</p><p>２-１楕円曲線暗号</p><p>２-２ECDSAの暗号鍵の生成</p><p>２-３ECSDAによる電子署名</p><p>２-４ECSDAの決定性署名</p><p>３.ビットコインアドレス</p><p>３-１ビットコインアドレスの作成方法</p><p>３-２base58エンコーディング</p><p>３-３base58デコーディング</p><p>３-４プレフィックス</p><p>３-５チェックサム</p><p>３-６ペイロード</p><p>３-７Base58Checkエンコーディング</p><h4>１．ビットコインの暗号技術</h4><p>暗号技術は軍事機密として扱われるような技術でした。ビットコインには新しい技術は使われておらず、むしろ枯れた暗号技術を組み合わせてできたものです。</p><h4>１-２暗号学的ハッシュ関数</h4><p>暗号学的ハッシュ関数とは、直感的にいうと、任意の長さの文字列を入力すると一定のサイズのランダムな数値を変えるような関数です。一方関数とも言う。</p><h4>1-2-1ダイジェスト</h4><p>ある処理が、同じ入力に足して必ず同じ値を変えるという性質を<strong>決定性</strong>という。</p><p>この性質を持つため、ハッシュ値のことを入力したメッセージの<strong>ダイジェスト</strong>（要約）と呼ぶことがあります。</p><h4>1–2–2完全性</h4><p>メッセージが１ビットも変わっていないことを<strong>完全性</strong>と言います<strong>。</strong>ハッシュ値はメッセージの完全性の検証に使うことができます。全てを確認せずとも先頭４ビットでも利用可能。</p><h4>1–2–3コミットメントへの利用</h4><p>一度きりしか使わないランダムな数値のことを<strong>nonce（ナンス）</strong>とよび、ハッシュ値を実際に計算した人は、使用したナンスを開示することによって、第三者に対して自分がそのメッセージとハッシュ計算を行った人間を確実に関係づけることを<strong>コミットメント</strong>といいます。</p><p>ビットコインのマイニングとは、ナンスを変更しながらブロックのデータのハッシュ値を繰り返し計算することで。マイニング競争とは、次々とナンスを変更しながらハッシュ値を計算し、それとターゲットと呼ばれる数値を比較し、世界で最初にターゲットよりも小さいハッシュ値を得たものが勝利者となるものです。</p><p>マイニングの結果得られるナンスのことを<strong>プルーフオブワーク（proof of work）</strong>といいます。理由はナンスを得るには莫大な計算が必要だからです。</p><p>同時にこのナンスはブロックの内の全てのトランザクションに対するコミットメントにもなっています。</p><h4>1–2–4データ参照のためのポインタとしての利用法</h4><p>ハッシュ値によるデータ参照のポインタを使ったデータ構造の表現力はとても強力です。</p><p>ハッシュ値をメッセージとみなして再びそのハッシュ値を計算することでハッシュ値間の連続構造を改変不可能にすることができます。これをハッシュチェーンといい、ハッシュチェーンを使うとデータの構造化に買わえてデータ間の欠落がないことを証明するコミットメントとして利用できるようになります。</p><h4>1–2–5あるデータがコミットされたメンバーであることの証明手段としての利用法</h4><p>ハッシュチェーンの１つに、マークル木というデータ構造があります。マークル木は、全ての枝がそれぞれ２つずつに分岐する木構造をもったハッシュチェーンです。</p><p>作成方法は、対象となるデータをまず一定の基準で順序付けた上で、葉から枝に向けて２つずつまとめられ上の枝へとまとめ上げていきます。マークル木の頂点に位置するハッシュ値を使うと、葉に当たるすべてのデータに対する依存関係を変更不能にします。このたった１つのハッシュ値を、マークルルートと呼びます。このマークルルートと呼びます。このマークルルートになんすをつけ加えることでマークル木全体へのコミットメントが完成します。</p><p>マークル木の葉に当たる全てのデータが、ハッシュチェーンがマークルートへ到達することを二択の判断の繰り返しを木の高さぶん行うだけで、コミットされているか否かを判定することができる。これはそのデータがコミットされたメンバーであることを判定することに相当しています。</p><h4>1–2–6暗号学的ハッシュ関数の衝突耐性</h4><p>異なるメッセージを入力したのに、出力したハッシュ値がおなじになってしまうことをハッシュの衝突と言います。暗号学的ハッシュ関数は、ハッシュ値の衝突の確率が極めて小さくなるように設計されており、これを衝突耐性と言います。</p><p>理想の衝突確率は、ハッシュ値のサイズの平方根で、それよりはよくできないとわかっています。</p><h4>1–2–7ビットコインにおける暗号学的ハッシュ関数の利用</h4><p>ビットコインは暗号学的ハッシュ関数を実に巧みに利用しています。例としては</p><ul><li>ビットコインアドレスは公開鍵のダイジェスト</li><li>ビットコインアドレスはチェックサムとしてハッシュ値の一部を利用</li><li>トランザクションの識別子はトランザクション群の内容への完全性の保証</li><li>ブロック内の情報や含まれるトランザクション群の内容への完全性の保証</li><li>ブロックの連鎖構造（ブロックチェーン）においてブロックの順序の保持、追加や欠如を不可能にするコミットメント</li><li>分岐可能性があるブロックチェーンの枝における選択した直前のブロックへのコミットメント</li><li>マイニング計算とそのコミットメント（HashCash法という）</li><li>トランザクション構成時に直前のトランザクションを参照するためのポインタ</li><li>マークル木というハッシュ値のポインタによる木構造を利用した、メンバー判定の効率化</li><li>探索者の検索対象に関するプライバシを守りながらブロック内のメンバーを探索するフィルタ（ブルームフィルタという）</li></ul><p>ビットコインでは、SHA-256とRIPEMD-160という2種類の暗号学的ハッシュ関数の標準を利用してます。</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/b7e17634abfed966c1c666c63e5735a0/href">https://medium.com/media/b7e17634abfed966c1c666c63e5735a0/href</a></iframe><h4>１-３公開鍵暗号</h4><p>暗号鍵を安全に相手に渡すかという鍵配送の方法として、公開鍵暗号がはい削されました。公開鍵暗号は、公開鍵と秘密鍵と呼ばれるペアになった2つの鍵を利用する暗号技術です。</p><p>代表的なものとして</p><ul><li>暗号鍵の交換</li><li>電子署名</li><li>電子認証</li></ul><p>それぞれ用途ごとに専用の公開鍵暗号技術があります。</p><h4>1-3-1公開鍵と秘密鍵</h4><p>公開鍵と秘密鍵はそれぞれ反対向きの計算を行うために使われます。</p><p>秘密鍵は、それを持っている人にしかできない固有の計算能力を締めるために使われます。</p><p>また、公開鍵はその秘密鍵を使った計算の結果を検証するために使います。</p><p>例としては、インターネットでの電子認証で、相手が信用出来ないとき、IDとPassでは危険です。なのでPassの代わりに自分だけができる固有の計算能力を示すことで本人であることを証明すればいいのです。例えば、サーバーがランダムなデータを自分の秘密鍵を使って計算を行い、その結果をサービス側に返します。サービス側はその人の公開鍵を使ってその計算結果を調べることによって本人確認ができます。</p><h4>1-3-2当事者の識別子としての公開鍵</h4><p>公開鍵暗号は、全ての当事者がそれぞれ自分の公開鍵と秘密鍵のペアを持っていることが前提になります。全ての当事者がそれぞれの自分の公開鍵と秘密鍵のペアを持っているという社会的な前提のことを公開鍵基盤（PKI）といいます。</p><p>ビットコインはSSL/TLSとは違って、PKIでは公開鍵証明書の中に本人の実名やTLSサーバのFQDNなど、実世界での実態を参照する情報が記載されていますが、ビットコインでは、現実世界の実存とは切り離されたビットコインアドレスを利用しています。</p><p>このような実態と切り離された名前のことは一般に仮名（pseudonym）と呼ばれ、積極的に実態の隠蔽を目的とする死喰いをそろえた名前である匿名（anonymity）とは区別されます。</p><h4>1-3-3電子署名</h4><p>電子署名の昨日は、電子的なメッセージに対して1.そのメッセージの作成者が誰か、2.そのメッセージが1ビットも改ざんされていないこと、の2つが証明できるようになります。</p><p>電子署名を作成する人のことを署名者と呼びます署名者は、メッセージと自分の秘密鍵を使った固有の計算を実行する事によって電子署名のデータを作成します。この計算を署名作成と言います。</p><p>この電子署名を利用して、メッセージの作成者の確認やメッセージの完全性を検証するのはそれを受け取った第三者です。これを署名検証者と呼びます。メッセージの電子署名に使用した秘密鍵と対になる公開鍵は、秘密鍵による計算と逆の計算をおこなる機能を持っています。この計算を署名検証と言います。</p><h4>２．ECDSA</h4><p>ビットコインでは、ECDSA（楕円曲線DSA）という電子署名のための公開鍵暗号技術が使われています。DSA（Desital Signature Algorithm）とは、標準化された電子署名を目的とする公開鍵暗号で、</p><p>ECDSAは、楕円曲線という数学を使ってDSAと同じ原理の公開鍵暗号を構成したものです。</p><p>ECDSAでは、電子署名の仮定で擬似乱数の生成が必要になります。この乱数が推定されると大事な秘密鍵がバレるといけない性質があり、なのでECDSAを使うときは必ず安全な擬似乱数を使わなければいけません。</p><p>ECDSAのアルゴリズムを実査に使用するときには、楕円曲線のパラメータの指定が必要です。ECDSAは、標準化の対象になっている電子署名アルゴリズムであり、楕円曲線のパラメータにも推奨される標準が存在します。ビットコインではsecp256k1というパラメータが利用されています。</p><p>OpenSSｌでは以下のように使います。</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/5880ef1a280c954ac0eec874770014f1/href">https://medium.com/media/5880ef1a280c954ac0eec874770014f1/href</a></iframe><p>ECDSAによる公開鍵暗号の基本暗号の基本機能は以下の3つです。</p><ul><li>暗号鍵生成</li><li>電子署名作成</li><li>電子署名検証</li></ul><p>ECDSA secp256k1の鍵のサイズや署名の入力メッセージのサイズ、署名のサイズは以下のとおりです。</p><ul><li>秘密鍵：256ビット</li><li>公開鍵（圧縮なし）：512ビット</li><li>公開鍵（圧縮あり）：257ビット</li><li>署名入力メッセージ：256ビット</li><li>署名：512ビット</li></ul><h4>２-１楕円曲線暗号</h4><p>ビットコインでは電子署名の為に楕円曲線暗号を利用していますが、ビットコインを拡張する様々な応用技術の中で、楕円曲線暗号を電子署名意外の用途にもりようする進化があります。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/392/1*Kd_bAPksphugDKRjGFJnVA.png" /><figcaption>引用：Wikipedia</figcaption></figure><h4>2-1-1楕円曲線上の離散対数問題</h4><p>楕円曲線がなぜ公開鍵暗号に利用できるのかのしくみは、簡単に言うと、公開鍵や傍受可能な通信内容から秘密鍵を計算できないということによっています。</p><p>現在のところ、多項式時間で計算方法が見つかっていないこと離散対数問題（DLP）といいます。代表的な公開鍵安東の1つであるディフティー・ヘルマン法でも利用されてます。</p><p>詳細は<a href="https://ja.wikipedia.org/wiki/%E9%9B%A2%E6%95%A3%E5%AF%BE%E6%95%B0">こちら</a>で。理解が第一なので、ここで数学的なことは説明しません。</p><h4>2-2-2楕円曲線のパラメータ</h4><p>楕円曲線あんごのパラメータは次のものです。</p><ul><li>基準点G（x座標,y座標）</li><li>余剰系の素数p</li><li>楕円曲線の係数aとb</li><li>Gの位数n(Gをスカラー倍していくことで得られる異なる点の総数)</li><li>（secp256k1の場合、楕円曲線のパラメータの値は次のようになります）</li><li>Gx=550662640227734366957871889516853426250603453777594175500187360360389116729240</li><li>Gy=326705100207588169780830851305074318447127338065243275938904335757337482424424</li><li>剰余系の素数p=2²⁵⁶-2³²-2⁹-2⁸-2⁷-2⁶-2⁴-1</li><li>楕円曲線の係数a=0, b=7 つまり y²=x³+7</li><li>Gの位数</li></ul><p>コードだと、</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/9b55c2e7546698b4a936eda82d98fd68/href">https://medium.com/media/9b55c2e7546698b4a936eda82d98fd68/href</a></iframe><h4>２-２ECDSAの暗号鍵の生成</h4><p>実際に自分の秘密鍵と公開鍵を生成していきます。</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/646086421064c99e77c9cd75f9e50afc/href">https://medium.com/media/646086421064c99e77c9cd75f9e50afc/href</a></iframe><p>ちなみにBitcoin-rubyを使ったECDSAの生成のコードは</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/d51dab7e295daa471ae9006d67fe731d/href">https://medium.com/media/d51dab7e295daa471ae9006d67fe731d/href</a></iframe><h4>２-３ECSDAによる電子署名</h4><p>メッセージへの電子署名を試してみましょう。</p><p>電子署名には、</p><ul><li>メッセージのダイジェストの作成</li><li>電子署名の作成</li><li>電子署名のエンコーディングとデコーディング</li><li>電子署名の検証</li></ul><p>があります。詳しく見ていきます。</p><h4>2-3-1署名者の公開鍵と秘密鍵の生成</h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/e28f55a107a53abafb05ca2845aa910a/href">https://medium.com/media/e28f55a107a53abafb05ca2845aa910a/href</a></iframe><h4>２-４ECSDAの決定性署名</h4><p>ECSDAによる電子署名への入力は、正確には4つです</p><ul><li>位数nのビット長をLnとしたとき、メッセージのダイジェストの上位Lnビットd</li><li>署名者の秘密鍵privKey</li><li>乱数k</li><li>楕円曲線のパラメータG, n</li></ul><p>また、ECDSAの電子署名の出力は、楕円曲線上の点（r,s）でした。そして電子署名を作成する処理は、次のような計算を行います</p><ul><li>楕円曲線上の点（x1, y1=kGを求める</li><li>r=x1mod(n)</li><li>k^-1mod(n)を求める</li><li>s=k^-1(d + r*privKey)</li></ul><p>ECDSAによる電子署名の度に必要となる乱数kは決して同じものを2度使ってはいけません。</p><p>ECDSAのkの運用方法を定めた電子署名をECDSAの決定性署名という</p><h4>３.ビットコインアドレス</h4><p>公開鍵暗号の主な用途は、</p><ul><li>暗号鍵の交換</li><li>電子認証</li><li>電子署名</li></ul><p>でしたが、</p><p>ビットコインの送金は原理的に送金先の公開鍵さえあれば可能です。</p><p>公開鍵の問題は、公開鍵の偽装です。</p><p>ビットコインで実際に送金先として利用されているのは公開鍵ではありません。実際の固有名は、ビットコインアドレスです。これは公開鍵と1対1で対応しているので、ビットコインアドレスと公開鍵の対応関係は公開鍵の正真性の検証をおこなう計算で確実に確認できます。</p><h4>３-１ビットコインアドレスの作成方法</h4><p>ビットコインアドレスを間違えると送金したお金が二度と取り戻すことができない。そのために、チェックサムとプレフィックスとbase58エンコーディングの利用です。</p><ul><li>バーション情報を表すプレフィックス</li><li>公開鍵から生成されるペイロード</li><li>内容の間違いを検出ためのチェックサム</li></ul><p>でビットコインアドレスはできています。</p><h4>３-２base58エンコーディング</h4><p>数字とアルファベットに記号の+と/と＝を使用する方法です。</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/ee1b316cd6ea4ba5b1615c514c1d683e/href">https://medium.com/media/ee1b316cd6ea4ba5b1615c514c1d683e/href</a></iframe><h4>３-３base58デコーディング</h4><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/87ac0057cace2bbe108e04487ad64f8a/href">https://medium.com/media/87ac0057cace2bbe108e04487ad64f8a/href</a></iframe><h4>３-４プレフィックス</h4><p>ビットコインアドレスの先頭の1バイトはバージョンや種別を表すために利用されます。ビットコインアドレスについての主なプレフィックスを下にまとめます</p><p>（ 種類 ｜ プレフィックス ｜ base58エンコーディング ）</p><ul><li>ビットコインアドレス (mainnet)| 0x00 | 1</li><li>ビットコインアドレス (testnet) | 0x6F | m or n</li><li>P2SHアドレス(mainnet) | 0x05 | 3</li><li>P2SHアドレス(testnet) | 0xC4 | 2</li></ul><h4>３-５チェックサム</h4><p>チェックサムは、入力されたアドレスに間違いが合った場合にそれを検出できるようにするための付加情報です。</p><p>ビットコインアドレスでは、512ビットの公開鍵に1バイトのプレフィックスをつけたものを入力してSHA256によるハッシュ値を2回繰り返した値の先頭の4バイトをチェックサムとして使用しています。</p><h4>３-６ペイロード</h4><p>ペイロードとは、データとしての実態のことです。通常のビットコインアドレスでは、公開鍵に対してSHA256を使ったハッシュ値をさらにRIPEMD160を使ってハッシュ値を求めたものがペイロードになります。</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/1bb7f0dea32d243328045fcf7f79fe9c/href">https://medium.com/media/1bb7f0dea32d243328045fcf7f79fe9c/href</a></iframe><h4>３-７Base58Checkエンコーディング</h4><p>プレフィックスとチェックサムで、全体をbase58でエンコードするデータ形式をBase58Checkエンコーディング形式と言います。</p><ul><li>任意のサイズの内容（payload）</li><li>先頭1バイトをアプリケーションもしくはバージョンの識別子を意味するプレフィックス</li><li>checksumは、sha256(sha256(prefix + payload))の先頭4バイト</li><li>データは、prefix + payload + checksum</li><li>Base58Checkは、データをbase58でエンコードしたもので模式的に書くといかのようになる</li></ul><pre>Base58Check = base58encode(prefix + payload + checksum)</pre><pre>base58_checksum?(base58data) # Base58Check形式の検査</pre><p>よもやま</p><p>・随時更新</p><p>・暗号とか無縁の文系大学生なので、少しスピードが遅いが、できなくはなさそう 好きかどうかは分からないけど、今のところ知らないことを知るって意味では楽しいが、3章までだとどうサービスに組み込むかまだわからないので、気合で何とかするｗ</p><p>※この記事は営利等を目的としたものではありません。ご指摘等ありましたら、迅速に対応致します。</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f494ef3fdde9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[第2のイーサリウム”Lisk” まとめ]]></title>
            <link>https://medium.com/@SEKAINOOKAZAWA/%E7%AC%AC2%E3%81%AE%E3%82%A4%E3%83%BC%E3%82%B5%E3%83%AA%E3%82%A6%E3%83%A0-lisk-%E3%81%BE%E3%81%A8%E3%82%81-d0ede455f569?source=rss-2f57c3ad8306------2</link>
            <guid isPermaLink="false">https://medium.com/p/d0ede455f569</guid>
            <category><![CDATA[lisk]]></category>
            <category><![CDATA[bitcoin]]></category>
            <category><![CDATA[まとめ]]></category>
            <category><![CDATA[blockchain]]></category>
            <dc:creator><![CDATA[Okazawa Ryusuke]]></dc:creator>
            <pubDate>Sat, 24 Feb 2018 05:56:38 GMT</pubDate>
            <atom:updated>2018-02-25T00:49:03.160Z</atom:updated>
            <content:encoded><![CDATA[<p>イーサリウムのスマートコントラクトを構築する際にかかる手数料”Das”がETHの価格上昇に伴って上昇していき、開発側のコストが上がるかもしれないという懸念がある中、Microsoftとの提携でも話題となり、3日前にはリブランディングを終え、今後の伸びが期待されるLisk。</p><p>今回は、Liskを勉強し始めたので、情報をまとめていきます。随時追加します。</p><p>若輩者ゆえ、間違った点等ございましたらご指摘ください。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*zycYc5kOT8tCM3zwcPnqLw.png" /><figcaption>Lisk HP</figcaption></figure><h3>Liskの特徴</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jlwpEA_513LRl70lLEVzkQ.png" /></figure><p>そもそもLiskとは、</p><blockquote>スマートコントラクトやDApps（分散型アプリケーション）構築のプラットフォームを掲げたプロジェクト。</blockquote><p>らしいです。よくわかりませんね… 詳しく見ていきます。</p><p>特徴としては大きく4つ</p><p>・<strong>Microsoft Azureとの連携</strong></p><p>Microsoftの法人向けクラウドサービスのMicrosoft Azureと近年提携を結び、影響力を高めています。</p><p>・<strong>javascriptでかける</strong></p><p>イーサリアムはスマートコントラクトの記述にSolidityという独自の言語を採用しているため、開発しづらいが、Liskはjavascript を採用しており容易に実装可能です。</p><p><strong>・Vote報酬（フォージング）</strong></p><p>Liskにはフォージング（鍛造）というシステムがあります。Liskでは101人の代表者のみがマイニングをすることができます。ランキングは私たちのようなパブリックのVOTE（投票）から決まります。フォージングに成功するとLISKをただで貰えるのでマイナーは上位を狙います。<br>私たち一般ピーポーはこの投票に対する見返りとして少量のLiskを分けてもらえるという仕組みがあります。投票に関する情報はこちらのサイトで見ることができます。</p><p><a href="https://lisk.builders/?p=/votemanager/">lisk.builders - Making Lisk better Block by Block!</a></p><p><strong>・サイドチェーン</strong></p><p>サイドチェーンとは、</p><blockquote>あるブロックチェーンの拡張を行う際にメインのブロックチェーンを構築した上でスマートコントラクトを記録し、「サイドチェーン」としてメインのブロックチェーンと接続する。</blockquote><p>そもそも、スマートコントラクトとは、「ある条件が満たされた場合に、決められた処理が自動的に実行されること」であり、スマートコントラクトといえば、イーサリウムが有名ですが、Liskとイーサリウムの違いは「サイドチェーン」にあります。</p><h4>イーサリアムとLiskの違い（サイドチェーン）</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*NvBR8SE_TshK9EQQ2nBcnA.png" /></figure><p><strong>イーサリウム</strong>は、</p><p><em>イーサリアムのメインのブロックチェーン上に全てのスマートコントラクトを記述してDAppsを構築します。そのため、DAppsを構築するとき、DeveloperはDAppsごとに新たなブロックチェーンを構築した上でスマートコントラクトを記録し、サイドチェーンとしてメインのブロックチェーンと接続します。</em></p><p>一方、</p><p><strong>Lisk</strong>は、</p><p><em>1つのブロックチェーン上に全てのDAppsを構築するのではなく、DAppsごとにサイドチェーンを構築します。</em></p><p><em>また、サイドチェーンはメインのブロックチェーンとは独立したブロックチェーンであるので、</em></p><p><strong><em>DApps開発者がサイドチェーンとなるブロックチェーンを構築する際、取引記録の記録者とその承認者を新たに設定することが可能</em></strong><em>です。<br>DApps開発者が承認者を選ぶことができるため、Liskにおけるサイドチェーンは</em><strong><em>プライベートチェーンに近い</em></strong><em>と言うこともできるでしょう。将来的には</em><strong><em>コンセンサスアルゴリズム</em></strong><em>の設定も自由に可能にする予定で、ビットコインのような</em><strong><em>プルーフ・オブ・ワーク</em></strong><em>や、</em><strong><em>プルーフ・オブ・ステーク</em></strong><em>を導入した</em><strong><em>パブリックチェーン</em></strong><em>を作ることも可能になるとのことです。</em></p><h3>Liskのメリット（拡張性と柔軟性）</h3><p>サイドチェーンのメリットは、スケーラビリティと柔軟性です。</p><p>サイドチェーンごとにスマートコントラクトを実行しているため、1つのブロックチェーン上で<strong>複数のDAppsを実行するより負荷を軽減</strong>でき、<strong>拡張性</strong>が生まれます。</p><p>また、それぞれのスマートコントラクトは各サイドチェーン上に記録されているため、DApps開発者による<strong>コードの変更が容易</strong>にでき、<strong>柔軟性</strong>があります。</p><h4>デメリット（中央集権的になる可能性がある）</h4><p>Liskではマイニング（取引の記録作業）をフォージング、記録承認者をdelegateと呼びます。</p><p>サイドチェーンは、メインのブロックチェーンとは独立したブロックチェーンであるため、開発者が取引記録者（フォージング）と記録承認者（delegate）を設定することができ、フォージングを行う人数を減らすことで、<strong>中央集権的</strong>に管理できてしまいます。</p><p>また、開発者がサイドチェーンを構築する際に承認者を設定できる一方で、メインのチェーンとは別に承認者を新たに設定する必要性があるという手間もあります。サイドチェーンの承認者（delegate）の数が少ない場合にはブロックチェーンの<strong>フォークが簡単に起きてしまうため、攻撃を受けやすくなってしまい</strong>安全性の担保が疎かになる可能性があります。</p><h4>Lisk最新情報</h4><p>3日前（2018/02/20）にリブランディングしてろごやWebサイトを一新して、コアをアップデートしたそうです。CEOも広報に力を入れているようです。</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FWMvmIR6MJDg%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DWMvmIR6MJDg&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FWMvmIR6MJDg%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/37e7d137175b4384383ed00b1a071b52/href">https://medium.com/media/37e7d137175b4384383ed00b1a071b52/href</a></iframe><p>リブランディングイベントでは、ロードマップにおける重要なマイルストーンであり、以下の発表があったそうです。</p><blockquote>ブランドロゴの新デザイン発表</blockquote><blockquote>WEBページのリニューアル</blockquote><blockquote>Liskアカデミーの公式発表</blockquote><blockquote>Lisk Hubの新機能としてLisk IDの紹介</blockquote><blockquote>トランザクションに伴う手数料の改善</blockquote><blockquote>Lisk Core1.0のβ版リリースを今後4～6週間以内であると発表</blockquote><p>正式なプレスは以下公式サイトで。</p><p><a href="https://lisk.io/events/lisk-relaunch">Lisk Relaunch | Lisk</a></p><p>2018年4月にアプリ開発ツールであるSDKの配布が行われ、Liskがいよいよ本格的に動き出すようです。秋には、ブロック報酬減少を控え、発行枚数を減らしていくので、1枚あたりの希少性を高めていきます。</p><h4>Liskアカデミー</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*t5TMR8zBS65J0Gk-R4tWOQ.png" /></figure><p>Liskアカデミーとは、ブロックチェーンの開発経験がない人向けの体系的なマニュアルや動画ガイドによって、ユーザーに簡単さを提供いくというもの。</p><p>Liskアカデミーは2つコースがあります。</p><ol><li>ブロックチェーン初心者コース：ブロックチェーンの基本的な価値や技術、使用事例を4項に分けて学習</li><li>ビジネスコース：ビジネスにおける具体的な使用事例から、応用、仮想通貨、ICOを4項に分けて学習</li></ol><p>見た感じBiz向けで、Dev向けではないが、一読する価値はありますね。英語も初心者なので私はさらっと（大体、すでに言われてることなので再確認程度に）</p><p><a href="https://lisk.io/academy">Welcome to the Lisk Academy | Lisk</a></p><h4>リンクまとめ</h4><ul><li>公式HP</li></ul><p><a href="https://lisk.io/">Lisk | Blockchain Application Platform</a></p><p>・Documentation</p><p><a href="https://lisk.io/documentation">Welcome | Lisk</a></p><p>・Medium(Blog) <a href="https://medium.com/u/10e6fc2226d1">Lisk</a></p><p><a href="https://blog.lisk.io/">Lisk Blog</a></p><p>・Lisk Nano(wallet)</p><p><a href="https://lisk.io/products">Products | Lisk</a></p><p>・Github</p><p><a href="https://github.com/LiskHQ/lisk">LiskHQ/lisk</a></p><p>・Youtube</p><p><a href="https://www.youtube.com/channel/UCuqpGfg_bOQ8Ja4pj811PWg">Lisk</a></p><p>・Twitter</p><p><a href="https://twitter.com/liskhq?lang=en">Lisk (@LiskHQ) | Twitter</a></p><p>今回は、文系的な情報収集のみでしたが、今後はDev的なことを書いていきます。</p><p><a href="https://coinchoice.net/forging_list/">LISKの鍛造（＝マイニング）に挑戦！｜CoinChoice</a></p><p>こういう記事とか？もっと技術者向けに情報をまとめていきます。</p><p>Liskは日本語だと情報少ないですが、チャンスだと思ってます。伸びしろですねぇ（）</p><p>・よもやま</p><p>JS使ってるだけあって、リブランディングしたサイトのアニメーションが素晴らしくぬるぬる動きます。私もこんなサイト作れるようになりたい。</p><p>※この記事は以下の<a href="http://businessblockchain.org/about-cryptocurrency-lisk">サイト</a>を参考にいたしました。利益など目的を書いたものではございません。</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=d0ede455f569" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[今まで謎に包まれたMagic Leapが初プロダクト「ホログラムとコンピュータを備えたデバイス」を公開！発表から1時間後の情報まとめ。]]></title>
            <link>https://medium.com/@SEKAINOOKAZAWA/%E4%BB%8A%E3%81%BE%E3%81%A7%E8%AC%8E%E3%81%AB%E5%8C%85%E3%81%BE%E3%82%8C%E3%81%9Fmagic-leap%E3%81%8C%E5%88%9D%E3%83%97%E3%83%AD%E3%83%80%E3%82%AF%E3%83%88-%E3%83%9B%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%A8%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%92%E5%82%99%E3%81%88%E3%81%9F%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9-%E3%82%92%E5%85%AC%E9%96%8B-%E7%99%BA%E8%A1%A8%E3%81%8B%E3%82%891%E6%99%82%E9%96%93%E5%BE%8C%E3%81%AE%E6%83%85%E5%A0%B1%E3%81%BE%E3%81%A8%E3%82%81-e8b485665ca7?source=rss-2f57c3ad8306------2</link>
            <guid isPermaLink="false">https://medium.com/p/e8b485665ca7</guid>
            <dc:creator><![CDATA[Okazawa Ryusuke]]></dc:creator>
            <pubDate>Wed, 20 Dec 2017 15:54:20 GMT</pubDate>
            <atom:updated>2017-12-20T15:57:49.602Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/759/1*8fpXeh1UKcad8sKIv1xr6w.png" /><figcaption>“ホログラムとコンピュータを備えたデバイス” Salvador Dali ｜<a href="https://www.rollingstone.com/glixel/features/lightwear-introducing-magic-leaps-mixed-reality-goggles-w514479">Rolling Stone</a></figcaption></figure><p>個人的にもっとも注目していたARスタートアップ”Magic Leap”</p><p>公式なプロダクトをまだ出していないが、GoogleやAlibabaから19億ドルの資金調達を受ける謎の多い企業でしたが、1時間前に公式Twitterで初となるプロダクトの公開がされました。</p><p>XRに全く詳しくなく、翻訳を載せるだけの形とします。<br>また、スピード感がほしかったのでアメリカ語が得意ではないので、Google翻訳です。営利目的ではありません。著作権等の問題により、数日で削除致します（12/21 1:00現在）。ご了承ください。</p><h3>Magic Leap on Twitter</h3><p>World, meet Magic Leap One. Magic Leap One, meet the world. More at: https://t.co/LbHY82tYUC https://t.co/2iXgyPs21K</p><h4>Rolling Stone</h4><p>・機能</p><blockquote>頭の周りに体重を均等に分配する</blockquote><p>場所にゴーグルを保持するヘッドバンドは「クラウンテンプル」デザインを使用しています。「それはあなたの頭の周りに体重を均等に分配する方法に関する私たちの研究から来た」<br>クラウンは、左、右、後ろの部分に広がる。その後、ヘッドバンドのように頭の上にスライドさせます。2本の短いケーブルがヘッドバンドの後ろから出て1本に合流し、4〜5フィートをシステムのLightpackに差し込みます。Lightpackは2つの丸いポッドを片方の端にスムーズに接続して、両者の間に隙間を形成します。</p><blockquote>コンピュータビジョン処理を行い、機械学習機能を備えたリアルタイムコンピュータである</blockquote><p>それは強力なCPUとGPUを持っています。それはドライブ、WiFi、あらゆる種類のエレクトロニクスを持っているので、それは自分自身の上に折り畳まれたコンピュータのようなものです。</p><blockquote>ゴーグルはあなたがそれらを身につけていることをほとんど忘れてしまうほど快適</blockquote><p>エッジがぼやけるオプションがあるため、画像が停止して脳が自然に隙間を埋めるような過酷な酔いはないでしょう。</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FOLtDeonCAYE%3Ffeature%3Doembed&amp;url=http%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DOLtDeonCAYE&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FOLtDeonCAYE%2Fhqdefault.jpg&amp;key=d04bfffea46d4aeda930ec88cc64b87c&amp;type=text%2Fhtml&amp;schema=youtube" width="640" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/9209b5c50a7f51354f43a7db420b5f6c/href">https://medium.com/media/9209b5c50a7f51354f43a7db420b5f6c/href</a></iframe><p>・Vision</p><blockquote>長時間使用していることに気付く不快感でした。「私たちの目標は、最終的に世界中の多くの人々が毎日いつでもどこでも使えるような特別なコンピューティングを構築することです」とAbovtiz氏は私に語ります。</blockquote><p>参考リンク：</p><p><a href="https://www.rollingstone.com/glixel/features/lightwear-introducing-magic-leaps-mixed-reality-goggles-w514479">Magic Leap: Founder of Secretive Start-Up Unveils Mixed-Reality Goggles</a></p><h4>Moguraさんの翻訳</h4><p><a href="http://www.moguravr.com/magic-leap-one-creators/">「Magic Leap One」ついにデザインが公開 眼鏡型のARデバイス | Mogura VR</a></p><p>正式な発表は個人ブログでは扱いませんので、今後はMoguraVRさんをチェック！</p><h4>MIT Technology Review</h4><p><a href="https://www.technologyreview.com/s/609821/magic-leap-says-it-will-release-its-ar-headset-next-year/">Magic Leap says it will release its AR headset next year, but offers no price or release date.</a></p><blockquote>iPhoneやAndroid搭載スマートフォン用のARツールを使用</blockquote><blockquote>ヘッドセットが頭の姿勢と目の位置を追跡する</blockquote><blockquote>ユーザーが音声とジェスチャーを使ってMagic Leap Oneと対話できる</blockquote><h4>engadget</h4><p><a href="https://www.engadget.com/2017/12/20/this-is-magic-leap-s-mixed-reality-headset/">This is Magic Leap&#39;s mixed reality headset</a></p><h4>CNBC</h4><p><a href="https://www.cnbc.com/2017/12/20/magic-leap-reveals-its-first-product.html">Magic Leap has finally revealed its first major product, a mixed-reality headset</a></p><blockquote>Magic Leapは、ハイエンドの複合現実感デバイスである<a href="https://www.cnbc.com/quotes/?symbol=MSFT">Microsoftの</a><a href="https://www.microsoft.com/en-us/hololens/buy">HoloLens</a>と比較して、市場参入が比較的遅い。しかし、マジック・リープの前回のデモン​​ストレーションが特殊効果で飾られているという主張にもかかわらず、同社の支援者はスタートアップの堅固な擁護者だった</blockquote><h4>THE VERGE</h4><p><a href="https://www.theverge.com/2017/12/20/16800474/magic-leap-one-creator-edition-augmented-reality-goggles-announce">Magic Leap finally unveils augmented reality goggles, says it&#39;s shipping next year</a></p><blockquote>「音声、ジェスチャー、頭部ポーズ、目の追跡などの複数の入力モード」を受け入れ、永続オブジェクトを環境にマッピングします</blockquote><blockquote>マジック・リープが技術を縮小してゴーグル・サイズにするのが難しい<a href="https://www.theinformation.com/the-reality-behind-magic-leap">という噂</a>を反論しているようだ。「パフォーマンスを巡り歩いても遠く離れていても、吃音や減速はない」と言っている。</blockquote><p>これは人々が何年も熟考した技術の、公然とアクセス可能な実例を提供するMagic Leapの始まりです</p><h4>variety</h4><p><a href="http://variety.com/2017/digital/news/magic-leap-ar-headset-2018-ship-date-1202646174/">Magic Leap Reveals AR Headset First-Look Images, Sets 2018 Ship Date</a></p><blockquote>マジック・リープ・ワン・ヘッドセットには、表面、飛行機、および物体を検出するセンサーが含まれているため、「物理的な環境をデジタルで再構築できる」</blockquote><h4>ROAD TO VR</h4><p><a href="https://www.roadtovr.com/magic-leap-finally-unveils-first-ar-product-magic-leap-one-shipping-starts-2018/">Magic Leap Finally Unveils its First AR Product &#39;Magic Leap One&#39;, Shipping Starts in 2018</a></p><h4>Producthunt</h4><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fcards.producthunt.com%2Fcards%2Fposts%2F116210%3Fv%3D1&amp;url=https%3A%2F%2Fwww.producthunt.com%2Fposts%2Fmagic-leap-one-2&amp;image=https%3A%2F%2Fph-files.imgix.net%2Fcec0befa-5c00-49ac-a158-1014a0309960%3Fauto%3Dformat%26fit%3Dmax%26h%3D405%26w%3D500&amp;key=d04bfffea46d4aeda930ec88cc64b87c&amp;type=text%2Fhtml&amp;schema=producthunt" width="500" height="405" frameborder="0" scrolling="no"><a href="https://medium.com/media/6888558601cce8cec6d2c7626e3ec599/href">https://medium.com/media/6888558601cce8cec6d2c7626e3ec599/href</a></iframe><blockquote>Magic Leap Creator Editionは、スーパーステルスARから明らかになった最初の製品です。Creator Editionには、ヘッドセット、ライトパック、およびコントロールが含まれています。</blockquote><h3>個人的まとめ</h3><ul><li>機械学習（画像認識）もできるんかい</li><li>デザインの賛否両論は置いといて、近未来感あって私は好きですよ</li><li>エンジニアじゃなくても「興味あり」でメルマガ登録できるので、みなさんもぜひ</li><li>値段が気になる！ホロレンズがexpensiveだったので、買えるか不安です</li><li>SAO劇場版の世界があと3年で実現すると思う</li></ul><p>※削除要請等あれば、ご連絡ください。迅速に対応致します。</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e8b485665ca7" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[初心者でも分かるKaggleチュートリアル]]></title>
            <link>https://medium.com/@SEKAINOOKAZAWA/kaggle-5f717b5cdd41?source=rss-2f57c3ad8306------2</link>
            <guid isPermaLink="false">https://medium.com/p/5f717b5cdd41</guid>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[tutoria]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[kaggle]]></category>
            <dc:creator><![CDATA[Okazawa Ryusuke]]></dc:creator>
            <pubDate>Sat, 04 Nov 2017 09:52:08 GMT</pubDate>
            <atom:updated>2017-11-05T06:23:22.268Z</atom:updated>
            <content:encoded><![CDATA[<p>Kaggleを初めてやってみました。Submit（回答を提出）して、数秒、結果を待ちぱっとランキングがでてきた瞬間の達成感（何も考えてはいないが）はすてきでした。少しだけ紹介します。</p><p>なお、以下のリンクを参考にさせて頂きました。</p><p><a href="https://qiita.com/taka4sato/items/802c494fdebeaa7f43b7">Kaggle事始め - Qiita</a></p><h4>流れ</h4><ol><li>Kaggleのアカウントを作成する</li><li>CompetitionからTaitanicを選び、Get the data から train.csvとtest.csvをダウンロードする</li><li>問題を理解して、どうやって解析するか考える</li><li>Pythonでコードを書いて、実際にDatasetを処理し、最後にSubmit用のDataを作成する</li><li>Submitして順位とScoreを見る(完了)</li></ol><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/396dece7bdcc0a29de77b969ad80736a/href">https://medium.com/media/396dece7bdcc0a29de77b969ad80736a/href</a></iframe><h4>参考リンク</h4><ul><li><a href="https://github.com/Kaggle/docker-python">Kaggle/docker-python</a></li><li><a href="https://www.wantedly.com/companies/jenio/post_articles/80531">KaggleのCTOが教えてくれた&quot;AIエンジニアに超オススメな8つの学習ステップ&quot; | Jenio Inc. HR Blog</a></li><li><a href="https://lp-tech.net/articles/0QUUd">KaggleチュートリアルTitanicで上位3%以内に入るには。(0.82297)</a></li><li><a href="http://futurismo.biz/archives/6744">Kaggleをはじめたので対策や攻略法についてのブックマーク | Futurismo</a></li><li><a href="https://www.cresco.co.jp/blog/entry/2597/">Kaggleに初めて投稿してみた</a></li><li><a href="https://adtech.cyberagent.io/techblog/archives/259">Kaggleゼミ成果報告（Rossmann編）</a></li><li><a href="http://kamonohashiperry.com/archives/1054">Kaggleで使われた特徴量エンジニアリングとアルゴリズムまとめ</a></li></ul><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.slideshare.net%2Fslideshow%2Fembed_code%2Fkey%2Fde5lrPgAUw2bri&amp;url=https%3A%2F%2Fwww.slideshare.net%2Fyasunoriozaki12%2Fkaggle-79541118&amp;image=https%3A%2F%2Fcdn.slidesharecdn.com%2Fss_thumbnails%2Fkaggle-170907232648-thumbnail-4.jpg%3Fcb%3D1504827024&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=slideshare" width="600" height="500" frameborder="0" scrolling="no"><a href="https://medium.com/media/93df8eacc4f4dedeba2bdcbdf306fa2d/href">https://medium.com/media/93df8eacc4f4dedeba2bdcbdf306fa2d/href</a></iframe><ul><li><a href="http://www.mirandora.com/?p=1804">Kaggleのtitanic問題で上位10%に入るまでのデータ解析と所感 - mirandora.com</a></li><li><a href="http://threeprogramming.lolipop.jp/blog/?p=1077">threecourse&#39;s memo</a></li><li><a href="https://qiita.com/shu_marubo/items/30999ca601fb6e8b1139">『データサイエンティストとマシンラーニングエンジニアはKaggleやれ』というのは何故なのか - Qiita</a></li><li><a href="https://qiita.com/KIKUYA-Takumi/items/13ac849582318f559271">データサイエンティストを目指して勉強するなら、Kaggleからはじめよう - Qiita</a></li><li><a href="https://elitedatascience.com/beginner-kaggle">The Beginner&#39;s Guide to Kaggle</a></li><li><a href="https://qiita.com/TomHortons/items/54b2121a4c5eb0908920">Kaggleのコンペティションリスト(随時更新) - Qiita</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5f717b5cdd41" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[”仕事で始める機械学習”の要点をまとめてみたらとても良い入門書だった]]></title>
            <link>https://medium.com/@SEKAINOOKAZAWA/%E4%BB%95%E4%BA%8B%E3%81%A7%E5%A7%8B%E3%82%81%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E3%81%AE%E8%A6%81%E7%82%B9%E3%82%92%E3%81%BE%E3%81%A8%E3%82%81%E3%81%A6%E3%81%BF%E3%81%9F%E3%82%89%E3%81%A8%E3%81%A6%E3%82%82%E8%89%AF%E3%81%84%E5%85%A5%E9%96%80%E6%9B%B8%E3%81%A0%E3%81%A3%E3%81%9F-7c74f4f2b5af?source=rss-2f57c3ad8306------2</link>
            <guid isPermaLink="false">https://medium.com/p/7c74f4f2b5af</guid>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[deep-learning]]></category>
            <dc:creator><![CDATA[Okazawa Ryusuke]]></dc:creator>
            <pubDate>Fri, 27 Oct 2017 15:29:06 GMT</pubDate>
            <atom:updated>2017-10-31T07:19:01.043Z</atom:updated>
            <content:encoded><![CDATA[<p>最近、販売された仕事で始める機械学習を買ったので、購入を考えられている方や機械学習を始めたいと思っている方に読んで、参考になればと思います。</p><h4>この記事の目的と全体の流れ</h4><p>ただ読むのと、アウトプット（ブログに書く）前提で読むのとはインプットの質が違うということがわかったので、ブログに書きながら理解していく形を取ります。</p><p>全体の流れとしては、章の要約。あぁこの内容知ってるなって人は買わずに済むし、わからないこと多いという人は購入を検討して頂ければ。（出版関係者でもなければ、アフィリエイトなどの営利目的でもなく、いち消費者としての個人的意見になります。 ご了承ください。）</p><h4>結論から言うと（書評）</h4><p>いままでのオライリーのデータサイエンス本だと英語から翻訳したのでわかりにくい日本語が非常にうっとうしいのですが、<br>この本は、日本の方が書かれており、日本語スムーズに理解できます。</p><p>また、非常に論理立てられて書かれてあるので、めちゃスムーズに頭に入ってきます。誰にでも（ML初めて見る人を除く）わかるようにかかれており機械学習初心者には最高の一冊です。</p><p>ほめるだけなのはあれなので、1つはわかりやすく説明するイコール専門性は他の参考書で学習してください形式なので中級者にはもの足りないかもしれません。あと、コードがあまりでてきません。ビジネス書としても捉れるかも。</p><p>レベルについて、本の中で書かれているのは、CourseraのMachine Learningコースを受けたり、ゼロから作るDeep Learningを読んだあとの2冊目として読んでいただければと書かれていますので、自分のレベル感とはマッチしてました。</p><p>この本で扱っている内容は、正式にはこう書かれています。</p><blockquote>本書では、機械学習やデータ分析の道具をどのようにビジネスに生かしていけば良いのか、また不確実性が高いと言われている機械学習プロジェクトの進め方について 整理しています。 <br>本書はもともと、機械学習の初学者向けに書いた文章からはじまりました。入門者のために書きはじ めたのですが、実際には理論を軽めにしたソフトウェアエンジニア向けの実践的なカタログのような形 になっています。 アルゴリズムの話などは他の書籍でも数多く取り上げられているので、本書ではプロジェクトのはじ め方や、システム構成、学習のためのリソースの収集方法など、読者が「実際どうするの？」と気にな るであろう点を中心にしています。</blockquote><p>機械学習を現場でどう使っていくかの道筋がわかる1冊となっています（個人的に）</p><h4>目次</h4><p>では、この流れで見ていきます<br>（）内にはその章のひとことでまとめた表現を入れています。</p><ol><li>機械学習プロジェクトのはじめ方（実際のプロジェクトの進め方）</li><li>機械学習で何ができるか（アルゴリズム紹介）</li><li>学習結果を評価しよう（アルゴリズムごとの評価の仕方）</li><li>システムに機械学習を組み込む（実装前のシステム設計の仕方）</li><li>学習のためのリソースを収集しよう（データセットの使い方）</li><li>効果検証（検証・検定・ABテスト より実務的（ビジネス的））</li></ol><p>ここまでの理論ベースが第1章となっています。第2章（7.映画の推薦システムを作る、8.Kickstarterの分析、機械学習を使わないという選択肢、9.Uplift Modelingによるマーケティング資源の効率化）は実際に機械学習システムを作りながら解説する内容となっており、実践も基礎も学べる非常に優れた技術書だと思います。</p><p>以下、ほとんど丸写しのように見えますが、わかりやすさ重視のため、引用させていただきました。（営利目的ではありません）</p><h3>機械学習プロジェクトのはじめ方</h3><p>機械学習は普通のソフトウェア開発より手戻りが発生する場合が多いです。ですので、ポイントを抑えることが大事です。</p><h4>機械学習プロジェクトの流れ</h4><p>実際の機械学習は以下のように進めていきます。</p><ol><li>問題を形式化する</li><li>機械学習をしないで良い方法を考える</li><li>システム設計を考え</li><li>アルゴリズムを選定する</li><li>特徴量、教師データとログの設計をする</li><li>前処理を行う</li><li>学習・パラメータチューニング</li><li>システムに組み込む</li></ol><p>もっと大まかにすると、<br>①解きたい課題を機械学習で解ける問題設定に落とし込む（1,2）</p><p>②解くための道具選びと前処理（3,4,5,6）</p><p>③モデルの作成（7）</p><p>④サービスへの組み込み（8）</p><p>特に最初の2つの課題設定と前処理が重要です。</p><p>機械学習のシステム開発は、実際には試行錯誤を繰り返す作業になりま す。特に、上記の4から7は試してみては変更して、という作業を何度も繰り返すことにな</p><p>まずは、「機械学習でこういう課題を解決した」という事例を見た時に、「どういったアルゴリズムで 解決したか」「どのようなデータを特徴量として使っているか」「機械学習部分をどのように組み込んで いるか」ということを意識して調べると良いでしょう。</p><h4>実システムにおける機械学習の問題点への対処法</h4><p>予測性能のみを追い求めてモデルの苦心が難しくなりやすく、システムの複雑性が上がってメンテナンス性が低下しがちであり、変化に追従しづらいといえます。</p><p>この問題には、以下のポイントが重要です。</p><p>・ 人手でゴールドスタンダードを用意して、予測性能モニタリングをする（1,2,4）</p><p>・ 予測モデルをモジュール化してアルゴリズムのABテストが出来るようになる（2）</p><p>・ モデルのバージョン管理をして、いつでも切り戻し可能にする（4,5）</p><p>・ データ処理のパイプリアンごとに保存する（3,5）</p><p>・ 開発/本番環境の言語/フレームワークは揃える（6）</p><h4>機械学習を含めたシステムを成功させるには</h4><p>機械学習のプロダクトをビジネスとして成功させるには以下の4者が重要になります。</p><ol><li>プロダクトに関するドメイン知識を持った人</li><li>統計や機械学習に明るい人</li><li>データ分析基盤を作れるエンジニアリング能力のある人</li><li>失敗してもかまわないとリスクをとってくれる責任者</li></ol><p>わかりやすいスライドがありました。</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.slideshare.net%2Fslideshow%2Fembed_code%2Fkey%2FNOcXqe9V5RGlQJ&amp;url=https%3A%2F%2Fwww.slideshare.net%2FTokorotenNakayama%2F2016-devsumi&amp;image=https%3A%2F%2Fcdn.slidesharecdn.com%2Fss_thumbnails%2Fdevsummittokoroten2016-160222070049-thumbnail-4.jpg%3Fcb%3D1456127693&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=slideshare" width="600" height="500" frameborder="0" scrolling="no"><a href="https://medium.com/media/fb4f76bb926729e095dab2ba6f36e279/href">https://medium.com/media/fb4f76bb926729e095dab2ba6f36e279/href</a></iframe><h4>機械学習プロジェクトの進め方と流れのまとめ</h4><p>・解くべき問題の仮説を立て、MVPを作りコンセプトの検証を最優先する</p><p>・機械学習しないことを恐れない</p><p>・機械学習に適している問題設定かを見極める</p><p>・予測性能とKPIの両方のモニタリングし、継続してカイゼンを続ける</p><h4>どのアルゴリズムを選ぶべきか</h4><p>大まかに特徴を抑えたいと思います。</p><p><strong>分類</strong></p><p>正解となる離散的なカテゴリ（クラス）と入力データの組み合わせで学習し、未知のデータからクラスを予測する</p><p><strong>回帰</strong></p><p>正解となる数値の入力データの組み合わせで学習し、未知のデータから連続値を予測する</p><p><strong>クラスタリング</strong></p><p>データを何かしたの基準でグルーピングする</p><p><strong>次元削減</strong></p><p>高次元のデータを可視化や計算量削減などのために低次元にマッピングする</p><p><strong>その他</strong></p><p><strong>推薦</strong></p><p>ユーザが好みそうなアイテムや、閲覧しているアイテムに類似しているアイテムを提示する</p><p><strong>異常検知</strong></p><p>不審なアクセスなど普段とは違う挙動を検知する</p><p><strong>頻出パターンマイニング</strong></p><p>データ中に高頻度に出現するパターンを抽出する</p><p><strong>強化学習</strong></p><p>囲碁や将棋のような局所的いは正解が不明瞭な環境で、とるべき行動の方針を学習する</p><p>どれを使うか迷ったときは<a href="http://scikit-learn.org/stable/tutorial/machine_learning_map/">Scikit-learn</a>のサイトのフローチャートを使います</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*sFryufkpYhDy2deQ33vneA.png" /><figcaption><a href="http://scikit-learn.org/stable/tutorial/machine_learning_map/">http://scikit-learn.org/stable/tutorial/machine_learning_map/</a></figcaption></figure><h4>分類</h4><p>分類は教師あり学習の1つで、予測対象はカテゴリなどです。例えば、メールがスパムかどうかや画像にどんな物体が写っているかなどのりサン地で狂言できるものを予測する場合に分類のモデルを作ります。有名なアルゴリズムは以下があります。</p><ul><li>パーセプトロン</li><li>ロジステック回帰（Logistic Regression）</li><li>SVM(Support Vector Machine)</li><li>ニューラルネットワーク</li><li>k-NN(k-Nearest Neighbor Method)</li><li>決定木（Decision Tree）</li><li>GBDT(Gradient Boost Decision Tree)</li></ul><h4>回帰</h4><p>回帰は、教師あり学習の1つで、ある入力データから連続地を予測します。例えば、電力消費量やWebサイトのアクセス数など、連続地で表現できる値を予測したい場合にモデルを学習します。回帰の各アルゴリズムについて見ていきます。</p><ul><li>線形回帰、多項式回帰</li><li>Lasso回帰、Ridge回帰、Elastic Net</li><li>回帰木</li><li>SVR（Support Vector Regression）</li></ul><h4>クラスタリング</h4><p>クラスタリングとは教師なし学習の1つで、主にデータの傾向をつかむために使われます。</p><ul><li>k-meansはシンプルにデータの傾向を見ることんよく使われます</li><li>階層的クラスタリング</li><li>次元削減（手法として、主成分分析（PCA）・最近ではt-SNEも人気）</li></ul><h4>その他</h4><ul><li>推薦</li><li>異常検知</li><li>頻出パターンマイニング</li><li>強化学習</li></ul><h3>学習結果を評価する</h3><p>システムに機械学習を組み込んだときに、最初から満足できる結果が出ることはまれです。満足できる結果かどうかをどうやって図るかの評価方法について説明します。</p><h4>分類の評価</h4><p>例として、スパム分類をとり、4つの指標を見ていきます。</p><ul><li>正解率（Accuracy）</li><li>適合率（Precision）</li><li>再現率（Recall）</li><li>F値（F-measure）</li></ul><p>また、これらを考える上で重要な3つの概念を見ます。</p><ul><li>混同行列（Confusion Matrix）</li><li>マイクロ平均、マクロ平均</li></ul><h4>回帰の評価</h4><ul><li>平均二乗和誤差</li><li>決定係数</li></ul><p>機械学習を組み込んだシステムのA/Bテスト</p><h3>システムに機械学習を組み込む</h3><h4>システムを機械学習に含める流れ</h4><ol><li>問題を定式化する</li><li>機械学習をしないでいい方法を考える</li><li>システム設計・誤りをカバーする方法を考える</li><li>アルゴリズムを選定する</li><li>特徴量、教師データとログの設計をする</li><li>前処理をする</li><li>学習・パラメータチューニング</li><li>システムに組み込む</li></ol><p>この中でも「システム設計」「ログ設計」について述べます</p><h4>システム設計</h4><p>今回は最も使われる教師あり学習について述べます。分類や回帰の場合、学習と予測の2つのフェーズがあります。さらに学習のタイミングに酔って、バッチ処理での学習とリアルタイム処理での学習という二種類タイミングがあります。</p><p>バッチ処理で学習を行う3つの予測パターンとリアルタイム処理のパターンについて構成を見ていきましょう。</p><ol><li>バッチ処理で学習 ＋ 予測結果をWebアプリケーションで直接参シュルする（リアルタイム処理で予測）</li><li>バッチ処理で学習 ＋ 予測結果をAPI経由で利用する（リアルタイム処理で予測）</li><li>バッチ処理で学習 ＋ 予測結果をDB経由で利用する（バッチ処理で予測）</li><li>リアルタイム処理で学習する</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/517/1*5rA3ij6Z4gWtS3kik73VlA.png" /><figcaption>出典：仕事で始める機械学習</figcaption></figure><h4>ログ設計</h4><p>ログ設定は特徴量を決めるための重要なポイントです。例えば、複数の自社で展開するWebサービスごとにユーザIDが異なる場合、CookieなどにUUIDを仕込んでIDの名寄せを試みるなどする必要があります。<br>ここでは、どこにあるどういった情報を利用し、教師データに活用するかについての概要を説明します。</p><h4>特徴量や教師データに使いうる情報</h4><p>特徴量や教師データに使えそうな情報としては3つ大きくあります。</p><ol><li>ユーザー情報（登録したときの情報）</li><li>コンテンツ情報（ブログに於ける記事や商品自身の情報）</li><li>ユーザ行動ログ（アクセスログ）</li></ol><h4>ログを保持する場所</h4><ul><li>分散RDBMSに格納する</li><li>分散処理基盤HadoopクラスターのHDFSに格納する</li><li>オブジェクトストレージに格納する</li></ul><p>最近はAmazon RedshiftやGoogle BigQueryなどのフルマネージドなクラウド分散DBがあります。</p><p>・クラウドストレージ <br>— Amazon S3<br> — Google Cloud Storage<br> — Microsoft Azure BLOB Storage</p><p>・マネージド分散DB <br>— Amazon Redshift<br> — Google BigQuery<br> — Treasure Data</p><h4>ログを設計する上で注意点</h4><p>・必要そうなユーザー情報、コンテンツ情報については設計時に設定すべき</p><p>・データの変更履歴を保存する／データ量が多いので放棄したため教師データがない</p><p>・システム開発・運用・分析する人が別れているとデータ設計できないことがある</p><p>・ログ形式の変化 サービスに追加機能をくわえた場合にログ形式が変化することがある</p><h3>学習のためのリソースを収集しよう</h3><h4>学習のためのリソースの取得方法</h4><p>教師あり学習に欠かせない教師データに含まれる情報は2つあります。</p><ul><li>入力：アクセスログなどから抽出した特徴量</li><li>出力：分類ラベルや予測値</li></ul><p>特徴量については試行錯誤になるので、出力のラベルや値は以下のような方法で付与できます。</p><ul><li><strong>サービスの中にログ取得の仕組みを用意してそこから抽出する（完全に自動）</strong></li><li><strong>コンテンツなどを人が見て付与する（人力で行う）</strong></li><li><strong>機械的に情報を付与して、人手で確認する（自動＋人力）</strong></li></ul><p>ここでは、教師データを作るのは誰かという観点から説明を進めていきます。</p><ol><li>公開されたデータセットやモデルを活用する</li><li>開発者自身が教師データを作る</li><li>同僚や友人などにデータ入力してもらう</li><li>クラウドソーシングを活用する</li><li>サービスに組み込み、ユーザーに入力してもらう</li></ol><p>公開されたデータセットやモデルを活用する際に、気にすべき点があります。</p><ul><li>モデルやデータは商用利用可能なライセンスか？</li><li>学習済みモデルやデータセットを自分のドメイン（自分たちが運用するシステムサービス）に適用できるか？</li></ul><p>2つ目は、半教師あり学習や転移学習があります。画像の物体認識を行うタスクでは、転移学習を用い、既存の学習 モデルに自分の解きたい画像の正解データセットを追加することで、少ない追加コストで目的の画像 を認識するモデルを学習できることが知られています。</p><p>僕の一番好きなドラマにSilicon Valleyというものがあって、作中に登場したホットドッグ判定機もこれでつくれます。Jian-yang意外と優秀ｗ</p><p><a href="https://medium.com/@timanglade/how-hbos-silicon-valley-built-not-hotdog-with-mobile-tensorflow-keras-react-native-ef03260747f3">How HBO’s Silicon Valley built “Not Hotdog” with mobile TensorFlow, Keras &amp; React Native</a></p><h3>効果検証</h3><h4>効果検証の概要</h4><p>効果検証とは、ある施策によってもたらされた降下を推定することです。例えば、広告表示1000回あたり収益が新機能によってどれだけ増えたかなどです。</p><h4>効果検証までの流れ</h4><ol><li>問題定義</li><li>仮説設定</li><li>アクション（開発）</li><li>効果検証</li></ol><h4>オフラインで検証しにくいポイント</h4><ul><li><strong>経済効果</strong> Netflixのレコメンドシステムでは解約率の低下と10億ドル/年の効果が合ったといいます。</li><li><strong>ログを経由した副作用 </strong>レコメンドしたログを取ることになるので、それを防ぐための実装にコストがかかるといわれています。</li></ul><h4>仮説検検定の枠組み</h4><p>仮説検定は効果検証のベースとなるもので、母集団に有意な差があることを標本を使って確認する手法です。基本的な例があります。</p><ul><li>コインは歪んでいるか</li><li>二群の歩比率の差の検定</li></ul><p><strong>偽陽性と偽陰性：</strong>p値が事前に定めた有意水準を下回った場合に帰無仮説を棄却するのが仮説検定の枠組みです。しかし、まれにしかおこらないことがおこったから帰無仮説を棄却する以上、帰無仮説が真であったとしても有意水準の確率で誤って帰無仮説を棄却してしまいます。誤った発見を偽陽性、逆に本当は有意差があるのに帰無仮説を棄却しないケースを偽陰性と呼びます。仮説検定では検定力を検定結果の評価に利用します。</p><p>検定力は 1ー有意差があるのに有意差がないと判断する確率 で表します。</p><h4>仮説検定の注意点</h4><ul><li>繰り返し検定をしてしまう</li><li>有意差とビジネスインパクト：推定量のばらつきを表す標準誤差が標本サイズの増大に従って小さくなる。標本のサイズを増やしていけばわずかなさでも有意差となります。Webサービスだとデータはすぐ貯まるので、重要なのは有意差があるという事とビジネス上のインパクトは別である点です。</li><li>複数の検定を同時に行う（多重検定）</li></ul><h4>因果効果の推定</h4><ul><li>ルービンの因果モデル（平均処置効果(ATE)＝E(Y1-Y0)＝E(Y1)-E(Y0)）</li><li>セレクションバイアス（E(Y1|介入あり)-E(Y0|介入なし)）</li><li>ランダム化比較試験（Randomized Controlled Trial (RCT)）</li><li>過去との比較は難しい</li></ul><h4>ABテスト</h4><ol><li>2群の抽出と標本サイズ</li><li>AAテスト</li><li>片方に介入</li><li>結果の確認</li><li>テスト終了</li></ol><p>というところで第1章は終わりです。</p><p>要点だけしか書いていませんので、深く読みたいなとぜひ購入してみたください。</p><p>リンクをのせておきます。（アフィリエイトでもなんでもないです）</p><p><a href="https://www.oreilly.co.jp/books/9784873118215/">仕事ではじめる機械学習</a></p><p>よもやま</p><p>発売が2017/10/20（正式には知らない）だとして、書いたのが10/28なので結構書くの早かったんだと書き終わってから知る（アーリーアダプター的なことをしようとしたわけではなかったんです）</p><h4>関連記事</h4><p>作者の方のMedium</p><ul><li><a href="https://medium.com/@chezou/%E3%82%AA%E3%83%A9%E3%82%A4%E3%83%AA%E3%83%BC%E3%81%8B%E3%82%89-%E4%BB%95%E4%BA%8B%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92-%E3%81%8C%E5%87%BA%E7%89%88%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99-cf835ff4c128">オライリーから「仕事ではじめる機械学習」が出版されます</a></li><li><a href="https://twitter.com/chezou">Aki Ariga</a></li></ul><p>他の方の書評</p><ul><li><a href="https://t.co/K0RMZ908Vv">「仕事ではじめる機械学習」をざっくり読んだので感想やメモなど - razokulover publog</a></li><li><a href="https://t.co/KDI7CwXSnH">「仕事ではじめる機械学習」を読んだメモ</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7c74f4f2b5af" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[性格診断のエムグラムのインターンに行ってきて、性格がよくなった話]]></title>
            <link>https://medium.com/@SEKAINOOKAZAWA/%E3%82%A8%E3%83%A0%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AB%E8%A1%8C%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%BE%E3%81%97%E3%81%9F-1a263a15475e?source=rss-2f57c3ad8306------2</link>
            <guid isPermaLink="false">https://medium.com/p/1a263a15475e</guid>
            <category><![CDATA[internships]]></category>
            <category><![CDATA[gramm]]></category>
            <category><![CDATA[engineering]]></category>
            <dc:creator><![CDATA[Okazawa Ryusuke]]></dc:creator>
            <pubDate>Wed, 25 Oct 2017 11:07:58 GMT</pubDate>
            <atom:updated>2017-10-31T06:54:44.671Z</atom:updated>
            <content:encoded><![CDATA[<p>自分の興味あるところでインターンしたいなという思いつきから始まったインターン。m-gramの天才感ある超優秀なメンバーと1カ月で400万人、今でも1日2000人が使っている性格診断で”相性を科学する”という非常におもしろプロダクトがとてもすごくて、考え方が変わるようなとても有意義な時間だったので、やってたことと気づきを少しまとめてみました。学生インターンを考えている方の参考になればと思います。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LJ4pBf-gev1wzwsKmr-vVw.png" /><figcaption>エムグラム診断（私の診断結果）</figcaption></figure><p>目次</p><p>・エムグラムのすごいところ</p><p>・インターンを終えて気づいたこと</p><p>・インターンでやってたこと</p><p>・インターンしてよかったこと</p><p>・今後</p><p>ではいきます。</p><h4>エムグラムのすごいところ</h4><ul><li>性格診断のポテンシャルめちゃある</li><li>インターンにも裁量権めちゃある</li><li>高専卒の人が多い</li></ul><p><strong>性格診断のポテンシャルめちゃある</strong></p><p>理系の方ならなんとなく分かるかもしれませんが、曖昧なものに指標として数値化するのって非常に大切なことです。わかりやすい例だと、成績表とか社内評価とかって人を数値で表してるんですけど、実際その評価って先生や上司の経験的で主観的な評価から数字にされているんですね。</p><p>というのも、自分が中学生のとき美術で入賞したのに美術の先生と喧嘩したため通知表は1でした（笑）いまでもはっきり覚えてます。</p><p>他にも、</p><p><strong><em>「女心ってなんだよわかんないよ どこに僕の理想の彼女いるんだああ！」</em></strong></p><p><strong><em>「面接では私の表面しか見せれなかった なんで落ちたのわからない！」</em></strong></p><p><strong><em>「この人となんか気が合うなー 上司のパワハラが最近やばい…」なんてことありますよね。</em></strong></p><p>恋愛とか。就活の面接とか。チームワークとか相性の不一致はあります。にんげんだもの。</p><p>エムグラムは科学的なアプローチに基づく性格診断・相性診断エンジンを開発して、性格の不一致をなくそうとしています。</p><p>代表が書いた記事から引用すると、</p><blockquote><strong>私たちは、（１）エムグラム診断、（２）m-gram相性マッチング、を多くのお客様にご利用いただくことを通して構築される科学的知見を活用し、日本の未来づくりに貢献したい</strong>と思います。どうか一緒に、あの悲しい「性格の不一致」をなくしましょう。別れることを減らしましょう。離職を減らしましょう。チーム分裂を減らしましょう。離婚を減らしましょう。ドキドキ、ワクワクする体験を増やしましょう。すべて、一つ一つきちんとデータに真摯に向きあえば、必ず出来ると、ぼくは信じています。</blockquote><p>もうすこし詳しく読みたい方はこちらの記事をご覧ください。</p><p><a href="https://note.mu/spyuchan/n/n8980e0b21c21">エムグラム診断。ブランディングのためのグロースハック、1ヶ月と1日。｜松村有祐の性格科学日記｜note</a></p><p>また、女子高生に人気のオオカミくんには騙されないのAmebaTVともコラボしたり、いろいろなところからコラボの依頼が来てたりします（研究室や大手などなど）</p><p><a href="https://m-gram.com/ookamikun/">AbemaTV Presents オオカミくん診断 powered by エムグラム</a></p><p>ご依頼・コラボ等はお問い合わせからコンタクトしてみてください。</p><p><strong>・インターンにも裁量権めちゃある</strong></p><p>「そういった曖昧な感情からの非合理的判断を減らすことが性格診断ではできるのではないかと自分は仮説を立てております。Siriやペッパー君などのIotにより、データがたまり、AIも精度を上げていき、近いうちに感情をもったAI、人の心を解析できるAIが作れたらなといいなと思っています。自分はそれを卒論でやりたいです。エムグラムのデータを使わせてください」という旨のプレゼンをインターン最終日に行いました。そしたらなんとOKでした。</p><p>インターン生ごときに、記事の中にあるように必死で開発してやっと得られたデータを使わせてくれる優しさと心意気に感謝してもしきれません。</p><p>他にも、インターンが1から大規模な新規事業立ち上げたり（内容は言えないけどほんとにすごい）、僕みたいなプログラミング初心者に超すごいエンジニアの方が每日教えてくれたり、挑戦する人には優しい会社です。</p><p>そんなエムグラムでインターン募集してるみたいなので、よかったらお話だけでも聞いてみてはどうでしょうか！</p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1FAIpQLSd5b9TovKwSMvDrTRD1ouyZQ2Au3dV6e6_8jUWOVtLW6x0frA%2Fviewform%3Fembedded%3Dtrue&amp;url=https%3A%2F%2Fdocs.google.com%2Fforms%2Fd%2Fe%2F1FAIpQLSd5b9TovKwSMvDrTRD1ouyZQ2Au3dV6e6_8jUWOVtLW6x0frA%2Fviewform&amp;image=https%3A%2F%2Flh5.googleusercontent.com%2FBHuYmxS31UzaNKsrwM3q78cIym17BsTL7MqHKex4OADyAjCMfFtZb8zekKSMF7Sjwws%3Dw1200-h630-p&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=google" width="760" height="500" frameborder="0" scrolling="no"><a href="https://medium.com/media/f110de9e2a471559fcea82c033cea786/href">https://medium.com/media/f110de9e2a471559fcea82c033cea786/href</a></iframe><p><strong>・高専卒の人が多い</strong></p><p>エムグラムは社内の人間の4/7人が高専卒です（2017夏）。なぜ高専がすごいかというと、高専の教育がすごいなと思いまして。普通の人が仕事に関係ない受験勉強を死ぬ気でやっている間に、高専の人たちは専門的で実践的な技術の習得を授業で行ってます。</p><p>一番、高専すごいなと思ったのが、アウトプットが当たり前の教育を叩き込まれていることです。仕事でも成果（アウトプット）を出さなければ、意味が無いのですが、それを当然のように行うのはマインド的に僕ら大卒と大きな違いだなと思いました。例えば、勉強のしかただと大卒の人はとりあえず覚えればテストで点が取れる。高専の人は違って、形にできる（コードを書く、製図書くとか、実験でレポート書くなど）ことが評価のポイントだったらしく、高専の教育の方が記憶に残り、また、仕事に近いインプットの仕方なので、高専の教育きつそうだけど素晴らしいなと思いました。自分の息子は高専いってほしいくらいには。</p><p>自分が高専いってないので説得力無いですが、全部りゅーかんさん（COO）から聞いた内容で、それが以下のブログに書かれてますので詳しくは↓</p><p><a href="http://ryu-kan.hatenablog.com/">りゅーかんの高専キャリア教育論</a></p><p>実際に高専卒のエンジニアさんはベンチャー界で活躍しているケースが多いです。そういうガチでやってきた人は、さらに楽しそうにものづくりをしているので、敵わないなと。才能ないんじゃないかと思っちゃう（泣）<br>スタートアップの中でもこんなに高専率が高いところは少ないので、非常にレベルの高いテック企業だといえます。代表は人工知能の元研究者で、天才感あります。CTOもCOOも高専卒で、論理性・スルースキルが高いサイコパス感のあるボードメンバー（冗談です）<br>ときに優しくときに厳しく非常に賢く絶対将来成功するだろうなという方々の集まりです。自分も一瞬だけその場にいれたことが非常にいい経験になりました。</p><h4>インターンでやってたこと</h4><p><a href="https://qiita.com/okazawaryusuke/private/33d2a454a6ebd1908aee">back propagationを理解しよう１ - Qiita</a></p><p>AIのエンジニアになりたいと思って始めた勉強と実験になります。理論とコードベースなのでエンジニアではない方は読み飛ばしてください。（ガチのAI研究者もレベル低いので読み飛ばしていただきたい笑）（※著作権の関係上非公開）</p><h4>インターンしてよかったこと</h4><p>・朝から晩まで集中して学習できた</p><p>・ランチに詳しくなる</p><p>・みんな優しい</p><p><strong>・朝から晩まで集中して学習できた<br></strong>まず、夏休み家にいたら絶対にごろごろしてしまうのは分かっていたので、強制力の働く環境としてインターンを使うのも僕みたいなダメ学生にも有効手段だということが実証できました。自分は優秀ではないので、人一倍努力しないといけない。じゃあどうするか。人より長くやる。PCと向き合う時間をできるだけ長くする。なので、朝から晩まで気力でやる。そういう環境として使うこともできます。収支は赤字でしたがそれでもいい経験でした。</p><p><strong>・ランチに詳しくなる<br></strong>ランチはほぼ每日外に出かけてました。普段はどこにでもいる貧困学生なので、なかなかおしゃれなお店に入る機械もなく、ご飯を済ませるのですが…<br>渋谷の道玄坂・神泉あたりのごはんやさんはだいたい行きましたので、グルメに詳しい感を渋谷でのみ発揮することができます。</p><p>每日食べてたワンコイン海鮮丼の店が安くてボリュームがあっておすすめです。</p><p><a href="https://tabelog.com/tokyo/A1303/A130301/13206927/">丼丸 背びれ 渋谷神泉店 (神泉/海鮮丼)</a></p><p>カツ丼がおいしい</p><p><a href="https://tabelog.com/tokyo/A1303/A130301/13032642/">勝味 (渋谷/割烹・小料理)</a></p><p>牡蠣がラーメンに入ってる ここはかなりオススメ</p><p><a href="https://tabelog.com/tokyo/A1303/A130301/13196746/">Tonari (神泉/居酒屋)</a></p><p>・みんな優しい</p><p>スキル無いし、コミュ障で自分でも接しづらいだろうと思うほど小気味悪いインターン生だったと思いますが、みなさん暖かく話しかけて頂きました。みなさんお忙しい中、ありがとうございました。もっと話せばよかった…って5000兆回言ってるような気がする。</p><h4>インターンを終えて気づいたこと</h4><p>・質問や相談しないともったいない</p><p>・技術は嘘付かない</p><p>・あらゆるものを捨てて、１つに絞る</p><p>・アウトプットが大事</p><p>反省としては、質問相談は遠慮せず早めに聞いておけばよかったのと、技術（プログラミングスキル）はごまかせないなと言うことが大きいかったです。</p><p>これくらいできますと口で言うのは簡単だけど、あまり世間を甘く見ると痛い目を見ます。できるだろうと思っていても、それは主観的で楽観的な自分のエゴでしかないので、実際に作れといわれて作れなかったときのリスクも自分のせいです。特に、エンジニアの世界はコードでスキルがだいたい見えるので、良くも悪くも勉強するしかないです。やればやった分だけ成果がでるのでエンジニアはわかりやすくていい職だと思ってます。</p><p>も1つ大事なことを教わりました。1つに絞って普通の枠を飛び越えること。真剣さ、必死さを人に伝えることの大切さ。</p><p>世界をとるには一つのことで突出しないといけない。1個突き抜ければ、この人すごいなって分かるようになるし、人も自然とついてくる。そうなるためには3〜5年くらいかけて一つのことをやり続けることが大事。いままでなんでもやろうとして中途半端だった自分にはピッタリのアドバイスでした。</p><p>また、その教えを貫いて、1年半がんばって、実際にいまその努力が実り始めてる先輩インターンがいて、その人がエムグラムに誘ってくださったんですけど、その先輩いつのまにか大学院やめてフルコミットしてたんですね（知らなかった）<br>大学やめたって誰から見てもこれってすごい覚悟があるなと思われますよね。このように必死さ、覚悟を見せれば、人って応援したくなる。今はまだ、スキルは足りなくても。そういう本気の見せ方って非常に大切だと学びました。</p><h4>今後</h4><p>・1万時間の法則</p><p>・一ヶ月ごとに成果物を出していく</p><p>・どこかインターンに行って、実践を積んでもっと腕をあげる</p><p>個人的な話ですが、大学生活伸ばしたらあと3年。3年で1万時間やりきる。そのためには1日10時間（365days*10h*3years=109,500h）くらいやらないといけないのですが、流石に講義もあるし每日は無理なので、平日5〜8時間、休日10時間を目標にやります。また、月次報告じゃないけど1ヶ月でどれくらいできたかも出していきます。そして、さらにパワーアップする為にエンジニアのインターンで今度はプロとして（学生という保険を外して）大学通いながらやっていこうと思ってます。僕なりの本気の見せ方です。</p><p>今月の月次報告はこんな感じ。インプットメインだったのでアウトプット次こそは。</p><p><a href="https://medium.com/@SEKAINOOKAZAWA/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%E3%82%92%E3%81%96%E3%81%A3%E3%81%8F%E3%82%8A%E3%81%A8-36d0fa93f961">ゼロから始めるデータサイエンスをざっくりと</a></p><p>最後に、エムグラムのインターン募集してるそうなので、興味があればぜひ！すごい経歴の方々しかいない仕事場で働いてみては！</p><p><a href="https://www.wantedly.com/companies/m-graminc/projects">株式会社m-gramの採用/求人一覧 - Wantedly</a></p><p>忙しそうなので、Wantedlyでつながらない場合もあるかもです。（僕はWantedlyで返事なかったので、FBで）</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*TtpmcTGUTrqEO8e385lrww.jpeg" /></figure><p>自分写ってないですが、いい写真</p><p>楽しそう…</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1a263a15475e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[ゼロから始めるデータサイエンスをざっくりと]]></title>
            <link>https://medium.com/@SEKAINOOKAZAWA/%E3%82%BC%E3%83%AD%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%E3%82%92%E3%81%96%E3%81%A3%E3%81%8F%E3%82%8A%E3%81%A8-36d0fa93f961?source=rss-2f57c3ad8306------2</link>
            <guid isPermaLink="false">https://medium.com/p/36d0fa93f961</guid>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[deep-learning]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[machine-learning]]></category>
            <category><![CDATA[data-science]]></category>
            <dc:creator><![CDATA[Okazawa Ryusuke]]></dc:creator>
            <pubDate>Sat, 21 Oct 2017 12:53:56 GMT</pubDate>
            <atom:updated>2017-10-21T12:55:35.639Z</atom:updated>
            <content:encoded><![CDATA[<p>最近、AI、人工知能、Deep learning、Iotと騒がれておりますが、Deep learningをする前に大量のデータを整えたり、機械学習でもなんの手法を使うのかを決めるのがデータサイエンティストの一部の役目だといわれてます。<br>スマホの普及により日常に近いデータが消費者からとることが容易になりました。これらからマーケティングはより、皆さんの行動から出たデータによって正しくターゲッティングされていくのだろうと思い、自分もデータサイエンスは今後絶対役に立つだろうと思い学習を始めました。<br>今回は、データサイエンスのざっくりとした概要をアウトプットがてらかいていきます。※随時更新していきます。</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AylF0pVW5h3Cz8EHF0FJwQ.png" /><figcaption>ロゴジェネレータ：<a href="https://nippori30.herokuapp.com/rezero">https://nippori30.herokuapp.com/rezero</a></figcaption></figure><h3>はじめに データサイエンスとは</h3><p>データサイエンスの定義はいまのところないそうです。<br>あえて定義するのであれば、</p><blockquote>大量の乱雑なデータの中から物事の本質を引き出す者</blockquote><p>多くのデータサイエンティストとソフトウェアエンジニアの線引は難しく、一部は統計学者で、多くは簡単な機械学習を知らないが、一部は機械学習のプロです。多くは学術論文を読んだことはありませんが、中には素晴らしい論文を書いたことあるPhD保持者もいます。定義がまだないのですが、大量のデータを扱い、興味深い真実を引き出す学問です。</p><h4>なぜデータサイエンスが注目されているのか</h4><p>シリコンバレーで生まれた「インターネット時代」を経て、Google, Facebookに代表される「ビッグデータの時代」が到来しようとしている。NewYorkTimesでは</p><blockquote>ビッグデータの技術は「Measurement(計測)」で革命を起こしている。この革命は新たな効率化とイノベーション野並隣、経済全体に波及するだろう。ビッグデータはただの技術ではなくではない。ビッグデータを見つめれば個々人の未来の意思決定を左右する「哲学」を見出すことができる。さらにいずれはAIがデータを動力源としてデジタル世界を物理世界のトップの座へと押し上げるだろう。 引用：データサイエンティストの作る未来</blockquote><p>米国のITリサーチ会社IDCによると、推定で4.4ゼタバイト、つまり4.4兆ギガバイトものデータが全世界に溢れるという。これだけのデータをアップルのiPadに容量いっぱいまでいれて積み重ねると高さ25万2660キロメートルつまり、月までの距離の約3分の1となる。中でも価値を持つのは動画と写真のデータである。個人がスマホで動画や写真をとり、ネットに投稿しているからデータの膨張は凄まじい。今もYoutubeには毎分48時間分の動画がアップされている。</p><p>だが、ビッグデータといってもそのままは使えない。例えると地球上の多くをしめる海の水も飲める水としては使えない。</p><p>それでも注目されている理由は、ソフトウェアの進化である。重要なコードの殆どを進化を着実に続ける機械学習ソフトが生み出しているからである。</p><p>最新の望遠鏡が最新の天文学を生み、最新の顕微鏡が最新の生物学を生んだ。ビックデータも同様の成果が期待される。しかもあらゆる分野においてである。インターネットはコミュニケーションの経済学を変えた。ビックデータも同様に「発見」の経済学を変えていっている。まだその動きは始まったばかりだが、この動きは人るの意思決定を大きく変えていくといわれている。すべての意思決定が直感ではなく、データと解析によって行われていくでしょう。</p><h4>ビジネスでの実用例</h4><p>Google（検索アルゴリズム）、Facebook（ネットワーク、広告）、Amazon（レコメンド）、IBM（人工知能Watson）、Apple（Siri）など世界を動かす大企業でデータサイエンティスト（AI研究者）がいないところはありません。<br>一番注目されている職業である所以です。</p><p>具体的な例で言うと、マッチングアプリのOkCupidは、大量の質問をユーザーに行い、最も適した相手をみつけます。同時に最初のデートで相手が眠くならないように、相手が興味を持たない分野を明らかにする分析も行います。</p><p><a href="https://theblog.okcupid.com/the-best-questions-for-a-first-date-dba6adaa9df2">The Best Questions For A First Date</a></p><p>例えば、Facebookはこれまでに住んだ場所と現在の居住地を訪ねます。これはユーザーの友人を発見しやすくするためといわれていますが、同時に移住パターンや居住地ごとにフットボールチームの好みを分析するためにも使われています。</p><p>ハマーバッカーというゲノム解析の准教授で、元金融での複雑な動きを数学に落とし込んでいた天才いて、当時データサイエンスがまだ確立されてない頃にFacebookに参画し、データサイエンス部という部署をつくり、ソーシャルネットワークの構造化とデータマイニングを行い、サービスとネットワーク広告の改善策を打ち出し、大学から始まって2年目のFacebookはその後、世界でも有数のIT企業となりました。FacebookはただのSNSだと思ってましたが、実はデータの活用に鍵があったのです。後ほど、手法としてネットワーク分析として説明します。</p><p>日本では、東大発ベンチャーのニュースアプリGunosyが有名だと思います。オススメのニュース記事を今までのクリックした記事からレコメンドします。<br>詳しい話はこちらから読んでいただいた方がわかりやすいと思います。<br>引用:</p><p><a href="https://speakerdeck.com/moyomot/gunosyfalsedetafen-xi-ji-pan-roguji-pan-falsequan-rong">Gunosyのデータ分析基盤、ログ基盤の全容</a></p><p><a href="https://d0.awsstatic.com/events/jp/2017/summit/devday/D2T8-6.pdf">GunosyにおけるAWS上での自然言語処理・機械学習の活用事例</a></p><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fspeakerdeck.com%2Fplayer%2F8c48ac0b9da848e5bc5bc7172d0bd238&amp;url=https%3A%2F%2Fspeakerdeck.com%2Fmoyomot%2Fgunosyfalsedetafen-xi-ji-pan-roguji-pan-falsequan-rong&amp;image=https%3A%2F%2Fspeakerd.s3.amazonaws.com%2Fpresentations%2F8c48ac0b9da848e5bc5bc7172d0bd238%2Fslide_0.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=speakerdeck" width="710" height="555" frameborder="0" scrolling="no"><a href="https://medium.com/media/2b8a7f2122fcf937b43f611424163408/href">https://medium.com/media/2b8a7f2122fcf937b43f611424163408/href</a></iframe><p>この記事を書きながら調べているときに面白い記事を見つけました。（順番おかしいですが）<br>データサイエンス領域で最も優れている起業はどこだと思いますか？という質問にエン・ジャパン イノベーションラボのデータサイエンティスト（略称）のマシューさんはこう答えています。</p><p><a href="http://careerhack.en-japan.com/report/detail/586">データサイエンティストだけど質問ある？｜マシューのデータサイエンスAtoZ Vol.3</a></p><blockquote>Googleは<a href="http://static.googleusercontent.com/media/research.google.com/ja//archive/mapreduce-osdi04.pdf">MapReduce</a>をはじめとして、<a href="http://research.google.com/pubs/papers.html">様々な最先端の技術</a>を発表しつづけています。 そしてFacebook とAmazonはデータサイエンスを競争力の源泉として優れたビジネスを築き上げました。これらの企業が自社のビジネスのために開発してきた技術が、ここ数年のデータサイエンス業界を発展させてきたことは事実ですし、今後もこの流れはしばらく継続すると考えています。</blockquote><p>データサイエンスを競争力の源泉に優れたビジネスを築き上げたとあります。<br>世界時価総額ランキング10位以内のTOP企業がデータサイエンスでここまで大きくなったと聞くと、やっぱりデータを使える人というのは今後重宝されるのではと思い、学習への意欲も高まりますね。</p><h4>以降、扱っていく手法</h4><p>１．データの可視化</p><p><a href="https://medium.com/@SEKAINOOKAZAWA/%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%8F%AF%E8%A6%96%E5%8C%96-54b60de7d041">データの可視化</a></p><p>２．線形代数</p><p><a href="https://medium.com/@SEKAINOOKAZAWA/%E7%B7%9A%E5%BD%A2%E4%BB%A3%E6%95%B0-48c6f1653bf4">線形代数</a></p><p>３．統計</p><p><a href="https://medium.com/@SEKAINOOKAZAWA/%E7%B5%B1%E8%A8%88-b4ccc05852b5">統計</a></p><p>４．確率</p><p><a href="https://medium.com/@SEKAINOOKAZAWA/%E7%A2%BA%E7%8E%87-128c20480c3f">確率</a></p><p>５．仮説と推定</p><p><a href="https://medium.com/@SEKAINOOKAZAWA/%E4%BB%AE%E8%AA%AC%E3%81%A8%E6%8E%A8%E5%AE%9A-1a84fa3276b7">仮説と推定</a></p><p>６．勾配降下法</p><p><a href="https://qiita.com/okazawaryusuke/private/33d2a454a6ebd1908aee">back propagationを理解しよう１ - Qiita</a></p><p>７．データの取得</p><p><a href="https://medium.com/@SEKAINOOKAZAWA/%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%8F%96%E5%BE%97-f4d41ba1d822">データの取得</a></p><p>８．データの操作</p><p><a href="https://medium.com/@SEKAINOOKAZAWA/%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E6%93%8D%E4%BD%9C-92a20e4f4429">データの操作</a></p><p>９．機械学習</p><p>１０．k近傍法</p><p>１１．ナイーブベイズ</p><p>１２．単純な線形回帰</p><p>１３．重回帰分析</p><p>１４．ロジスティック回帰</p><p>１５．決定木</p><p>１６．ニューラルネットワーク</p><p><a href="https://qiita.com/okazawaryusuke/private/33d2a454a6ebd1908aee">back propagationを理解しよう１ - Qiita</a></p><p>１７．クラスタリング</p><p>１８．自然言語処理</p><p>１９．ネットワーク分析</p><p>２０．レコメンドシステム</p><p>２１．データベースとSQL</p><p>※随時更新</p><h3>参考になるすばらしい記事まとめ</h3><p>データサイエンスに関する素晴らしい記事をここで紹介します。勉強が辛くなったり、目的を見失ったときに読む記事リンク集です。</p><h4>データサイエンス</h4><p><strong>・一番分かりやすかったデータサイエンティストについての記事</strong></p><p><a href="https://qiita.com/hik0107/items/f9bf14a7575d5c885a16">そろそろデータサイエンティストの定義とスキルセットについて本気で考えてみる - Qiita</a></p><blockquote>最初に読んどけばよかったなと思う記事。よくまとまってます。</blockquote><p><strong>・データサイエンス界隈で有名な方のブログ</strong></p><p><a href="http://tjo.hatenablog.com/entry/2017/06/25/185426">データサイエンティストもしくは機械学習エンジニアになるためのスキル要件とは（2017年夏版） - 六本木で働くデータサイエンティストのブログ</a></p><blockquote>データサイエンス事情が詰まってます。</blockquote><p><strong>・データサイエンティストになるには</strong></p><p><a href="http://tjo.hatenablog.com/entry/2017/09/15/190000#fn-ef51d963">データ分析職に採用されるために必要な「実務経験」をいかにして積むべきか - 六本木で働くデータサイエンティストのブログ</a></p><blockquote>道は厳しいようですが輝かしい未来がほぼ確だとおもっているので頑張ります。</blockquote><p><strong>・データサイエンティストになりたいならKaggle</strong></p><p><a href="https://qiita.com/KIKUYA-Takumi/items/13ac849582318f559271#_reference-ac7ce3482a7c7b32264f">データサイエンティストを目指して勉強するなら、Kaggleからはじめよう - Qiita</a></p><blockquote>この記事はKaggleだけでなくデータサイエンティストについても非常にわかりやすくておすすめです。必読です。</blockquote><p><a href="https://www.rco.recruit.co.jp/career/engineer/blog/kaggle-bosch/">top2%の私が教えるKaggleの極意, Bosch Production Line Performance | リクルートコミュニケーションズ</a></p><blockquote>練習問題としても使えるし、Kaggleは国際的なコンペであり、データ系の就職の際にも実績として一番使えるので、私もKaggleで結果出すことを目標として学習を進めています。めざせGoogle！</blockquote><p><strong>・Schooの動画</strong></p><p><a href="https://schoo.jp/class/221">現場でつかえるデータ分析 統計・設計</a></p><blockquote>上記の記事でも登場されていたリクルートの方の講義です。一部無料。</blockquote><p><strong>・初心者でもわかる機械学習 動画カリキュラム しかも無料</strong></p><p><a href="https://www.coursera.org/learn/machine-learning">Supervised Machine Learning: Regression and Classification</a></p><blockquote>お金をはらうと卒業証書ももらえて資格として使えるそうです。英語ですが…</blockquote><h4>人工知能って？統計と機械学習とディープラーニングの違い</h4><p><a href="http://s0sem0y.hatenablog.com/entry/2017/06/09/222859">【ただのボヤキ】統計学と機械学習とディープラーニングと - HELLO CYBERNETICS</a></p><blockquote>上記の記事をよんだあと、結局データサイエンスって統計・ML・DLどれなん？ってなりますが、この記事は非常によくまとまってます。これかけるくらい賢くなりたい。</blockquote><h4>Deep learning</h4><p><strong>・最近話題のDeep learningでできること 実際のところAIってどうなの？がわかる記事</strong></p><ul><li><a href="https://wirelesswire.jp/2016/11/57788/">2016年11月現在のAIにできることとできないこと - WirelessWire News（ワイヤレスワイヤーニュース）</a></li><li><a href="http://www.newsweekjapan.jp/yukawa/2017/03/ai10_3.php">AIはどこまで進んだか？──AI関連10の有望技術と市場成熟度予測</a></li></ul><blockquote>騒がれているようにAIは将来的に大きな市場になることは間違いなさそうですが、実際にAIを歌っている企業の殆どがDeep learningよりはMacine Learningなのが現実なようです。騒がれているほどAIはまだ便利では無いです。</blockquote><p><strong>・DLでできること（画像認識の例）</strong></p><ul><li><a href="http://christina.hatenablog.com/entry/2015/01/23/212541">Deep Learningでラブライブ！キャラを識別する - christinaの備忘録</a></li><li><a href="http://kivantium.hateblo.jp/entry/2015/11/18/233834">TensorFlowでアニメゆるゆりの制作会社を識別する - kivantium活動日記</a></li><li><a href="http://kivantium.hateblo.jp/entry/2015/02/20/214909">ご注文はDeep Learningですか？ - kivantium活動日記</a></li></ul><blockquote>こういう高度なおふざけができるようになりたいです。心がぴょんぴょんします。</blockquote><p><strong>・DL理論の勉強の参考になるブログ</strong></p><p><a href="http://deeplearning.hatenablog.com/entry/neural_machine_translation_theory">【前編】深層学習による自然言語処理 - ニューラル機械翻訳への理論 - - ディープラーニングブログ</a></p><blockquote>数学メインで勉強したいときにどうぞ。</blockquote><h4>統計</h4><p><strong>・体系的にまとまっている統計のサイト</strong></p><ul><li><a href="https://bellcurve.jp/statistics/">統計WEB － 統計学を身に着けて論文を書こう｜BellCurve</a></li><li><a href="https://www.albert2005.co.jp/knowledge/statistics_analysis/multivariate_analysis/multiple_regression">重回帰分析とは | データ分析基礎知識</a></li></ul><blockquote>避けては通れない統計と数学…</blockquote><h4>Pythonでデータサイエンス</h4><ul><li><a href="http://pythondatascience.plavox.info/">Python でデータサイエンス</a></li><li><a href="https://qiita.com/hik0107/items/0bec82cc09d0e05d5357">Pythonでのデータ分析初心者がまず見るべき情報源のまとめ - Qiita</a></li></ul><p><strong>・Pythonは独学なのですが、非常に役立ったおすすめサイト</strong></p><p><a href="https://checkio.org/">CheckiO - coding games and programming challenges for beginner and advanced</a></p><blockquote>ゲーム感覚で楽しく勉強できました。プログラミング何したらいい？って聞かれたらこれをおすすめしてます。</blockquote><h4>個人的に注目してるもの</h4><p><strong>・性格診断エムグラム</strong></p><p><a href="https://note.mu/spyuchan/n/n8980e0b21c21">エムグラム診断。ブランディングのためのグロースハック、1ヶ月と1日。｜松村有祐の性格科学日記｜note</a></p><blockquote>一時期話題になった心理学に基づく性格診断のサービス。<br>CEOの松村さんはCS（コンピュータサイエンス）の博士で、アメリカのIBMで働いたやばい人が起業して、とにかくすごい（小並感）何も成果上げてないですが元インターン先です。インターンの感想を書いた記事を後ほど書こうと思ってまだ書いてない...</blockquote><p><strong>・IBM WatsonのPersonality Insights（Twitterの投稿から性格を分析）</strong></p><p><a href="http://ascii.jp/elem/000/001/139/1139573/">ブラウザーだけでWatsonが使える！人工知能アプリの作り方</a></p><blockquote>自然言語処理すごい。ぜひ使いこなしたい。これがオープンソースってすごくないですか…</blockquote><h3>まとめ</h3><p>データサイエンスは最強。</p><p>ですが、勉強しなければいけない分野も幅広く、東大や研究者あがりやPhD保持者しかいないんじゃないかと…一方では最難関でもあります。</p><p>難しくて、範囲広くて、数字苦手なのでときどき心が折れますが。絶対に世界のインフラとなると信じて諦めず勉強していきます。</p><p>データサイエンスの概要がわかったところで、次からは手法について紹介します。</p><p>※オライリー出版のゼロから始めるデータサイエンスを参照しています。著作権の関係上、アフィリエイトなどの利益目的のものは入れておらず、学習が目的となっております。</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=36d0fa93f961" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[データの操作]]></title>
            <link>https://medium.com/@SEKAINOOKAZAWA/%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E6%93%8D%E4%BD%9C-92a20e4f4429?source=rss-2f57c3ad8306------2</link>
            <guid isPermaLink="false">https://medium.com/p/92a20e4f4429</guid>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[working-with-data]]></category>
            <category><![CDATA[ai]]></category>
            <dc:creator><![CDATA[Okazawa Ryusuke]]></dc:creator>
            <pubDate>Sat, 21 Oct 2017 12:12:45 GMT</pubDate>
            <atom:updated>2017-10-21T12:12:45.359Z</atom:updated>
            <content:encoded><![CDATA[<p>データの操作は科学でもあり、職人芸でもあります。ここでは科学よりテクニックに着目します。</p><h4>データの調査</h4><p>解決すべき問題が特定され、そのためのデータが得られたなら、早速モデルを構築し、回を得るための作業に取り掛かりたいという誘惑にかられることでしょうが、それよりもまず最初にやるべきことはデータを調べることです。</p><h4>１次元データの調査</h4><p>１次元のデータセットをもっているとして、数値の集合である場合が最も単純です。底データは各ユーザがサイト上に止まっている時間で合ったり、データサイエンスの書籍のページ数であったりします。</p><p>最初に行うべきはその統計量を計算することです。データ数、最小値、最大値、変チンチ、標準偏差などを算出します。</p><p>それらの値がデータに対する良い理解に寄与しないこともあります。そんな場合に取るべき次の手は、ヒストグラムの作成です。つまり値をいくつかの範囲（バケツ）に分割し、それぞれのバケツにいくつのデータが入るかを教えます。</p><pre>def bucketize(point, bucket_size):<br>    return bucket_size * math.floor(point / bucket_size)</pre><pre>def make_histogram(points, bucket_size):<br>    return Counter(bucketize(point, bucket_size) for point in points)</pre><pre>def plot_histgram(points, bucket_size, title=&quot;&quot;):<br>    histgram = make_histgram(points, bucket_size)<br>    plt.bar(histgram.keys(), histgram.values(), width=bucket_size)<br>    plt.title(title)<br>    plt.show()</pre><p>例えば、次の２つのデータセットについて考えます。</p><pre>random.seed(0)</pre><pre>uniform = [200 * random.random() - 100 for _ in range(10000)]</pre><pre>normal = [57 * inverse_normal_cdf(random.random())<br>          for _ in range(10000)]</pre><p>どちらも平均は0,標準偏差はおおよそ５８ですが、分布は全く異なっています</p><p>２つの分布データは最大値と最小値が異なっています。しかし、それだけでは両者どのように異なっているかを示すには不十分です。</p><h4>２次元データ</h4><p>２次元のデータ・セットを持っているとしましょう。１日あたりサイト上で費やす時間とデータサイエンティストとしての勤務年数の組み合わせなどが考えられます。それぞれの次元について理解を深めるのは当然として、データの散らばりにも興味があるはずです。例えば、次の適当に作ったデータで考えてみましょう。</p><pre>def random_normal():<br>    return inverse_normal_cdf(random.random())</pre><pre>xs = [x + random_normal() / 2 for x in xs]<br>ys1 = [ x+random_normal() / 2 for x in xs]<br>ys2 = [ -x + random_normal()/ 2 for x in xs]</pre><h4>多次元データ</h4><p>多次元のデータに対しては、それぞれの次元が他の次元とどのように関連しているかを知ることが重要です。簡単な手法として、相関行列を調べる方法があります。これは次元とj次元の相関を行列のi行j列の値としたものです。</p><pre>def correlation_matrix(data):<br>  _, num_colums = shape(data)</pre><pre>def matrix_entry(i, j):<br>  return correlation(get_column(data, i), get_column(data, j))</pre><pre>return make_matrix(num_columns, num_columns, matrix_entry)</pre><p>(次元数がそんなにおおくないのであれば)より可視的な手法として、各次元データの組み合わせで作る散布図行れるを使う方法があります。この分圧されたクラフはplt.subplots()を使って書きます。作成するグラフの行数と列数を与えてfigureオブジェクトと軸オブジェクトの配列を取得します。</p><pre>import matplotlib.pyplot as plt</pre><pre>_, num_columns = shape(data)<br>fig, ax = plt.subplots(num_columns, num_columns)</pre><pre>for i in range(num_columns):<br>  for j in range(num_columns):<br>    if i != j: ax[i][j].scatter(get_column(data, j), get_column(data, i))</pre><pre>else: ax[i][j].annotate(&quot;series&quot; + str(i) , (0.5, 0.5), xycoords=&#39;axes fraction&#39;, ha=&quot;center&quot;, va=&quot;center&quot;)</pre><pre>if i &lt; num_columns - 1:ax[i][j].xaxis.set_visible(False)<br>    if j &gt; 0: ax[i][j].yaxis.set_visible(False)</pre><pre>ax[-1][-1].set_xlim(ax[0][-1].get_xlim())<br>ax[0][0].set_ylim(ax[0][1].get_ylim())</pre><p>plt.show()</p><h4>データの整理と変換</h4><p>実世界のデータは整然と整っているわけではありません。大抵の場合、使う前には何らかの処理を施す必要が生じます。前章では文字列を浮動小数点または整数に変換しなければなりませんでした。そこでデータを使う直前に変換を行ってました。</p><pre>closing_price = float(row[2])</pre><p>csv.readerをラップする関数を通して、データの入力中に解釈する方法を使えば、よりエラーの発生を低減できるはずです。この手法では列ごとに解釈を行うパーサをリストして与えます。Noneは「列に対して何も行わない」ものとします</p><pre>def parse_row(input_row, parsers):<br>    return [parser(value) if parser is not None else value<br>            for value, parser in zip(input_row, parsers)]</pre><pre>def parser_row_with(reader, parsers):<br>    for row in reader:<br>        yield parse_row(row, parsers)</pre><p>誤ったデータがあるばあいにはどうするのでしょうか。「浮動小数点」のあるべき場所に実際には数値意外の値があったとします。大抵はプログラムがエラーを吐くよりは、Noneが返る方が望ましい動作です。これはヘルパー関数を使えば可能となります。</p><pre>def try_or_none(f):<br>    def f_or_none(x):<br>        try: return f(x)<br>        except: return None<br>    return f_or_none</pre><p>このヘルパー関数を使うようにparse_rowを変更します。</p><pre>def parse_row(input_row, parsers):<br>    return [try_or_none(parser)(value) if parser is not None else value<br>            for value, parser in zip(input_row, parsers)]</pre><p>例として、誤りを含むカンマ区切りの株価データを使います。このデータを解釈しながら一度に読み込みます。</p><pre>import dateutil.parser<br>data = []</pre><pre>with open(&quot;comma_delimited_stock_prices.csv&quot;, &quot;rb&quot;) as f:<br>    reader = csv.reader(f)<br>    for line in parse_rows_with(reader, [dateutil.parser.parse, None, float]}:<br>    data.append(line)</pre><p>読み込み後に、Noneを含む行がないかを確認します。</p><pre>for row in data:<br>    if any(x is None for x in row):<br>        print(row)</pre><p>Noneが合った場合にはどう扱うかも決めておきましょう。（一般的には、3つの選択肢があります。Noneを取り除く、元のデータに戻りかけているデータの補足や誤ったデータの修正を試みる、何もしないかです）csv.DictReader向けのヘルパー関数を作ってもいいです。その場合はフィールド名に対してパーサを指定します。例として、</p><pre>def try_parse_field(field_name, value, parser_dict):<br>    parser = parser_dict.get(field_name)<br>    if parser is not None:<br>        return try_or_none(parser)(value)<br>    else:<br>        return value</pre><pre>def parse_dict(input_dict, parser_dict):<br>    return {field_name : try_parse_field(field_name, value, parser_dict)<br>            for field_name, value in input_dict.iteritems()}</pre><p>次に行うべきは、簡易な手段を使うか、または先程やったデータの調査で使ったような手法用いて外れ値がないかを調べることです。実際のデータでは小数点がかけていたり、0が余計だったり、様々な誤りがあります。そして、そしてそれを正しく扱うのはデータを分析する側つまり自分の責任で行わければなりません。</p><h4>データの操作</h4><p>データサイエンティストにとって最も重要なスキルの1つがデータの操作です。それは特定のテクニックというよりは、一般的な手順と言えます。そこで、少し株価を例にして、その感覚を伝えようと思います。</p><pre>data = [<br>{&#39;closing_price&#39;:102.06,<br>&#39;data&#39;:datetime.datetime(2014, 8, 29, 0,0),<br>&#39;symbol&#39;: &#39;AAPL&#39;}, #...]</pre><p>概念的に言うと、このデータは行の集まり（例えば表計算）としてみることが出来ます。</p><p>このデータに対する問題をいくつかといてみましょう。その過程で手順とパターン化し、抽象化したツールを作成して操作を容易にします。<br>例えば、AAPLの終値はいくらが最高であったかを調べます。まずは具体的な手順に分解します。</p><ol><li>AAPLの行だけに着目する</li><li>各業からclosinf_price（終値）の値を取り出す</li><li>それらの値にmaxを適用する</li><li>リスト内包を使って3つの手順を一度に実行します。</li></ol><pre>max_aapl_price = max(row[&quot;closing_price&quot;])<br>                     for row in data<br>                     if row[&quot;symbol&quot;] == &quot;AAPL&quot;)</pre><p>データ中の各銘柄ごとに最高の終値を見つける事ができれば、より一般的な手段として使えます。1つの方法として次の手順を考えましょう。</p><ol><li>同じ銘柄（symbol）ごとにグループ化する</li><li>各グループに対して上の手順を行う</li></ol><pre>#銘柄ごとにグループ化<br>by_symbol = defaultdict(list)<br>for row in data:<br>    by_symbol[row[&quot;symbol&quot;]]append(row)<br>#各銘柄ごとに内包表記で最大値を求める<br>max_price_by_symbol = {symbol : max(row[&quot;closing_price&quot;]<br>                                    for row in grouped_rows)<br>                       for symbol, grouped_rows in by_symbol.iteritems()}</pre><p>幾つかの処理パターンがでてきました。どちらの例でも辞書からclosing_priceの値を取り出しています。そこで関数を新たに2つ追加します。1つは辞書から列の値を取り出す関数を返すもの、もう一つは辞書のリストから同じレルの値を選び出すものです。</p><pre>#辞書から列を取り出す関数を返す<br>def picker(field_name):<br>    return lambda row: row[field_name]</pre><pre>#辞書のリストから、指定した列のリストに変換する<br>def plunck(field_name, row):<br>    return map(picker(field_name), rows)</pre><p>グループ化関数の返した行をグループ化すると共に、各グループのに似の変換を適用する関数を作ります。</p><pre>de group_by(grouper, rows, value_transform=None):<br>    #キーはグループ化関数の出力、値は行のリスト<br>    grouped = defaultdict(list)<br>    for row in rows:<br>        grouped[grouper(row)].append(row)<br>        if value_transform is None:<br>            return grouped<br>        else:<br>            return {key :value_transform(rows)<br>                    for key, rows in grouped.iteritems()}</pre><p>これを使えば以前のコードをさらに簡単にかけます。例えば、</p><pre>max_price_by_symbol = group_by(picker(&quot;symbol&quot;),<br>                               data,<br>                               lambda rows:max(pluck(&quot;closing_price&quot;, rows)))</pre><p>続いて、もっと複雑な問題に取り組みましょう。例えば、1日で最も大きく値が動いたのはどれくらいであったか。また、小さい変化はどうであったかについて考えます。前日比は今日の終値/昨日の終値 -1で計算できます。これはつまり、今日の値と機能の値を関係づける方法が必要になることを意味しています。1つの方法として、銘柄ごとに値をグループ化して次の手順を適用します</p><ol><li>値を日付順に並べる</li><li>zipをつかって（昨日の終値、今日の終値）の組を作る</li><li>その組みを使って新しい列「change（前日比）」を追加する</li></ol><p>各グループごとに適用できる形の関数を作ります</p><pre>def precent_price_change(yesterday, today):<br>    return today[&quot;closing_price&quot;] / yesterday[&quot;closing_price&quot;] - 1</pre><pre>def day_over_day_changes(ground_rows):<br>    ordered = sorted(ground_rows, key=picker(&quot;date&quot;))</pre><pre>return [{&quot;symbol&quot;:today[&quot;symbol&quot;],<br>             &quot;date&quot;:today[&quot;date&quot;]<br>             &quot;change&quot;:percent_price_change(yesterday, today)}<br>            for yesterday, today in zip(ordered, ordered[1:])]</pre><p>この関数をgroup_byのvalue_trainsform引数に指定します。</p><pre>#キーが銘柄、値は前日比の辞書<br>change_by _symbol = group_by(pycker(&quot;symbol&quot;), data, day_over_day_changes)</pre><pre>#すべての前日比の辞書を大きなリストに格納する<br>all_changes = [change<br>               for changes in changes_by_symbol.values()<br>               for change in changes]</pre><p>ここまでできれば、最大値と最小値を求めるのは簡単です。</p><pre>max(all_changes, key=picker(&quot;change&quot;))<br>min(all_changes, key=picker(&quot;change&quot;))</pre><p>all_changeを使えば投資も有利に進めれます。まず月ごとにグループ化し、各グループの総合的な変化を計算します。</p><p>繰り返しになりますが、適切なvalue_transform関数を作りgroup_byに適用します</p><pre>#前日比を比較するにはそれぞれ1をくわえたものを乗じてから1を減ずる<br>def combine_pct_changes(pct_change1, pct_change2):<br>    return (1 + pct_change1) * (1 + pct_change2) - 1</pre><pre>def overall_change(changes):<br>    return reduce(combine_pct_chages, pluck(&quot;change&quot;, changes))</pre><pre>overall_change_by_month = group_by(lambda row: row[&#39;date&#39;].month,<br>                                   all_changes,<br>                                   overall_change)</pre><p>このような操作をよくデータサイエンスでは行います。</p><h4>スケールの変更</h4><p>多くも手法がデータのスケールに影響を受け舞うs。例えば、さいーたサイエンティスト百人分の身長と体重のデータから、体格をクラスタ分類することにしましょう。直感的には知覚の値を持つ者同士を同じクラスタに分類することになります。つまりデータの近さを定義する必要があります。すでにユークリッド距離を計算する関数を作っているので、（身長体重）2つの値を2次元空間上で扱うのが自然です。しかし実際は身長をインチで表したり、cmで表したりします。</p><p>このように単位の変更で結果が代わってしまうのは明らかに紛らわしい問題です。このため、各次元のあたいが直接比較できない場合には、それぞれの次元の値が平均0かつ標準偏差1となるようにデータのスケールを変更します。各次元を「平均値からの標準偏差の割合」で表すことに変更して単位を効果的に取り除きます。このために、まず各列の平均と標準偏差を計算し、</p><pre>def scale(data_matrix):<br>    num_rows, num_cols = shape(data_matrix)<br>    means = [mean(get_column(data_matrix, j))<br>            for j in range(num_cols)]<br>    stdevs = [standard_deviation(get_column(data_matrix, j))<br>              for j in range(num_cols)]<br>    return means, stdevs</pre><p>この値を使って新しいデータを作ります</p><pre>means, stdevs = scale(data_matrix)</pre><pre>def rescale(i, j):<br>    if stdevs[j] &gt; 0:<br>        return (data_matrix[i][j]-means[j]) / stdevs[j]<br>    else:<br>        return data_matrix[i][j]<br>num_row, num_cols = shape(data_matrix)<br>return make_matrix(num_rows, num_cols, rescaled)</pre><p>いつものように、データをどのように扱うかは自分で判断しなければなりません。膨大な量の身長と体重のデータを持っていたとして、その中で身長が69~70インチの間のデータのみを中執して使うとしましょう。値の違いは誤差であり、1つの列の標準偏差を他の標準偏差と同等に扱いたくなという状況は少なくありません。</p><h4>次元削減</h4><p>多次元データの中ですべての次元が実行的な次元とは限りません。<br>そんなときは、主成分分析と呼ばれる手法によりデータの変化を表すために必要最小限の次元を抽出します。</p><p>各次元の平均が0となるように変化をします</p><pre>def de_mean_matrix(A):</pre><pre>#Aのすべての値と各列の平均との差を返す 結果の行列は各列の平均が0となる<br>    nr, nc = shape(A)<br>    column_means, _ scale = scale(A)<br>    return make_matrix(nr, nc, lambda i, j :A[i][j] - column_means[j])</pre><p>これを行わないとデータの変化ではなく平均自体を特定することになってしまします。変換後の行列Xがあれば、データの分散が最も大きくなる方法を求められます。具体的には（大きさ1のベクトルとして）方向dが与えられたとき、行列の各列xはdの方向にdot(x, y)の大きさを持ちます。そして、あらゆるゼロではないベクトルwは大きさを1にすることで方向として扱えます。</p><pre>def direction(w):<br>    mag = magnitude(w)<br>    return [w_i / mag for w_i in w]</pre><p>そのため、ゼロでないベクトルwが与えられたときwで示された方法に対するデータセットの分散が計算できます。</p><pre>def directional_variance(x_i, w):<br>    return dot(x_i, direction(w)) ** 2</pre><p>wで示される方法に対するx_iの分散を求める</p><pre>def directional_varience(X, w):<br>    return sum(directional_variance_i(x_i, w)<br>               for x_i in X)</pre><p>そして、勾配関数がわかれば、勾配降下法を容易手分散を最大化する方向が第一成分になります。</p><pre>def directional_gradient_i(s_i, w):<br>    #x_i列の値がw方向に持つ分散に対する勾配<br>    projection_length = dot(x_i, direction(w))<br>    return [2 * projection_length * x_ij for x_ij in x x_i]</pre><pre>def directional_variance_gradient(X, w):<br>    return vector_sum(dictional_varience_gradient_i(x_i, w)<br>                      for x_i in X)</pre><p>directional_variance関数を最大化する方向が第一主成分となります</p><pre>def first_principle_component(X):<br>    guess = [1for _ in X[0]]<br>    unscaled_maximizer = maxmize_batch(<br>        partial(directional_variance, X),<br>        partial(directional_gradient, X),<br>        guess)<br>    return direction(unscaled_maximizer)</pre><p>確率的勾配降下法をつかうなら次のようになります。</p><pre>def first_princepal_componet_stg(X):<br>    guess = [1 for _ in X[0]]<br>    unscaled_maximizer_stochastic(<br>        lambda x, _, w:directional_variance_i(x, w),<br>        lambda x, _, w:directional_gradient_i(x, w),<br>        W,<br>        [None for _ in X], <br>        guess)<br>    return direction(unscaled_maximizer)</pre><p>平均が0となるよう変換を行ったデータセットを使うと、データが最も大きく変化する方向である第1主成分が得られます。</p><p>第1主成分が見つかれば、それぞれのデータをその宝庫に射影した値を求めることができます。</p><pre>def project(v, w):<br>    projection_length = dot(v, w)<br>    return scalar_multiply(projection_length, w)</pre><p>その他の主成分を求める場合、まず最初にデータから第1主成分への射影を取り除きます。</p><pre>def remove_projection_from_vector(v, w):<br>    return vector_subtract(v, project(v, w))</pre><pre>def remove_projection(X, w):<br>    return [remove_projection_from_vector(x_i,w) for x_i in X]</pre><p>ここで使用したのは2次元データなので、第1主成分を取り除くと結果的に残るのは1次元のデータとなります。</p><p>ここまでできれば、主成分の射影を取り除く処理を繰り返すことでそのあtの主成分が見つけられます。より高次元のデータセットに対しても、必要な主成分を繰り返し見つけることが出来ます。</p><pre>def principal_componet_analysis(X, num_conpornents):<br>    compornets = []<br>    for _ in range(num_components):<br>        component = first_principal_component(X)<br>        components.append(component)<br>        X = remove_projection(X, component)</pre><pre>return components</pre><p>その後、各成分で構成される低次元数の空間にデータを変換できます。</p><pre>def transform_vector(v, components):<br>    return [dot(v, w) for w in components]</pre><pre>def transform(X, conponents):<br>    return [transform_vector(x_i, components) for x_i in X]</pre><p>行くるかの理由により、この手法は有用です。まず、データから不要な次元をとり、高い相関を持つ次元に集約して、データの整理ができます。</p><p>つぎに、高次元のデータにはうまく適用できな様々な手法がありますが、低次元表現に変換すれば適用が可能です。</p><p>一方、より良いモデルが作れるかもしれませんが、解釈が難しくなるのも事実です。「第3主成分が』0.1増加すると年収が10,000ドル高くなる」という結論よりも、「勤続年数1年にあたり、年収が10,000ドル高くなる」と言えたほうが理解は簡単です。</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=92a20e4f4429" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[データの取得]]></title>
            <link>https://medium.com/@SEKAINOOKAZAWA/%E3%83%87%E3%83%BC%E3%82%BF%E3%81%AE%E5%8F%96%E5%BE%97-f4d41ba1d822?source=rss-2f57c3ad8306------2</link>
            <guid isPermaLink="false">https://medium.com/p/f4d41ba1d822</guid>
            <category><![CDATA[data-science]]></category>
            <category><![CDATA[ai]]></category>
            <category><![CDATA[data-mining]]></category>
            <dc:creator><![CDATA[Okazawa Ryusuke]]></dc:creator>
            <pubDate>Sat, 21 Oct 2017 12:11:06 GMT</pubDate>
            <atom:updated>2017-10-21T12:11:06.077Z</atom:updated>
            <content:encoded><![CDATA[<p>データサイエンティストであるためには、データが不可欠です。実際のところデータサイエンティストが行う作業時間の大部分は、データの取得、整理、変換にあるといわれています。危機的な状況では、自分で入力する事もできますが、大抵の場合で有益な時間の使い方とはいえません。ここでは、Pythonにデータを読み込ませ、望ましい形に変換する方法を扱います。</p><h4>stdinとstdout</h4><p>Pythonスクリプトをコマンドラインから実行したのであれば、sys.stdinとsys,stdoutを通じてデータをプログラムに渡せます。例えば次のスクリプトはテキストファイルを読み込み正規表現と一致した行を出力します。</p><pre>#egrep.py<br>import sys, re</pre><pre>#sys.srgvはプログラム引数のリスト<br>#sys.argv[0]は、プログラム名<br>#sys.argv[1]は、コマンドライン上に指定した正規表現<br>regex = sys.argv[1]</pre><pre>#スクリプトが処理する各行に対して<br>for line in sys.stdin:<br>    # 正規表現に合致したなら、stdoutに出力する<br>    if re.search(regex, line):<br>        sys.stdout.write(line)</pre><p>また、次のスクリプトは読み込んだテキストの行数を数え、出力します.</p><pre>#line_count.py<br>import sys</pre><pre>count = 0<br>for line in sys.stdin:<br>    count += 1<br>    <br># sys.stdoutに出力される<br>pritnt(count)</pre><p>このスクリプトを使い、数字を含む行が何行あるかを数えられます。</p><p>同様に、次のスクリプトは入力から単語の出現回数を数え、頻出するものを表示します。</p><pre>#most_common_words.py<br>import sys<br>from collections import Counter</pre><pre>#第1引数として、出力する単語数を指定する<br>try:<br>    num_words = int(sys.argv[1])<br>except:<br>    print (&quot;usage: most_common_words.py num_words&quot;)<br>    sys.exit(1) #０以外のexitコードはエラーが発生したことを示す<br>    <br>    counter = Counter(word.lower() #単語を小文字にする<br>                     for line in sys.stdin<br>                     for word in line.strip().split() #単語は空白で区切る<br>                     if word) #空白はスキップする<br>    <br>    for word, count in counter.most_mommon(num_words):<br>        sys.stdout.write(str(count))<br>        sys.stdout.write(&quot;\t&quot;)<br>        sys.stdout.write(word)<br>        sys.stdout.write(&quot;\n&quot;)</pre><h4>ファイルの読み込み</h4><p>プログラムから特定のファイルを直接書き込んで読み書きできます。Pythonではファイルの取扱は非常に簡単です。</p><h4>テキストファイルの基礎</h4><p>テキストファイルを使うにはopenを使ってfileオブジェクトを作成するのが最初のステップです。</p><pre>#&#39;r&#39;はread-only（読み取り専門）の意味<br>fike_for_reading = open(&#39;reading_file.txt&#39;, &#39;r&#39;)</pre><pre>#&#39;w&#39;はwrite（書き込み）を表す(ファイルを壊す可能性がある)<br>file_for_writing = open (&#39;writing_file.txt &#39;, &#39;w&#39;)</pre><pre>#&#39;a&#39;はappend（追記）を表す（ファイルの末尾に追記する）<br>file_for_appending = open(&#39;appending_file.txt&#39;, &#39;a&#39;)</pre><pre>#ファイルを使い終わったら、クローズを忘れないように<br>file_for_writing.close()</pre><p>ファイルのクローズは忘れがちであるので、withブロックをつかい、ブロックの最後で自動的にクローズされるようにすべきです。</p><pre>with open(filename, &#39;r&#39;) as f:<br>  data = function_that_gets_data_from(f)</pre><pre>#この時点ではfはすでにクローズされているので使うことはできない<br>process(date)</pre><p>ファイル全体を読み込みたいのであれば、forを使って行ごとの読み込みを繰り返します。</p><pre>starts_with_hash = 0<br>with open(&#39;input.txt&#39;, &#39;r&#39;) as f:<br>    for line in file: #ファイル内の各行ごとに繰り返す<br>        if re.match(&quot;^#&quot;, line): #正規表現を使って行頭の’#’の有無を調べる<br>            starts_with_hash += 1 #行頭が&#39;#&#39;の行数を数える</pre><p>この方法で読み込んだ行は改行文字で終端されているため、何か処理を加える前にstrip()で改行を取り除く必要があるかもしれません。<br>例えば１行に１つメールアドレスが記録されているファイルを処理して、ドメインのヒストグラムを作ることを考えてみましょう。ドメイン名を正確に抜き出すには微妙な点があります。最初の近似としてはメールアドレスの@から後ろを抜き出すのが良いでしょう。</p><pre>def get_domain(email_address):<br>    #@で分解して、後ろの部分を返す<br>    return email_address.lower().split(&quot;@&quot;)[-1]</pre><pre>with open(&#39;email_address.txt&#39;, &#39;r&#39;) as f:<br>    domain_counts = Counter(get_domain(line.strip())<br>                            for line in f<br>                            if &quot;@&quot; in line)</pre><h4>区切り文字を使ったファイル</h4><p>メールアドレスのは言ったファイルは、１行に１つのアドレスだけが入っていることになっていました。普通のデータファイルには、同じ行に様々なデータも書かれています。こういったファイルは大抵、カンマ区切りやタブ区切りが使われます。各業にはいくつかのフィールドが含まれ、カンマがフィールドとフィールドの区切りをします。</p><p>カンマやタブや改行を含むフィールドが（不可逆的に）出てくると、混乱します。独自の構文解析は、誤りのもとです。代わりにPythonのcvsモジュール（また、pandasライブラリ）を使いましょう。技術的な理由からMicrosoftを避難してもかまわないのですが、csvファイルを扱う際には、rかwの後ろにaを置いて常にバイナリーモードでopenすべきです。</p><p>ファイルにヘッダがない（つまり行はすべてのデータであり、どの列のデータがどういう意味を持つのかを覚えてオカなければない）場合、すべての行をcvs.readerを使って繰り返し処理できます。各業は、適切に分割されます。</p><p>次のようにコードを書きます。</p><pre>import csv</pre><pre>with open(&#39;tab_delimited_stock_prices.txt&#39;, &#39;rb&#39;) as f:<br>    reader = csv.reader(f, delimiter=&#39;\t&#39;)<br>    for row in reader:<br>        data = row[0]<br>        symbol = row[1]<br>        closing_price = float(row[2])<br>        process(data, symbol, closing_price)</pre><p>(最初にreader.next()を実行しておくことで)ヘッダ行をスキップするか、csv.DictReaderを使ってヘッダ行各ふぃーるどをキーとするディクショナリとして読み込むことも出来ます。</p><pre>with open(&#39;colon_delimited_stock_prices.txt&#39;, &#39;rb&#39;) as f:<br>    reader = csv.DictReader(f, delimiter&#39;:&#39;)<br>    for row in reader:<br>        date = row[&quot;data&quot;]<br>        symbol = row[&quot;symbol&quot;]<br>        closing_price = float(row[&quot;closing_price&quot;])<br>        process(date, symbol, closing_price)</pre><p>ヘッダがなくてもfieldnamesパラメータにへっだ情報を与えればDictReadを使えます。同様にcvs.writerを使って区切りデータをファイルに出力できます。</p><pre>today_prices = {&#39;AAPL&#39; : 90.91, &#39;MSFT&#39; : 41.68, &#39;FB&#39; : 64.5}</pre><pre>with open(&#39;comma_delimited_stock_prices.txt&#39;, &#39;wb&#39;) as f:<br>    writer = csv.writer(f, delimiter=&#39;,&#39;)<br>    for stock, price in today_prices.items():<br>        writer.writerow([stock, price])</pre><p>csv.writerはフィールドの中にカンマを含むデータを含むデータも正しく扱います。自作のwriterでは、意図したとおりには動作しないかもしれません。例えば、次のデータを文字区切りのファイルに書き出したとしましょう。</p><pre>results = [[&quot;test1&quot;, &quot;success&quot;, &quot;Monday&quot;]<br>          [&quot;test2&quot;, &quot;success, kind of&quot;, &quot;Tuesday&quot;],<br>          [&quot;test3&quot;, &quot;failure, kind of&quot;, &quot;Wednesday&quot;],<br>          [&quot;test3&quot;, &quot;failure, utter&quot;, &quot;Thursday&quot;]]</pre><pre>#誤った処理方法<br>with open(&#39;bad_csv.txt&#39;, &#39;wb&#39;) as f:<br>    for row in results:<br>        f.write(&quot;,&quot;.join(map(str, row))) #おそらく必要以上のカンマ#区切り文字が書き込まれる<br>        f.write(&quot;\n&quot;) #行末には改行も必要</pre><p>この結果、作成されるcsvファイルは次のようになります。</p><pre>test1, success, Monday<br>test2, success, kind of, Tuesday<br>test3, failure, kind of, Wednesday<br>test3, failure, utter, Thursday</pre><p>このように誤った処理を加えると意味がわからなくなります。</p><h4>Webスクレイピング</h4><p>データを取得する方法の１つが、Webページ上のスクレイピングです。Webページを読み出すのには非常に簡単ですが、そこから意味のある構造化された情報を抜き出すのはそれほど簡単ではありません。</p><p><strong>HTMLとその解析</strong></p><p>WebページはHTMLで書かれており、（理想的には）要素と属性がメークアップされています。</p><p>すべてのWebページが意味的にマークアップされており、「idが”subject”である&lt;p&gt;要素を探して、その中身を返す」といったルールを使えば目的のデータが取り出せる、と言うのは理想的な世界の話です。実世界のHTMLは的確に表現されておらず、アノテーションなども付加されていないため、意味を解するには人間の手助けが必要です。</p><p>HTMLからデータを取り出すために、Beautiful Soupを使いましょう。このライブラリはWebページの様々な要素からツリー構造を作り、その中のデータへアクセスする簡単なインターフェイスを提供します。同時にPython組み込みの手段よりも優れたHTTPリクエスト生成機能であるrequestライブラリを使います。</p><p>Python組み込みのHTMLパーサは寛大ではないため、形式が完全に整っていないHTMLをうまく扱えません。そのため、別パーサを使いますが、インストールが必要です。</p><pre>pip install html5lib</pre><p>Beautiful Soapを使うには（）にHTML文章を渡さなければなりません。この例ではrequests.getの結果を渡します。</p><pre>from bs4 import BeautifulSoup<br>import requests<br>html = requests.get(&quot;<a href="http://www.twitter.com/">http://www.twitter.com</a>&quot;).text<br>soup = BeautifulSoup(html, &#39;html5lib&#39;)</pre><p>ここまでくれば簡単なメソッドの呼び出しで様々なことが出来ます。<br>大抵の場合HTMLページのタグにそうとしたTagオブジェクトを操作します。<br>例えば、次のコードは、最初の&lt;p&gt;タグ（とその中身）を探し出します。</p><pre>first_paragraph = soup.find(&#39;p&#39;)</pre><p>textプロパティを通じて、タグの文字列部分を取り出せます。</p><pre>first_paragraph_text = soup.p.text <br>first_paragraph_words = soup.p.text.split()</pre><p>tagオブジェクトを辞書として扱えば、属性にアクセスできます。</p><pre>first_paragraph_id = soup.p[&#39;id&#39;]#idがなければKeyErrorとなる<br>first_paragraph_id2 = soup.p.get(&#39;id&#39;)#idがなければ、Noneが返る</pre><p>複数のタグを一度に取り出せます。</p><pre>all_paragraphs = soup.find_all(&#39;p&#39;) #または、単にsoup(`p`)<br>paragraphs_with_ids = [p for p in soup(&#39;p&#39;) if p.get(`id`)]</pre><p>特定のクラスに属するタグが木手となる場面も頻繁に生じます。</p><pre>important_pragraph = soup(&#39;p&#39;, {&#39;class&#39;:&#39;important&#39;})<br>important_pragraph2 = soup(&#39;p&#39;, &#39;important&#39;)<br>important_pragraph3 = [p for p in soup(&#39;p&#39;)<br>                       if &#39;important&#39; in p.get(&#39;class&#39;, [])]</pre><p>これらを組み合わせて、より込み入ったロジックを作れます。例えば、&lt;div&gt;要素の中にある&lt;span&gt;要素を探すには、次のようにします。</p><pre>#注意：複数の&lt;div&gt;の中に同じ&lt;span&gt;があればそれらをその都度返す その場合工夫が必要<br>spans_inside_divs = [span<br>                     for div in soup(&#39;div&#39;) #ページ上の&lt;div&gt;要素ごとに繰り返し<br>                     for span in div(&#39;span&#39;) #その中の&lt;span&gt;要素で繰り返し</pre><p>これら少数の機能を使って、非常に様々なことが可能になります。もっと複雑な操作が必要になった（または単に興味がある）場合には、マニュアルを参照してみてください。</p><p>class=”important”とラベル付されていないデータであっても、重要なデータかもしれません。HTMLソースを注意深く調査し、抽出ロジックを樹分に吟味し、極端な場合でも正しくデータが取り出せるようにしなければなりません。</p><p><strong>事例：本のスクレイピング</strong></p><p>例えば、オライリーのWebサイトを調べたいとき（データに関する書籍は１ページ３０点表示されるページが何ページか続いています）</p><p>捕まりたくないなら、Webサイトからデータを収集する前に、アクセスポリシーが設定されているか調べるべきです。例えば、次の<a href="http://oreilly.com/terms/">ページ</a>には今回のような試みを禁止するような記載はなかったのでOKです。</p><p>また、Webクローラーの動作について書かれているrobots.txtファイルもカクニンしておくべきでしょう。<a href="http://shop.oreilly.com/robots.txt">http://shop.oreilly.com/robots.txt</a>の中で重要なのは２つです。</p><pre>Crawl-delay: 30<br>Request-rate: 1/30</pre><p>１行目は、リクエストごとに感覚を３０秒開けるよう要求しています。２行目は３０秒あたり１ページをリクエストするよう求めています。つまりこれらは同じことを別の表現で示しています（その他の行には、収集対象とすべきではないディレクトリが書かれていますが、ここでは使わないのでOKです）</p><p>データを取り出す方法を示すために、１ページをダウンロードしてBeautifuSoupに読み込ませてみましょう。</p><pre>url = “http://shop.oreilly.com/category/browse-subjects/&quot; + \ “data.do?sortby=publicationDate&amp;page=”<br>soup = BeautifuSoup(requests.get(url).text, &#39;html5lib&#39;)</pre><p>このページのHTMLソースをみれば、各書籍ごとに独立したthumbtextクラスの&lt;td&gt;テーブルで作られていることがわかります。</p><p>はじめにthumbtextタグ要素を探してみます。</p><pre>tds = soup(&#39;td&#39;, &#39;thumbtext&#39;)<br>print(len(tds))#30</pre><p>次にビデオを取り除いてみましょう。td要素には１つかそれ以上のpricelabelクラスのspan要素があり、そのテキストはEbook:,Video:またはPrint:であるとわかりました。ビデオはテキストがVideoであるpricelabelを１つだけ持つようです。これは次のコードです。</p><pre>def is_video(td):<br>  #pricelabelを１つだけもち、空白を取り除いたもじれつが’Video’であればびでおである<br>  pricelabels = td(&#39;span&#39;, &#39;pricelabel&#39;)<br>  return (len(pricelabels)) == 1 and pricelabels[0].text.strip().startswith(&quot;video&quot;))</pre><pre>print (len([td for td in tds if not is_video(td)])</pre><p>これでtd要素からデータを取り出す準備が整いました。著者のタイトルは&lt;div class”thumbheader”&gt;ブロック内の&lt;a&gt;タグにかかれているようです。</p><pre>title = td.find(&quot;div&quot;, &quot;thumbheader&quot;).a.text</pre><p>著者はAuthorName&lt;div&gt;のテキストに書かれています。著者名の前にはByが全治されており（取り除きます）、著者が複数の場合にはカンマで区切られています。（分割して、不要な空白を取り除くことにします。）</p><pre>author_name = td.find(&#39;div&#39;, &#39;AuthorName&#39;).text<br>authors = [x.strip() for x in re.sub(&quot;^By&quot;, &quot;&quot;, author_name).split(&quot;,&quot;)]</pre><p>ISBNはthumbheader&lt;div&gt;ないのリンクにあります。</p><pre>isbn_link = td.find(&quot;div&quot;, &quot;thumbheader&quot;).a.get(&quot;href&quot;)<br>#re.matchを使って正規表現のカッコ内にある部分を取り出す<br>isbn = re.match(&quot;/product/(.*)\.do, isbn_link).group(1)&quot;)</pre><p>日付です</p><pre>date = td.find(&quot;span&quot;, &quot;directorudate&quot;).text.strip()</pre><p>これらを１つの関数にまとめます。</p><pre>def book_info(td):<br>  <br>  title = td.find(&quot;div&quot;, &quot;thumbheader&quot;).a.text<br>  by_author = td.find(&#39;div&#39;, &#39;AuthorName&#39;).text<br>  authors = [x.strip() for x in re.sub(&quot;^By&quot;, &quot;&quot;, by_author).split(&quot;,&quot;)]<br>  isbn_link = td.find(&quot;dev&quot;, &quot;thumbheader&quot;).a.get(&quot;href&quot;)<br>  isbn = re.match(&quot;/product/(.*)\.do&quot;, isbn_link).groups()[0]<br>  date = td.find(&quot;span&quot;, &quot;directorydate&quot;).text.strip()</pre><pre>return {<br>  &quot;title&quot;:title,<br>  &quot;authors&quot; : authors,<br>  &quot;isbn&quot; : isbn,<br>  &quot;date&quot; : date<br>}</pre><p>情報収集の準備が整いました。</p><pre>base_url = &quot;http://shop.oreilly.com/category/browse-subjects/&quot; + \           &quot;data.do?sortby=publicationDate&amp;page=&quot;</pre><pre>books = []</pre><pre>NUM_PAGES = 31</pre><pre>for page_num in range(1, NUM_PAGES + 1):<br>  print(&quot;souping page&quot;, &quot;page_num&quot;,&quot;,&quot;len(books),&quot;found so far&quot; )<br>  url = base_url + str(page_num)<br>  soup = BeautifuSoup(requests.get(url).text, &#39;html5lib&#39;)</pre><pre>for td in soup(&#39;td&#39;, &#39;thumbtext&#39;):<br>    if not is_video(td):<br>      books.append(book_info(td))</pre><pre>sleep(30)</pre><h4>APIを使う</h4><p>多くのWebサイトやWebサービスでは、構造化されたデータを取り出すためのプログラムインターフェイス（API）を提供しています。APIを活用すれば、HTMLからのデータ抽出で遭遇する面倒の多くを回避できます。</p><h4>JSON（XML）</h4><p>HTTPはテキストをやり取りするためのプロトコルであるため、WebAPIを通してデータを要求するには、データを文字列形式にシリアライズしなければなりません。この目的のために、JavaScript Object Notation(JSON)が頻繁に使用されます。</p><p>Javasquriptおオブジェクトは。Pythonの辞書に似た形式を持っており、そのテキスト表現は解釈が容易です。</p><pre>serialized = &quot;&quot;&quot;{&quot;title&quot;: &quot;Data Science Book&quot;, <br>&quot;author&quot;:&quot;Joel Grus&quot;, <br>&quot;publicationYear&quot;: 2014,<br>&quot;topics&quot;: [&quot;data&quot;, &quot;science&quot;, &quot;data science&quot;]}<br>&quot;&quot;&quot;</pre><pre>#JSONからPython辞書を作る<br>deserialized = json.loads(serialized)<br>if &quot;data science&quot; in deserialized[&quot;topics&quot;]:<br>    print(deserialized)</pre><p>API提供者が意地悪しているのかもしれませんが、XMLレスポンスしか提供してないAPIもあります。</p><h4>認証の必要がないAPIを使う</h4><p>最近のAPIの多くは、最初に使用者の認証をします。この方法に異論があるわけではないのですが、認証のためのコードを追加する必要があるため、ここで説明するべきことに純粋に集中できなくなってしまうので、そこで、認証なしのGithubのAPIを使ってみます。</p><pre>import requests, json<br>endpoint = &quot;<a href="https://api.github.com/users/joelgrus/repos">https://api.github.com/users/joelgrus/repos</a>&quot;</pre><pre>repos = json.loads(requests.get(endpoint).text)</pre><p>この時点でreposはPython辞書のリストになります。この辞書はそれぞれの著者のGitHubアカウントにあるパブリックレポジトリを表します。このデータを使って著者がレポジトリを作るのは何月が多いか何曜日が多いのかがわかります。問題はレスポンスとして返されるはずのデータの形式が（Unicode）文字列である点です。Pythonは優れた日付パーサがないので何かインストールする必要があります。</p><pre>pip install python-dateutil</pre><p>使うのはおそらくdateutil.parser.parse関数だけです。</p><pre>from dateutil.parser import parse</pre><pre>dates = [parse(repo[&quot;created_at&quot;]) for repo in repos]<br>month_counts = Counter(date.month for date in dates)<br>weekday_counts = Counter(date.weekday for date in dates)</pre><p>同様にして、最後の５つのリポジトリについて、プログラミング言語の種類を取り出します。</p><pre>last_5_repositories = sorted(repos, <br>                             key=lambda r : r[&quot;created_at&quot;],<br>                             reverse=True)[:5]<br>last_5_languages = [repo[&quot;language&quot;] for repo in last_5_repositories]</pre><p>普通はこのリクエストを出して、結果を自分でパースすると言った低レベルのAPIは使いたくないですが、Pythonを使う利点の１つがこれから使おうとしているAPIをアクセスするためのライブラリが大抵の場合はすでに開発されている点です。ライブラリがよく出来ているなら、APIのアクセス人生じる扱いにくい問題の多くを回避してくれると思います。そうでない場合や今使われていないバージョンにしか対応してない場合は多くのエラーを起こすので、自分用にAPIアクセスライブラリを作らなければならない（または誰かが作ったライブラリをデバッグしないといけない）場合に備え、中身の知識を知っておくことは必要です。</p><h4>必要なAPIの探索</h4><p>とあるサイトのデータが必要である場合、サイトの開発者向けページを見ましょう。そこにPython 〇〇 APIを探しましょう。</p><ul><li><a href="https://docs.python.jp/3/c-api/index.html">Python/C API リファレンスマニュアル - Python 3.6.1 ドキュメント</a></li><li><a href="http://www.pythonforbeginners.com/api/">API - Python for Beginners</a></li></ul><h4>TwitterAPI</h4><p>Twitterはデータの宝庫です。最新のニュースに対する反応を調べたり、特定の話題に対して情報が得られます。APIはTwythonライブラリを使います。他にもたくさんAPIがあります。</p><h4>認証の取得</h4><p>APIを使うにはTwitterの認証を取得する必要があります。詳しくはこちら。</p><p><a href="https://syncer.jp/Web/API/Twitter/REST_API/">Twitter REST APIの使い方</a></p><p>最初にSearch APIを使います。</p><p><a href="https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets">Standard search API</a></p><pre>twitter = Twython(CONSUMER_KEY, COMSUMER_SECRET)</pre><pre>for status in twitter.search(q = &#39;&quot;data science&quot;&#39;)[&quot;statuses&quot;]:<br>    user = status[&quot;user&quot;][&quot;screen_name&quot;].encode(&#39;utf-8&#39;)<br>    text = status[&quot;text&quot;].encode(&#39;utf-8&#39;)<br>    print (user, &quot;:&quot;, text)<br>    print()</pre><p>するとこのようにツイートが得られます</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RHAV48tWOUMHrMzj8TnEYQ.png" /></figure><p>APIは最近のツイートから一部の結果を返します。データサイエンスを行うには大量のデータが必要なのでStreaming APIを使います。</p><p><a href="https://developer.twitter.com/en/docs/tutorials/consuming-streaming-data">Review the documentation to get started.</a></p><p>Twythonを通してStreamingAPIを使うには、TwythonStreamを継承するクラスで、on_successメソッドをオーバライドします。</p><pre>from twython import TwythonStreamer</pre><pre>#データを大域変数に格納するのは稚拙な手法ではあるが、サンプルコードを単純にできる<br>tweets = []</pre><pre>class MyStreamer(TwythonStreamer):<br>    #streamとやり取りを行う方法を定義するTwythonStreamerのサブクラス<br>    <br>    def on_success(self, data):<br>        #Twitterがデータを送ってきたらどうするか。ここでdataは投稿を表すPythonのライブラリとして渡される<br>        <br>        #えいごのTweetのみを対称とする<br>        if data[&#39;lang&#39;] == &#39;en&#39;:<br>            tweets.append(data)<br>            print(&quot;received tweet #&quot; , len(tweets))<br>            <br>        #十分なTweetが得られたら終了<br>            if len(tweets) &gt;= 1000:<br>                self.disconnect()<br>            <br>    def on_error(self, status_code, data):<br>        print(status_code, data)<br>        self.disconnect()</pre><p>MystreamはTwitterストリームに接続して、データが送られるのを待ちますデータを受け取るとon_successメソッドが呼ばれ、英語のTweetであれがtweetsリストに追加されます。１０００ツイート収集できたらStreameを切断して実行を終了します。これを行うには初期化コードが必要です。</p><pre>stream = MyStreamer(COUSUMER_KEY, CONSUMER_SECRET,ACCESS_TOKEN, ACCESS_TOKEN_SERCRET)</pre><pre>#公開されているツイート(statuses)からキーワード&#39;data&#39;を持つものを収集する<br>stream.statuses.filter(track=&#39;data&#39;)</pre><p>このコードは１０００集めるかエラーが出るまで動き続けます。そこからあとにツイートの分析作業が始まります。と問えば最もよく使われているハッシュタグを調べます。</p><pre>from collections import Counter<br>top_hashtabs = Counter(hashtag[&#39;text&#39;].lower()<br>                      for tweet in tweets<br>                      for hashtag in tweet[&quot;entities&quot;][&quot;hashtags&quot;])</pre><pre>print(top_hashtags.most_common(5))</pre><p>それぞれの対とには多くのでーたが含まれています。自分自身でいろいろ試してみましょう。</p><p>実行結果はこのようになりました。(※17/10/2017)</p><pre>[(&#39;data&#39;, 80), (&#39;ai&#39;, 60), (&#39;podcast&#39;, 47), (&#39;soundcloud&#39;, 46), (&#39;np&#39;, 46)]</pre><p>補足</p><p>Scrapyはリンクされている先のページをたどるなどさらに複雑なWebスクレイパーです</p><ul><li><a href="https://qiita.com/checkpoint/items/038b59b29df8e1e384a2">Scrapy入門（１） - Qiita</a></li><li><a href="http://data.gunosy.io/entry/python-scrapy-scraping">Scrapy + Scrapy Cloudで快適Pythonクロール+スクレイピングライフを送る - Gunosyデータ分析ブログ</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=f4d41ba1d822" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>