kidoOooOoooOOom

ゲーム開発やってます

謙虚な社長、岩田さん

岩田さん」を読んだ。

本全体から岩田さんの謙虚さ、優しさ、良い人さが漂ってきた。

任天堂社長という地位にありながらも、開発者魂と謙虚さを保ち続けている。

GIVE & TAKE」でいうところの典型的なギバータイプな方だと感じた。

自分たちが得意なこととはなにか

岩田さんは、人間は、自分の得意なことを無意識に他人と比べてしまう本能があるんじゃないかと話している。

基本的に、人間って、自分の得意なことと他人の不得意なことを比べて、「自分は正当に評価されていない、不公平だ」って文句を言うんですよ。それは、自分でも、知らず知らずのうちにやってしまうことがあります。

これはわたしの勝手な説ですけど、生き物って自分の子孫を残すのが最終目的でしょう?子孫を残すためになにをしなければならないかというと、「自分は、他の個より、この部分が優れています」というプレゼンをしないといけないんですよ。

ということはつまり、「わたしという個は、他の個よりも優れています」というアピールをするのが上手なDNAがいま生き残っているんですよ。そういうことが得意じゃなかったDNAはだんだんいなくなってるはずなんだから。

会社という組織のなかでも、みんな、都合よく、自分の得意なことと、人の不得意なことをつい比較してしまう。

岩田さんは「自分の勝手な説」と言っているけれど、これは進化心理学の考え方に通じるものがある。

kidooom.hatenadiary.jp

生き物の本能に関する仮設を立てて組織作りをしていることが分かり、進化心理学の分野の知見が今後も組織作りに役に立ちそうだと思った。

全員面談

今となってはエンジニア業界では1on1ブームで面談するのは当たり前のような雰囲気があるが、その前から岩田さんは全員と面談することを大切にしていた。

変な言い方になりますが、「人は逆さにして振らないと、こんなにもものを言えないのか」とあらためて思いました。

とあるように、逆さにするぐらいに社員の本音を聞き出して、それを「社長の岩田さんにも伝えることができた」と社員にも思ってもらうことでモチベーションを高めてもいるんだと思った。

ジョハリの窓でいうところの「秘密な窓」を話してもらい、それに対してFBや聞いている姿勢を見せることで、「未知の窓」が開かれてその人の成長が促されるんだと思う。

f:id:gidooom:20191208094135p:plain
ジョハリの窓

これは自分も最近チーム内Podcastをやっている中で感じた。

「どういうモチベーションで仕事をしているか?」「どういったことが得意なのか?」という質問をPodcastの中でしてみたら、本人も後で驚くくらいの隠された言葉が出てきて、Podcastで話してみて良かったという感想も出ている。

kidooom.hatenadiary.jp

岩田さんは社長で多忙な中でも、全員面談の優先度は高く設定していて、定期的に行っていた。

わたしは「人は全員違う。そしてどんどん変わる」と思っています。もちろん、変わらない人もたくさんいます。でも、人が変わっていくんだということを理解しないリーダーの下では、わたしは働きたくないと思ったんです。

人の変化もちゃんと見ていたんだなと思う。

宮本さんのインタビュー

第6章では、宮本さんから見た岩田さんに対するインタビューが載っている。

岩田さんは読書家でたくさん本を読み、良い本があるとみんなに薦めていた。

その中で宮本さんが印象深く憶えているのが、行動経済学にまつわる本だったらしい。

kidooom.hatenadiary.jp

岩田さんに教えてもらうまでぼくはそういう分野(行動経済学)があることさえ知らなかったんですけど、読んでみると「なるほど、ぼくらがやっているのはこういうことか」って、すごく納得がいくんです。

岩田さんもかなり傾倒していたようで、あっという間にたくさんの本を読んで理解を深めていきました。

で、会うと、「任天堂がやってるのはこういうなんです」とか、「宮本さんの考え方はこれに近いです」とか言って、すごくわかりやすく説明してくれる。

行動経済学の知見が任天堂のゲーム作りにも活かされているんだと知れて面白かった。

脳科学からゲーム開発を考える「ゲーマーズブレイン」的な思考が当たり前に行われているんだろうなぁと感じる。

kidooom.hatenadiary.jp

岩田さんは、宮本さんと意見が違った時も対立することはなく、意見の違いをテーマにして考え続けるような人だったとのこと。

社内でも声を荒げて怒るようなことは無かったが、お客さんに対する不誠実な対応に対しては厳しく対応していたらしい。

