【備忘】Rcppパッケージ使うためのURL集
the 備忘 of 備忘
直近の仕事には使わないけど、(たぶん)数ヶ月以内に舞い降ってくるであろう仕事では、最適化計算の速度をあげる必要があるので、さすがに避けられなくなってきたか。
Rと比べて C++ で書くことによって特に高速化が見込めるのは次のようなケースです。
らしいが、今回の場合はどうなんだろう...(わかってないんかい)
Link
・みんなのRcpp
→ 日本語で詳細かつ「C++にもそれほど詳しくない方々に対しても Rcpp を利用するのに必要な情報を提供することを目的として」いるため、ハードルも低そう。ここからはじめるのが本筋か。
・Rcpp · Advanced R.
→Hadley Wickham(唯一神)が書いてるページみたいだが使いやすさは不明
・アルマジロその1. 行列操作編 - サボタージュ禁止のおさぼり日記
・アルマジロその2. 演算編 - サボタージュ禁止のおさぼり日記
・アルマジロその3. 線形代数編 - サボタージュ禁止のおさぼり日記
・RcppArmadilloでnumericMatrix型を扱う | 竹林の事前分布
→行列計算するには、もうひとつパッケージ (RcppArmadillo)が必要らしい。その情報(めんどくせぇ....)。
ダンゴムシでもわかる特異値分解(SVD)
Introduction
この世に生を受けて30年以上たつけど、もう5万回くらいSVDのやりかたを覚えて忘れてまた覚え直すを繰り返している。
肌身に染み込んで行かないのが文系ブレインの限界ですよね...
ゆえに、SVDの概要・用途・実装方法をここに記す。
[参考文献]
①:千葉大羽石研究室のサイト(授業「医用画像工学」のスライド)
②:小野滋さんのWeb上の公開資料(Greenacre1984の和訳・解説)
③:ボレガラ・岡崎・前原, 2016, 「ウェブデータの機械学習」,pp.158-162.
SVDの概要
基本の定義
任意のm × nの実数行列があるときに、次元m×mの直交行列と、次元n× nの直交行列、
そして非対角成分がゼロで対角成分が、
となる行列が存在し(この非ゼロの対角成分を 特異値とよぶ)
と変形できる。
便利な別表現
とすれば、以下のようにも、表現できる。
基本性質
前提知識:フロベニウスノルムによる距離の定義
をフロベニウスノルムという。
ちなみに2つめの等号においては、次元数の等しい行列の成分の積の総和は、のトレースに等しいという性質(参考URL)を利用している。
( なので)
このフロベニウスノルムを使うと、二つの行列の距離を として定義できる。
性質①:最小二乗近似を得る方法としてのSVD
行列のSVDが得られているとき、降順に並んだ個の特異値と、それに対応する左右の特異ベクトルからなる
は、
すべてのランクの行列のなかで、距離 を最小化するような行列となる。
すなわち、この意味では、の「ランクの最小二乗近似」であるといえる。
性質②:行列と転置行列との積の成分分解
SVDにより、が得られているとき、以下が自明に導かれる。
ここで、と表現することとすると
となり、やが分析対象として意味のある行列のときは、
それぞれを左右の特異ベクトルと特異値の二乗を用いてランクkで表すことができる。
性質②の具体的な例
「やが分析対象として意味のある行列のとき」とかいきなり言われてもピンとこないと思うので、一つ例をあげよう。
たとえばm人分のケースについてnつの変数の観測値を保存した行列があり、
そこから各列について、変数の平均値を差し引いて中心化した行列を得る。
すると、ランクn×nの行列は、変数の分散共分散行列(にスカラmをかけたもの)になるし、
いっぽうで、ランクm×mの行列は個人間の距離(にスカラnをかけたもの)を表した行列(対角成分は重心からの距離)になる。
したがって、についてSVDを適用しておけば、
変数のばらつき(分散・共分散)や、個人間の距離についての全ての情報を、k個のベクトルの線形和として表現できる。
(厳密にはもっと説明が必要だけど)これが、いわゆる主成分分析の大枠である。
カテゴリカルな変数に対して用いられる「対応分析」や「多重対応分析」と言われる手法も、のをどう選ぶかだけの違いに帰着して説明することができる。
(詳しくは別稿で)
その意味で、SVDは多くの分析手法を統合的に理解するうえで非常に強力な方法・枠組みだといえよう。
性質③:2つの特異ベクトル間の変換
もう一度、SVDの別表現を記載する。
この式の両辺に、右特異ベクトルをかけると、特異ベクトルの正規直交性から、以下のようになる。
ゆえに、
となり、左特異ベクトルを右特異ベクトルとSVDの適用対象行列、そして特異値によって表現することができる。
また、上の別表現を転置したのちに右からをかけることで、同様に
を得られる。
実装方法
以下の手順を実装すればいい。Simple!
- あるいは(通常は計算量が少ない方、すなわちm < nだったら、m > n だったら)を固有値分解し、その結果から特異値の対角行列と右あるいは左特異行列もしくはを得る。
- 上記の性質③の変換式を利用して、との得られていない方を得る。
ちなみにあるいはは対称行列なので、いくつかの効率的な固有値・固有値分解計算の効率的な方法(ヤコビ法、3重対角行列を用いた逆反復法、ユーザーである我々は詳しく知る必要はない..)が使えるよ。
Rで確認
Rにはsvd()というSVDのための関数が備え付けであるが、一応上の方法で計算されていることを確認するために検算してみる
# 適用データ生成 # 元データは、Clausen,1998=2015「対応分析入門」, p.189より tbl <- matrix( c( 395 , 2456 , 1758 , 147 , 153 , 916 , 694 , 327 , 1347) , byrow=3 , ncol = 3) colnames(tbl) <- c("強盗" , "詐欺", "破壊") rownames(tbl) <- c( "オスロ" , "中部地域", "北部地域") #分布に変換 tbl_p <- tbl / sum(tbl) mgn_c <- apply( tbl_p , 2, sum)#列周辺分布 mgn_r <- apply( tbl_p , 1, sum) #行周辺分布 D_clm <- diag(1/sqrt(mgn_c)) #列周辺分布の-1/2乗を対角成分とした行列 D_row <- diag(1/sqrt(mgn_r)) #行周辺分布の-1/2乗を対角成分とした行列 # SVDを適用する対象の行列をつくる。 mat_A <- D_clm %*% (tbl_p - mgn_r %o% mgn_c) %*% D_row ## SVDを適用する svd_res <- svd( mat_A) #--結果--# # ちなみに上記の解説とはuとvが逆になってるので、注意が必要(uが左, vが右) #$d (特異値) #[1] 7.927067e-01 8.484083e-02 1.339025e-17 # #$u(左特異ベクトル) # [,1] [,2] [,3] #[1,] -0.9210524 0.02831857 0.3884076 #[2,] 0.2288391 -0.76764442 0.5986273 #[3,] 0.3151112 0.64025003 0.7005604 #$v (右特異ベクトル) # [,1] [,2] [,3] #[1,] 0.1744326 0.6379811 0.7500356 #[2,] -0.8992856 -0.2070410 0.3852524 #[3,] 0.4010719 -0.7416968 0.5376125 ## 実際に固有値を利用する方法でやってみるver #今回は行列Aが正方行列なので計算量的にはどっちでもいいが、 #とりあえず、左特異ベクトルを求めてから変換公式で右特異ベクトルを求める形にする。 mat_B <- mat_A %*% t(mat_A) #固有値分解の対象行列を生成 evd_res <- eigen(mat_B, TRUE) #固有値分解する sval <- sqrt(evd_res$values ) #平方根をとることで特異値をえる u_vec <- evd_res$vectors #左特異ベクトルを得る v_vec <- t(mat_A) %*% u_vec %*% diag( 1/ sval) #変換公式 v = 1/λ * A^t * u を適用 #補足: 1/λjを対角成分とする対角行列を右からかけることによってj列を1/λj倍している ### 固有値分解をアプローチによる結果 ### #> sval #[1] 7.927067e-01 8.484083e-02 8.575436e-09 #> u_vec # [,1] [,2] [,3] #[1,] 0.9210524 0.02831857 -0.3884076 #[2,] -0.2288391 -0.76764442 -0.5986273 #[3,] -0.3151112 0.64025003 -0.7005604 #> v_vec # [,1] [,2] [,3] #[1,] -0.1744326 0.6379811 -1.941982e-08 #[2,] 0.8992856 -0.2070410 -6.473275e-09 #[3,] -0.4010719 -0.7416968 2.427478e-08 #--この場合、二軸で分散を説明しきっているので、3個目/3列目の特異値/特異ベクトルは誤差というか無視して良い #--2つ目までのの特異値と特異ベクトルは先ほどのsvd()関数の戻り値と完全に一致しており、求める結果が得られた #--なおひとつめの特異ベクトルは符号が違うが、左右一緒に同一固有値に対応する特異ベクトルの符号を変えさえすれば-1をかけてもよい(正規直交基底の性質と変換公式を考えれば明らか)
Conclusion
さいきんは、ずっと、これをきいている...
www.youtube.com
SVDがとても便利だってわかって、さらにその仕組みがわかったので、
次はSVDの枠組みでMCA(多重対応分析)とCA(対応分析)を説明するYO!
SVDがわかると両手法の仕組みや違い・共通点を超エレガントに説明できるYO!
Enjoy!
Catch up!(藤井猛, 2017, 「四間飛車上達法」)
- 作者: 藤井猛
- 出版社/メーカー: 浅川書房
- 発売日: 2017/12/25
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
非常にいい本だった(さすが藤井"てんてー"御大)
急戦(棒銀)への対応の定跡について、ここまでいろんな思想を交えながら詳説してくれる書はあまりなかったのではないだろうか。
しかし何より白眉は、藤井九段の生き方が凝縮されているような次の一言にある。
このために1400円(税別)を払ってもいいくらいだ。
至言
p.55より抜粋。
私はスタートが遅かったんですよ。
研修会に入ったのが14歳のとき、そして高校一年になるときに奨励会に入ったんです。
早熟の天才がごろごろといるこの世界では、記録的に遅い部類に入ります。
しかも私は、将棋教室などには行かず、一人で本を読んで勉強していました。
考えながら読むというより、最初はただひたすら読む、ただ読む、という感じです。
一冊の本をボロボロになるまで読む。将棋の月刊誌をひたすら読む。
そのうち棋譜が全部頭の中に入ります。
すると知らないうちに、本に書いてない変化も含めて考えることができるようになる。
月刊誌であればひと月後に次の号が出て、あとは同じことの繰り返しです。
それが私の勉強法でした。
さすがにアマチュアの三段くらいになってからは実戦を指す機会も増えましたが、
それでも1日に数局を上限としました。その数局を集中して指す。
そして局後の検討を真剣にやって、反省すべき点をきちんと洗い出す。
私は、指す戦法も指す局数も、厳選して強くなったタイプなんです。
非常に示唆的である。
分野を問わない、ビハインドを負った状態からの弱者の逆転法のエッセンスが詰め込まれたエピソードだ。
Conclusion
あのウサギとカメの例のレースは教訓としてアレなケース
勝者敗者いずれにしたってダメ ウサギはバカで油断しちゃっただけ
ある意味カメはさらにそれ以下 敵のミス待ちってそれでいいのか?
天賦の才能を弱者代表が打ち負かし格差解消
しようって場面でカメは無策すぎ 勝算もねぇのに余りにウカツすぎ
そういうとこマジしょせん動物の限界
....
武器はたゆまぬK.U.F.U.
常に練習 常に研究
知恵を結集し 君をレスキュー
弱者が勝ち上がるとこに見出す人間の叡智!
藤井システム最強!Enjoy!
「世界を動かすプロジェクトマネジメントの教科書」(佐藤知一, 2015)
モチうめぇ。ピザうめぇ。
Introduction
プロジェクト・マネジメントという概念やその実行技術というものは、 業界や立場、そしてチームで仕事をするか/個人で仕事をするかという違いを超えて必要な知識だと思う。
(学校で教えてもいいくらいだと思う。道徳や総合学習よりよっぽど健全な社会の形成に役立つだろう)
どうやって仕事を適度な作業単位に分解しどうやってスケジュールに落とし込むのか、
そしてどう進捗を管理していくか、というのは(やや大仰な言い方だけど)人生のコア・スキルであると思うのだが、 意外と誰も教えてくれないのである。
ただ、PMBOKやP2Mなどの規格となるような知識体系はややとっつきにくく、 実際の使用シーンに応用しづらいきらいがある。
その点、日揮にお勤めの佐藤氏は、ブログ(タイム・コンサルタントの日誌から)や個人サイト(マネジメントのテクノロジーを考える)において、実際にプロジェクトをマネジメントしていくうえでの、ノウハウや考え方、ツールの作り方・使い方に関して、業務経験で培った肌感覚に沿ったわかりやすい語り口で解説してくれている。正直めっちゃありがたい。
世界を動かすプロジェクトマネジメントの教科書 ~グローバルなチャレンジを成功させるOSの作り方
- 作者: 佐藤知一
- 出版社/メーカー: 技術評論社
- 発売日: 2015/09/17
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (2件) を見る
その佐藤氏の著書である本書では、海外プロジェクトに抜擢された若手エンジニアが、
PMの達人である大学の先輩に、教えを乞うというストーリー形式でわかりやすくproject mangementの要点が解説されている。
(類似本にありがちな)「Xつのポイント」的な感じで列挙してくのではなく、実際の作業手順まで示してくれている点が白眉だと思う。
Amazonのレビューでも指摘されているが、本のタイトルが若干軽い感じ(意識高い系な感じ)なので誤解をうけてしまいそうなるのが心配になるほど、実用的な本だ。
備忘用メモ
備忘用に重要だと思う箇所だけ抜き書きしてく。
プロジェクト = アクティビティの連関という世界観(p.52)
じつは、現代プロジェクトマネジメントの理論や技法は、1950年代に米国において、プロジェクトという大きな仕事の塊を「システム」と捉えたことからはじまったのです。
プロジェクトを「アクティビティ」と呼ぶ作業要素が違いに連関したシステムだと考えました。
そこから、重要な技法が次々に生まれたのです。
逆にいえば、ひとつひとつの要素のアクティビティがしっかり定義されているからこそ、しっかりとしたシステム=プロジェクトが成立する。
アクティビティの形式(pp.70-71)
- アクティビティとは、プロジェクトを構成する「部品」である
- アクティビティの具体的構造とは、インプット・アウトプット(成果物/完了状態)・リソースと指示・報告である
- なんども似た形のもの繰り返されるようなのPJTについては特にアクティビティ・リスト(=WBS辞書)を作る必要がある。これは仕事のBOM(部品表)のようなものである。
だれでも正しいWBSを作れる方法(pp.75-)
本全体のキモとなる部分かもしれない。
WBSの作り方は、成果物の分解構造からアプローチする方法(P-WBS)と、作業フローに沿った仕事の機能的な分解から作る方法(F-WBS)が存在する。
どちらも有力な方法*1だが、この本では両者の考え方を組みあわせることでアクティビティを洗い出す方法を推奨している。
紹介されているWBSの作成手順は以下の通り。
- プロジェクトの「成果物の構造図」をつくる(→P-WBS的発想)
- プロジェクトが最終成果物にいたるまでの仕事の「プロセスの構造図」をつくる(→F-WBS的発想)
- 両者のマトリクスを作成する
- マトリクスのマス目(=最小単位のアクティビティ)をグループ化して、適正なワークパッケージを形成する
- マネジメントの分担を意識して、ワークパッケージに整理番号をふり、WBSに構造化する。
- 各ワークパッケージのインプット・アウトプット・必要リソースを、アクティビティリストに記述する(=WBS辞書の完成)
実際の作業イメージも本のなかでは示されていて、とてもわかりやすかった。
会社によってはF-WBSのコード体系が共通で整備されていて、そのコードが社内言語化されているし実績もコード別に管理されている、というエピソード(おそらく佐藤氏の勤務先の日揮のことだろう..)も興味深い。
「一回限りの仕事=Project」をマネジメントするための知識体系ではあるけれど、
それでも共通化できる部分のマスタを整備して、練度を高めて高速化するのがこういった技法のもうひとつの使い方ではないか。
スケジューリングの方法(pp.115-121)
クリティカル・パス法の説明などの部分である。
- アクティビティリスト上で、各アクティビティに対して「先行アクティビティ」が何であるか明確にしておく。
- アクティビティリスト上で、各アクティビティの所要工数が定義されている
- プレシーデンスダイアグラム(Precedence Diagram)を書いて、順序関係を図示する
- 一番はじめのアクティビティから後続のアクティビティに向かって、最早着手日と最早完了日を順番に書き込んでいく(ここでクリティカル・パス*2がわかる)
- 最後のアクティビティから前のアクティビティにさかのぼっていくように、最遅完了日と最遅着手日を画定していく
ちなみに4は「フォワードスケジューリング」、5は「バックワードスケジューリング」と言う。
いきなりガントチャートとか引く前に、順序関係を図示したほうがいいよね、っていう話。
クリティカル・パスの短縮化の定石(pp.122-125)
どうしても納期を短縮したいときには、
- ゆとりの集中化(個人がもっているバッファを集中管理した上で削減する)
- 並列作業化
の2つの方法を使う。前者はチーム・プレーのときのみ使えるワザで、後者がより個人単位の仕事にも用いやすい。
クリティカル・パス上のあるアクティビティの完了が次のアクティビティの開始条件になっているとき、
実は先行アクティビティを100%完了させることが、次のアクティビティに必要でない(例えば70%段階まで仕上げられれば次に移れる)場合がある。
こういった場合に、先行アクティビティを構成するいくつかの作業のうち、後続アクティビティに必要な部分のみ完了した時点に最早着手日をずらす、という方法をとる、というのが「並列作業化」が意味するところである。
(実際にこういった変更を施す場合は、後続アクティビティに必要部分とそうでない部分に分割して、別々のアクティビティとして定義し直すほうがスマートだろう。たぶん。)
このような操作を行った場合に、クリティカル・パスが別の経路にうつることがあるのでそれも考慮すべしである、とのこと。
この「並行作業化」は大人数が関わる共同作業としてのプロジェクトだけでなく、個人で行なっている様々な仕事を高速化するための方法論としても有効だと感じた。
当然視されているタスクA→タスクBというフローを、タスクAをa1, a2, a3と分割することによってa1→a2→B(並行してa3)といった感じに短縮することができないか常に検討する姿勢が重要だろう。
工程表への追記によるスケジュール管理
・なんかかっこいいところ
工程表は、航海士にとっての海図に似ています。
工程表もつくらずにプロジェクトを始めるのは、海図を持たずに航海に出るようなものです。もちろん、多くの会社は最初に工程表をつくってはいるでしょう。
ただ、それを最後までアップデートせずに使い続けるところも少なくないようです。
ちょうど、航海に出たけれど、海図に自船の現在位置や進路や速度をいっさい記入しない航海士のようなものですね。
(p.163)
・ガントチャート上で進捗を示すときは、「イナズマ線表記」か「二重線表記」のいずれかを使う。
(→後者しかなじみがなかったので、イナズマ線表記のほうが直感的でいいなと思った)
・よりわかりやすくかつ可視的・参加的な方法として、F-WBS × P-WBSのマトリックス上にそのままポストイットを貼っていって進捗を管理する方法もある(→これ結構いいな)
Conclusion
身も蓋もないけど、ちゃんと締め切りを守れるようにするためには、まずしっかりWBSを作ろう。
んで、いきなり天守閣をつくるのではなく石垣たるアクティビティをしっかり定義しようっていうのが著者の主張で、それは正鵠を射ている。
WBSを作るような思考習慣っていうのは、(ロジックツリーとかの広まりとともに)それなりにもう日本にも根付いてきたといえるが、
そもそもWBSのマスタとしてのアクティビティ・リストを整備するのが管理のためにも作業全体の高速化のためにも大事だぜっていうのが、佐藤氏の主張の特徴的かつ示唆的なところだといえる。
brevis.exblog.jp
brevis.exblog.jp
佐藤氏の最近のブログの記事(↑)でも指摘されているように、いきなり工程表を引いたり、
WBSを書き下すのではなく、まず「基本部品」たるアクティビティの定義がなされて、その組み合わせとしてプロジェクトを表現する、というのが本筋である。
Enjoy!
word for Mac 2016で数式挿入のshortcutを設定する
the 備忘of備忘。
従来word for Macでは「ctrl + =」が数式の挿入のKeyだったが、2016ではそうなっていないので、
以下の手順を踏んで自分で設定する必要がある。
- 「ツール」→「ショートカット キーのユーザー設定」を選択
- 「分類」で「すべてのコマンド」を選び、「コマンド」で「数式挿入」を選び、下のボックスで適当なキー(Ctrl + Command + - とかが無難)を選んで「割り当て」ボタンを押す。
固定効果モデルでロバスト標準誤差 in R
備忘用メモ。
Rでパネルデータを扱うときに、固定効果モデルを行うときは、
plmパッケージを使うのが一般的だ。
最近の社会科学(経済学、社会学etc)で固定効果モデルを使うとき、
table上で報告されるのは、頑健標準誤差(robust standard error)である場合が多い。
従属変数がy , 独立変数x1 , x2 とする
Stataで
Stataを使って分析するときは、以下のようなコードをかくことになる。
xtreg y x1 x2, fe vce(id time)
Rで
Rで固定効果モデルを行い、
上のStataコードと同じ標準誤差を得たい場合には、以下のようなコードになる
library(plm) p_data <- pdata.frame( test_data , index= c("id", "time") ) #plm用にデータ変換 fe_res <- plm( y ~ x1 + x2 , data = p_data , model="within") #plmで推定 ### clusterロバスト標準誤差を手に入れる ### cluster_n <- length(unique(test_data$id) ) #クラスタ数をみる library(lmtest) coeftest( fe_res , vcovHC(fe_res, type="HC1" , cluster = "id" ) * (cluster_n / (cluster_n - 1)) )
・plm()の戻り値に、クラスター変数を指定しつつvcovHC()を噛ませて、係数推定値のcluster-robustな分散共分散行列を得ている。
・coeftest() 関数の引数として指定する際には、clusterの数を取得しておき[クラスター数 / (クラスター数 - 1) ] を、vcov()の戻り値にかけて補正する。
なんでこうする必要があるのか
なぜこのような回りくどい補正が必要であるのかは、以下の記事(の最初の回答)に詳しい。
stata - Clustered standard errors in R using plm (with fixed effects) - Stack Overflow
・Stataでクラスターロバスト標準誤差を求めるとき、標準誤差を補正するためのスケールパラメータとして、
はクラスター数、Kはパラメータ数、Nはケース数とすると、
を分散共分散行列にかけている。
・しかしRの場合は、スケールパラメータの第2項しか使っていないために、
Stataでの出力に合わせるためには、vcovHC()の出力に第1項を外からかけてやる必要があるのである。
『「超」発想法』(野口悠紀雄, 2000)
Introduction
ヒラノ教授シリーズもあらかた読んだので、今野浩の高校の同級生である野口悠紀雄の本をよむ。
とりあえず今野氏が描く野口氏は、スーパーウルトラ猛烈ハイスペック勉強マシーンという感じである。
(「あのころ、僕たちは日本の未来を真剣に考えていた」のなかで今野氏は、実は野口氏がバツイチだということを暴露しているが、これは本人の許諾をとっているのだろうか...)
ヒラノ教授もパワフルな老人だが、野口氏も(最近なんかで読んだんだけど)散歩しながら浮かんだアイディアを音声メモで記録して、帰宅したらすぐに原稿に起こすようなスーパー後期高齢ソルジャーである。
自分が仕事で尊敬する師匠にもそういう人がいるのだが、1940年代生まれでずっと第一線を駆け抜けてきた人の底力ってやばすぎるよね..
- 作者: 野口悠紀雄
- 出版社/メーカー: 講談社
- 発売日: 2015/09/25
- メディア: Kindle版
- この商品を含むブログを見る
「超」XX法シリーズは、かなり売れているが、まぁ職業柄これから読もう。
内容
かいつまんでね..
1章:「超」発想法の基本原則
野口長老曰く、以下5つが発想を導くとのこと。
- 発想は、既存のアイディアの組み替えで生じる。模倣なくして創造なし。
- アイディアの組み替えは、頭の中で行われる。
- データを頭に詰め込む作業(勉強)がまず必要
- 環境が発想を左右する
- 強いモチベーションが必要
(個人的感想)
「模倣なくして創造なし」というのは強く同意する。まず勉強が必要というのもそうだろう。
ただなー。2点目と5点目はマッチョイズムが透けて見えるというか、今野浩曰く「1日16時間勉強する男」だった野口氏ならではなのではないかと思うのである。
たとえば、「アイディアは頭の中でおこなわれる(べきだ)」ということについて、野口氏は以下のように語っている。
全ての思考は頭の中で行われるのだから、これは自明の命題と思われるかもしれない。しかし、必ずしもそうではない。
なぜなら、多くの人は、「アイディアの組み合わせは、カードや発想マニュアルなどの外部的な補助手段の活用で生み出される」と考えているからだ。
そして、そのような手法が、一般に「発想法」だと考えられている。第二原則は、この常識を否定する。「組み合わせ」といっても、可能な数は、膨大になる。
だから、発想の過程で必要なのは、新しい組み合わせを機械的に作ったり、それらをいちいち点検したりすることではなく、
むしろ多数の組み合わせのうちから無意味なものを排除することなのである(p.30)
うーん、これは「ええ感じの組み合わせ」(=アイディアの候補)がほっといても、マニュアル化しなくても出てくる人の論理な気がするなぁ。
「頭脳は、不必要な組み合わせや意味のない組み合わせを自動的に排除する能力をもっている」とポアンカレは言う。カードで組み合わせを試みれば、無意味なものも扱わなければならならくなる。つまり、頭の中で効率的にできることを、わざわざ非効率的にしているのだ。
(中略)それに、発想のための基本的な方法論は、学校の勉強や日常生活、あるいは遊びを通じてすでに取得している。
だから、格別新しい発想法を学ぶ必要はないのである。そして、方法論ばかりを意識していては、アイディアは浮かばない。
手段だけに気をとられると、肝心の発想作業がおろそかになってしまう。
(pp.31-33)
ここらへんがねー。天才側の発想というか、凡人はそもそも基本的な方法論を取得してない、と思うんだよなぁ。
方法論を意識しないとアイディアが浮かばない場合もあるし、方法論を(意識せずとも)何らかのフォーマットによって強制し、それを順次組み合わせることでアイディアを含む成果物が(アホでも、病気がちで体力なくても、メンタルがやられていても)できるようなシステムを構築するのが大事なんじゃないのって思う。
「強いモチベーションが必要」ってそりゃそうなんだけど、そりゃポアンカレや野口氏がモチベーションをもって自分を引き締めれば、
複雑な問題を小さい問題に分割してどういう順番でやればいいのかを判断・処理するっていう一連の流れが頭の中でAutomaticになされるんだろうけど、
そうじゃない人のほうが多いんだよなー。私もそうだけど。
無意味な組み合わせをつくることを排除することと外部出力をしないことは同義じゃないし、
有用な組み合わせを導くことも、無用な組み合わせを取り除くことも、それをうまく手助けするためのヒューリスティクスはありうると思うし追求できるんじゃないか。
このあとの第4章ではKJ法と川喜田二郎がボッコボコに批判されている。
立花隆氏の「これが利点となるのは、頭が鈍い人が集団で考えるときだけである。普通以上の頭の人が一人で考える場合には、これらの特徴は欠点となる」という言葉を引用しつつ、KJ法を以下のように、批判する。
このように、「普通の人は頭の中でやっている作業を、なぜわざわざカードに書く必要があるのか?」という点がKJ法に対する最大の疑問である。
「普通の人」って誰なんだろうっていう反駁が浮かぶのだが、まぁ野口氏のポジションみたいなものを考えると、ある意味それは納得できる。
ronri-rukeichi.hatenablog.com
↑この記事でも書いたんだけど、川喜田二郎は高校大学と隣に梅棹忠夫っていう天才がいて、
どっちかっていうとそういった天才に伍する成果を人工的に集合的につくるうえで、ヒューリスティクス的なエンジニア的な方法をとったわけである。
なんか今野浩と野口悠紀雄という日比谷高校の同級生を並べてみても、似たような関係っていうのはあって、
二人とも東大工学部卒ではあるが、大蔵官僚→経済学者という道を歩んだ野口と、エンジニアとして生きてきた今野はかなり違う。
それは、個の力で周りを圧倒しながら生きるか、集団として周りと協調しながら生きるか、という違いでもある。
自分の頭の中の黒板でだけ色々と組み立てて、その結果を出力するだけでいいなら、
そりゃ天才は個人で「文章にかかないで、宙でかんがえるほうがうまくゆく」(by梅棹忠夫)だろう。
しかし共同研究の多いエンジニアにはそれは許されないし、(エンジニアとは言い難い)川喜田二郎も移動大学では「頭が鈍い人(とは言わないまでも凡人)が集団で考える」成果をよいものにする必要性に迫られたからこそ、より万人でもOutputの質が安定するような方法を見つける必要があったのである。
天才じゃない(っていうか頭の中だけで考えるのが不得手な)立場からすれば、前述の立花発言をもじって、
「頭の中で考えるのが利点となるのは、頭が異常に切れる人が個人で考えるときだけである」と言い返したいところではある。
2章: 発想はどのような行われるか?
天才のマッチョな方法にはなんかあんまり同意できなかった。が、
ポアンカレさんのよい言葉があったので記しておく。
発見するということは、まさに、無用な組み合わせをつくらないで、有用な組合せをつくることに存する。
かかる有用な組合せは、その数きわめて少ない。発見とは識別であり選択である。
(「科学と方法」より)
あと、
3章: 発想の敵たち
「邪魔者を排除して集中しよう。以上!」みたいな章。いや、それも大事だけど。
4章:間違った発想法
なんと1章丸々使ってKJ法批判を展開している。そこまで注力することなのだろうか?
天才には凡人が許せないのか?と思うが、まぁ天才だからしゃーない。
5: 正しい発想法
結構これは部分的に有用なことが書いてある章。
複雑な現実を単純化・抽象化した「モデル」が、多くの学問やビジネスにおけるアイディアの基本っていうのは心から賛同できる。
また、「抽象的なモデルで記述することによって、一見無関係な分野の研究結果が応用できる」(p.148)というのは
あまりにも重要なことだろう。この原理を利用すると、かなり面白いものが書けたりするのである。
問題を分解してから、単純化して考えるのが問題解決の基本というのは、任天堂の故岩田聡社長も言っていたことである。
世の中のことって
だいたいは複雑じゃないですか。
複雑なことに対して
仮説を立てて考えていこうとしたら、
絶対に人は単純化するわけです。分析とはものごとを要素にわけて分解して、
そのなかで
「こうすればこれは説明がつくよね」
という仮説を立てることですから、
わたしだけでなく
みんながやっていることなんです。
だからプログラマーの特権ではないと思います。ただ、プログラマーは
それを毎日やっていますので、
いくつも仮説を立てては
頭のなかで比べる訓練はすごくしています。
毎日筋トレをしている、
という程度の自負はあるんです。
トライアンドエラーの回数は多いですから。プログラムをする人が
みんなそうしているのかどうかは
知りませんけど、わたしはそうしているんです
私もプログラムを書くので、この話はすごいわかる。
(あと付け加えるのなら、どんな複雑な問題も、定義済関数による単純な処理を組み合わせることによって対応する、というプログラミングの進め方=制約が、非常に問題解決や知的生産に有用だと考えている)
章後半の「遊びが大事」っていうのはよくわからなかった。
「近年の日本では発想を養うための遊びの環境が失われている」と言われても、そんなん今の若者はどーすればええねん。
第6章以降の内容は割愛。パソコンという新しいおもちゃが誕生してむっちゃウキウキしているミレニアム期の野口氏が見られます。
Conclusion
アイディアとは模倣のことだ(というか既存要素の組み合わせ)!
んで「イマジネーションとは記憶のことだ」(by ジェイムズ・ジョイス)!
天才は頭の中でうまく編集して組み合わせてアイディアつくれる!
悔しいから天才よりも高速に外部出力しながらアイディアを生み出す仕組みを作ろう!
Enjoy!