宮本「岩田さんがすごいのは、力があるのに謙虚だというところ

ほっといたら人は傲慢になって謙虚さが薄れていくから、この岩田さんの本を思い出して、謙虚さを習得していきたい。

Netflixのドキュメンタリー「不自然淘汰:ゲノム編集がもたらす未来」が面白かった

Netflixの科学系ドキュメンタリーは好きで色々観ていて、中でもこれがとても面白かった。

wired.jp

遺伝子ドライブ

種の絶滅をも起こせる可能性のある遺伝子ドライブ技術が紹介されていた。

遺伝子ドライブ - Wikipedia

globe.asahi.com

この遺伝子ドライブが理論通りに動けば、絶滅させたい特定の蚊やマウスでオスばかりが生まれるようになり、繁殖が困難になって滅ぼせるというもの。

番組の中では、外来種のネズミによって原生生物が減っていることに悩んでいるオーストラリアにて、科学者が遺伝子ドライブを導入してネズミを駆逐することを提案する場面がある。

ただ、やはり未知の技術に対する不安や懸念は大きく、一部の地元住民の反対によって実施には至っていない。

最近のニュースでも、遺伝子組み換えをした蚊による殲滅作戦は失敗に終わったと報じられていて、失敗が続けば反対の声も大きくなりそう。

gigazine.net

DIYバイオハッキング

番組の中で特に印象的だったのが、実際に自分自身を実験台にして遺伝子編集の注射を打つ人たちが既に出ているということ。

NASAで現バイオハッカーのジョサイア・ザイナーは、「バイオハッカー」志望者に遺伝子工学キットを販売して遺伝子編集の民主化を考えている。

www.technologyreview.jp

遺伝子編集は、やり方とキットさえあれば割と誰でもできるようになっていて、DIYバイオという用語もあるぐらい。

DIYバイオ - Wikipedia

前に進み続けなければ滅んでしまう

番組の中で特に好きなシーンは、エピソード3の最後でMITのケビン・エスベルトが語っているこのシーン。

f:id:gidooom:20191207134815p:plain
自然淘汰エピソード3より

www.technologyreview.jp

まだ箱の悪夢を見る。

パンドラの箱だ。

箱を開け続けなきゃこの文明は続かない。

でも役立つ箱と危険な箱の区別できない。

だから僕にはそれが最大の課題だ。

前にブログに書いた、赤の女王仮説の考え方と同じだと思う。

kidooom.hatenadiary.jp

危険な箱を開けるのを恐れて現状維持を続けようとすると、周りの環境においていかれて人類は滅びてしまう。

全力で走り続けるために、人類が遺伝子編集の道に進んでいくことは不可避なんだろうなと考えさせられる内容だった。

野蛮な進化心理学を読んで、理想的なものばかり見るのは避けようと思った

こちらの2つの進化心理学に関する記事を読んで(めちゃくちゃ面白い)、

yuchrszk.blogspot.com

note.com

マズローの欲求ピラミッドを置き換えるケンリックの欲求ピラミッドが気になったので、「野蛮な進化心理学」を買って読んでいる。

ケンリックの欲求ピラミッドに関しては7章で扱っていて、まだ3章までしか読んでないけれど、この時点でも面白いからメモを書いておく。

心の飴玉〜食べすぎに注意

本書の研究結果によると、

  • 男性であれば、グラビアアイドルなどの美女を見すぎると自分のパートナーや周りの女性に対する気持ちが揺らぐ
  • 女性であれば、社会的に成功しそうなやり手の男性ばかり見ると、自分のパートナーや周りの男性に対する献身の度合いが低くなる

ということが分かった。

これはコントラスト効果が働いていて、人間の脳は最近どんなものを体験していたかに大きく左右されている。

diveintomyself.funfairfanfare.com

この男女の理論が他分野にも適用されるのかどうか分からないが、もし適用されるのであれば

  • 魅力的な会社の情報ばかり集めていると、自社の魅力が薄れてくる
  • 優れたチームの話ばかり聞いていると、自分の所属するチームが劣って見えてくる
  • 最新の綺麗なグラフィック・快適な操作性のゲームばかりやっていると、少し前に発売されたゲームや資本力に劣るゲームを楽しめなくなる

などが起こり得るかもなぁと思った。

教訓としては、自分が大切にしているものへの影響度を減らすために、

  • 美男美女のコンテンツなどをなるべく避ける
  • 脂や砂糖が多い美味しいものばかり食べない
  • 最高峰のゲームばかり追いかけない

という自制が必要かもしれない。

殺人妄想

個人的な体験を思い返すと、誰かが暴力をしているシーンといえば「飲み会帰りの電車の中で見知らぬ男同士」が最初に思い浮かぶ。

これは本書の研究結果にも近くなっていて、男女ともに殺人妄想を抱いた相手は、

  • 男性の殺人妄想の85%は、男が相手
  • 女性の殺人妄想の65%は、男が相手

となっており、実際の殺人統計を見ても男性のほうがずっと殺人の被害者になりやすいので合致している。

また、殺人妄想の相手が知人かどうかというデータについては、

男性の59%はまったく知らない人物を殺すのを夢見たことがあり(女性は33%)、一番最初に抱いた殺人妄想が見知らぬ相手を殺すことだったと応えた男性も33%にのぼった(女性は10%)

とあり、つまり見知らぬ男性が殺人のターゲットになりやすい。

この突発的な動機が男性ほど多く見られるのは、

  • 男性のほうがテストステロンの量が多い
  • 性淘汰のために地位を確立することが重要
  • 「悪いやつら」は通常は男で、見知らぬ連中であることが多いという潜在意識

などが理由として考えられるが、理屈はどうあれ、

だが人は怒っているとき「オレはテストステロンとノルアドレナリンの上昇を体験しており、したがって繁殖の成功を確固たるものとするため、オレの地位に挑んでいるこの人物に怒鳴ったほうがいいな」などとは考えない。むしろ「このクソ野郎ときたら、まったく頭にくるぜ、何様のつもりだ!」と思っているのである。(野蛮な進化心理学 p62)

「カッとなってやった」の被害者にならないためにも、公共の場で人の地位を貶めることはしないように気をつけよう。

「レガシーコードからの脱却」を読了したが、読了の読了の読了はまだ

レガシーコードからの脱却」を読んだ。非常に良い本だと思ったので、印象に残った箇所をメモっておく。

ラクティス1: やり方より先に目的、理由、誰のためかを伝える

ここでは「顧客から要求を聞く」という前提になっているが、ゲーム開発では「企画者から要求を聞く」と置き換えて考える。基本は同じ。(まあゲーム開発ではチームの中の誰でも要求は出したりするけど)

ソフトウェア開発者ではない人がどうやって作るかというやり方まで伝えると、ソフトウェアの抽象化がうまくいかないことが起こりうる。

ソフトウェア開発はまだまだ確立されていない分野で、同じ機能を作っても開発者によって全然違う作り方になるし、その違いの中には保守性が全く無い作りになる恐れがある。

良い開発者であれば保守性も重要な関心事として捉えるので、専門家に任せて欲しいという意味でもこのプラクティスがある。

多くの場合開発者は、仕様書やユースケース記述を読みそっくりそのままコードに落とし込んでしまう。そしてそれは解決方法をあとで一般化することを困難にする。

プロダクトオーナーは開発者にやり方を教えるのでなく、終わらせてほしいことに焦点を合わせるように気をつけなければいけない。そうすることによって開発者に裁量が与えられ、より保守性の高い解決方法を思いつくことができる。

「レガシーコードからの脱却」p75より

先日ホットエントリーに入っていた、こちらのスライドでも同じテーマを感じた。

speakerdeck.com

Why?から始めることが人間をどう動かしていくかについて、こちらのTED動画でも述べている。

www.ted.com

完了と、完了の完了と、完了の完了の完了

インパクトがあった箇所。

著者は、完了には3つの定義あると言っていて、

  • 完了
    • 開発者が自分のマシンで結果を確認した状態。
  • 完了の完了
    • ビルドにも統合されている状態。
  • 完了の完了の完了
    • ビルドにも統合されていて、クリーンで保守可能になっている状態。

であり、著者が「完了」と言うときは、「完了の完了の完了」という意味で使っている。

対して自分が使う完了はここで言う「完了」か「完了の完了」くらいのことが多く、クリーンで保守可能な状態にするのは後回しにしたり辿り着かないままであったりする。

またこの記事のタイトルにも書いた通り、本を1回読み終わった時もここでいう「完了」ぐらいの状態で、再読やアウトプットによって理解を深めて「読了の読了の読了」の状態にしていくべきだと感じた。

下の記事でも再読の重要性を述べていて、新刊ばかりに飛びつかずに「読了の読了の読了」にしていかないとなぁ。。

readingmonkey.blog.fc2.com

CLEANコードを作る

CLEANコードは以下の頭文字を集めたコード品質を示す要素のこと。

  • Cohesive: 凝集性
  • Loosely Coupled: 疎結合
  • Encapsulated: カプセル化
  • Assertive: 断定的
  • Nonredundant: 非冗長

今自分がユニットテスト環境をちゃんと作れていないのは、CLEANコードを書けていないからだと自覚している。

これらの詳細については、また別途専門書を読みながら習得していく。

テストに感染する

正直、自分 & チームは、まだまだテストに感染した状態ではないなと思う。

テストファースト開発は設計方法論だ。テスト可能なコードを書くことを強制し、要件を具象化することで、開発者が高い品質のコードを書けるようにするものだ。

「レガシーコードからの脱却」p197より

より高い品質のコードが書けるチームになれるように、自分がテストの感染元となってパンデミック起こしていきたいなぁと思った。

junit.sourceforge.net

次はレガシーコード改善ガイド

先日書いた記事の通り、最近はUnity開発のテスト自動化に向けて色々試している。

kidooom.hatenadiary.jp

積読している「レガシーコード改善ガイド」にも、テストの無いレガシーコード環境をいかに改善していくかが書かれているので、ちゃんと読みながら今まで自分が産み出してきたレガシーコードを改善していかねば・・・。

抽象化がうまくなるように、いろいろな言葉とバイアスを学ぶ

9年振りに読んだ「プログラマが知るべき97のこと」から学んだことシリーズその3

その1と2はこっち

kidooom.hatenadiary.jp

kidooom.hatenadiary.jp

48 いろいろな言葉を学ぶ

いろいろな言葉を学ぶ | プログラマが知るべき97のこと

私の知る限り、優秀なプログラマプログラミング言語を巧みに操るだけでなく、自然言語も非常にうまく使うことができます。話す力が大事なのは、他人とのコミュニケーションが円滑にできるからだけではありません。自分の思考を明確にするためにも、話す能力は重要なのです。この能力は問題を抽象化する際には欠かせません。そして抽象化こそ、プログラミングの核心です。

プログラマーはコミュニケーション能力が低いオタクのような描写をされることが多いが、自分が現実世界で観測している優秀なプログラマはだいたいそんなことは無く、ブログや書籍執筆・カンファレンスでの登壇などで非常に高いコミュニケーション能力を発揮している。

抽象化がプログラミングの核心なんだなぁと日々感じることも多くなっていて、テスト容易性や変更容易性などを考慮した設計のためには、具体的なコードから作るのではなくインタフェース設計等の抽象化した階層で考える必要がある。

抽象化は、作る対象の「言葉」に精通していてこそできるのであって、先日読んだ「現場で役立つシステム設計の原則」でも紹介されているDDD(ドメイン駆動開発)のような考え方が重要だなと改めて理解した。

kidooom.hatenadiary.jp

54 見えないものを見えるように

見えないものを見えるように | プログラマが知るべき97のこと

ソフトウェアには、見えないことが良い性質をもたらすこともあれば、見えないことによる問題が起きやすい性質がある。

見えないことが良いことの例としては、「情報隠蔽」「カプセル化」「疎結合」などの依存性をなくしたり、情報を減らすことによる人間の認知コストを減らすものがある。

問題は、ソフトウェア(と人間の中身)は基本的に見えないものであるので、見えないものを見えるようにする努力をしないと以下のような問題が起きてしまう。

  • 順調そのものに見えたプロジェクトが突如、「実はこのままだと完了が半年遅れになる状況」だと判明する

  • 機能を盛りすぎた結果、スケジュールの後半に致命的なパフォーマンス問題が発生する

  • モチベーションがあると思っていた主要メンバーが、実はメンタルを病んでいて突然来なくなってしまう

「なんとなく品質良くなってきたな」とか「性能測ってないけど、まあ体感大丈夫だろ」というのはバイアスかかりまくった歪みの結果になってしまうので、ちゃんと計測できるようにしてバイアス取り除いていくことが大切。

また、よく陥りがちなバイアスも知っておきたいのも対策の一つかなと思う。

twitter.com

この中でも特に「ダチョウ効果」は、わざと見ないことにすることで問題なんて存在しなかったことにするバイアスで、人間は「見えないものを見えるように」とは逆のことも犯しうるから気をつけないといけないと思った。

カジュアル瞑想の習慣をつけていく

手軽にもっと瞑想をやっていこうと思い、「なまけ者の3分間瞑想法」を読んだ。

瞑想のことを胡散臭いと思っていた時期もあるけれど、最近は科学的検証でポジティブな実験結果が出ているので、プラセボ効果を超えた効果を期待してもいいのかもしれない。

gigazine.net

本書の中でも瞑想を「心のフィットネス」と呼んでいて、瞑想によって期待できる効果について説明している。

なまけ者の3分間瞑想法

難しい瞑想法は色々あるけれど、怠け者でもできる手軽な瞑想法として、「呼吸を数える」と「歩行と呼吸」を紹介している。

「呼吸を数える」では、単純に吸って吐いてをゆっくり数字を数えながら繰り返すだけ。

ここでポイントは、自分はいま瞑想していることを忘れないということ

集中が途切れたことに気づき次第、瞑想に戻す。

この途切れ -> 戻す のサイクルが筋トレのようなもので、自分の心を支配できるようにするための練習になっている。

(ほんとかよ と思うかもしれないが、まあそういうものだと信じておこう)

歩行瞑想の方は、ゆっくり歩きながら動かす足の裏に注意を集中する方法。

歩いているとどんどん頭の中に思考(邪念)が発生してくるので、それに気付き次第、また足の裏に集中を戻す。

自分はこの歩行瞑想を、会社の階段(1F ~ 15F)を登りながら毎日やっている。

kidooom.hatenadiary.jp

自分への思いやり、セルフコンパッション

前にもブログに書いた、セルフコンパッションの効果が瞑想にもある。

kidooom.hatenadiary.jp

自分を責めたり挫折を感じてしまった時など、ネガティブ感情が発生したことに気づき、前向きになれるように意識を集中する。

それが自然にできるようになるための練習が瞑想になる。

アインシュタインも以下のような名言を残している。

どうして自分を責めるんですか?

他人がちゃんと必要な時に責めてくれるんだから

いいじゃないですか。

Googleもやってる

Googleでも社員研修の中でマインドフルネス瞑想を実践している。

life-and-mind.com

CEDEC2019の心理的安全性に関する講演の中でも、このGoogleの研修を参考にしてマインドフルネス瞑想やセルフコンパッションを取り入れて、チームの雰囲気を改善していったと発表されていた。

kidooom.hatenadiary.jp

まとめ

「体を鍛えるように、心も鍛えておいた方がまあ良いよね」という信じておいたほうが得する理論が自分にもしっくり来たので、瞑想も今後毎日やっていこうと思う。

Coursera Machine Learningコースの2週目までの復習

Coursera Machine Learningコースの2週目プラグラミング課題を何とか終えて3週目に突入できたが、結構苦戦したので復習のメモをしておく。

kidooom.hatenadiary.jp

Octaveの基本操作振り返り

行列操作周り

3x2行列を定義する場合は、以下のようにスペースorカンマで同じ行内の異なる列の数値を定義し、セミコロン(;)で行を分ける。

octave:5> A = [1 2; 3 4; 5 6;]
A =
   1   2
   3   4
   5   6

転置行列は ' をつけるだけ

ans =

   1   3   5
   2   4   6

逆行列は pinv関数を使う

octave:7> pinv(A)
ans =

  -1.33333  -0.33333   0.66667
   1.08333   0.33333  -0.41667

A行列の特定の値にアクセスしたい場合は、()で行番号と列番号を指定する。

A =
   1   2
   3   4
   5   6

octave:9> A(3, 1) # Aの3行1列目の値を取得
ans =  5
octave:10> A(2, 2) # Aの2行2列目の値を取得
ans =  4

Octaveで行列のindexを示すときは 1 始まりなので注意(こういう配列系はよく0始まりの言語多いから)

octave:11> A(2, 4)
error: A(I,J): column index out of bounds; value 4 out of bound 2

ここで、コロンがよく使われる特別な意味で、全てのを表す(正規表現でいうところのアスタリスク 的な)

A =
   1   2
   3   4
   5   6

octave:11> A(2, :) # Aの2行目の全ての値
ans =

   3   4

octave:12> A(:, 2) # Aの2列目の全ての値
ans =

   2
   4
   6

行列の行数と列数は size関数を使って取得できる

octave:13> size(A, 1) # 行数取得
ans =  3
octave:14> size(A, 2) # 列数取得
ans =  2

ones, zeros 関数でそれぞれ全ての値が1, 0 の m * n 行列を生成してくれる。

octave:15> B = ones(3, 4)
B =

   1   1   1   1
   1   1   1   1
   1   1   1   1

octave:16> B = zeros(2, 1)
B =

   0
   0

eye関数で単位行列を生成してくれる。

octave:17> eye(4)
ans =

Diagonal Matrix

   1   0   0   0
   0   1   0   0
   0   0   1   0
   0   0   0   1

magic関数で、どの行、列、斜めを足し合わせても同じ数になる特別な行列を生成してくれる(サンプルデータ生成に便利)

ans =

   35    1    6   26   19   24
    3   32    7   21   23   25
   31    9    2   22   27   20
    8   28   33   17   10   15
   30    5   34   12   14   16
    4   36   29   13   18   11

ドット演算が重要で、普通に行列演算したい場合は * だけでいいが、各行列の同じ行・列の値で掛け算をしたい場合はドットをアスタリスクの前につける。

A =

   1   2
   3   4
   5   6

octave:31> B
B =  3
octave:32> B = [3;4;5]
B =

   3
   4
   5

octave:33> A * B
error: operator *: nonconformant arguments (op1 is 3x2, op2 is 3x1)
octave:33> A .* B
warning: product: automatic broadcasting operation applied
ans =

    3    6
   12   16
   25   30
octave:34> A
A =

   1   2
   3   4
   5   6

octave:35> B = [3 5]
B =

   3   5

octave:36> A * B
error: operator *: nonconformant arguments (op1 is 3x2, op2 is 1x2)
octave:36> A .* B
warning: product: automatic broadcasting operation applied
ans =

    3   10
    9   20
   15   30
octave:38> A
A =

   1   2
   3   4
   5   6

octave:39> B
B =

   10   20
   30   40
   50   60

octave:40> A * B
error: operator *: nonconformant arguments (op1 is 3x2, op2 is 3x2)
octave:40> A .* B
ans =

    10    40
    90   160
   250   360

制御構文

for文は普通に使える。 1:10 とすることで、1 から インクリメントされて 10 まで i が代入されて実行される。endでくくる。

octave:41> for i=1:10
> A = A .* i
> end

if文も使える。使い勝手は他の言語と同じ。

octave:48> for i=1:10
> if i == 5
> i
> end
> end

i =  5

Octaveで単回帰分析(linear regression)の目的関数(cost function)を実装

これはプログラミング課題で悩んだところで、そのまま書くと答えバラシになるので自分用のヒントになるものをメモ。

シグマ計算はsum関数を使う。

octave:57> A
A =

   1   2
   3   4
   5   6

octave:58> B
B =

   1
   2
   3

octave:59> A + B
warning: operator +: automatic broadcasting operation applied
ans =

   2   3
   5   6
   8   9

octave:60> sum(A + B)
warning: operator +: automatic broadcasting operation applied
ans =

   15   18

Octaveで単回帰分析(linear regression)の最急降下法(gradient descent)を実装

上と同じくプログラミング課題でめちゃくちゃ悩んだところで、そのまま書くと答えバラシになるので自分用のヒントになるものをメモ。

gradient descentでは、thetaをそれぞれ同時に(simultaneously)計算する必要があるので、一旦 theta 値を外の値に退避しておく。

    org_theta = theta;
    theta(1) = org_theta(1) - alpha / m * sum((X * org_theta - y) .* X(:,1));

ここは正直、ググらずにヒント無しでは解けなかった。

重回帰分析 (linear regression with multiple variables)の feature scaling をする方法

ここはテストで何度も間違えてお手上げ状態になったので、こちらのQiita記事を見て何とか正解することができた。

qiita.com

input の X が複数あって、それぞれの数値の範囲に大きな差がある場合(特徴1が 1 - 100 の範囲で、特徴2が0.001 - 0.002 の範囲など)は、feature scalingをして全てのXの値の範囲をおおよそ−1 ≤ x _ i ≤ 1にする必要がある。

その式が以下の通り。ここで mean(x) はベクトルxの平均値。


x _ i= \frac{x _ i−mean(x)}{max(x)−min(x)}

まとめ

プログラミング課題をやることで、自分がまだ全然理解できてないことを確かめられたので良かった。

最初の関門を通れた気がしてやる気も増したので、3週目以降も頑張ろう。

参考

qiita.com

qiita.com

qiita.com

qiita.com

7shi.hateblo.jp