去年読んでインパクトを受けた本

去年読んでインパクトを受けた本。

1. 機械との競争 エリク・ブリニョルフソン

2.年収は「住むところ」で決まる ─ 雇用とイノベーションの都市経済学 エンリコ モレッティ

1.も2.も労働に関する未来予測の本だ。両書とも、人工知能やロボットの発達により数十年後にはホワイトカラーやブルーカラーの仕事はことごとくなくなると予測している。テクノロジのーの進歩により人間にしかできない仕事のみが残る。人間にしか出来ない創造的な仕事か、あるいは人間を相手にするサービス業や介護士等のロボットが対応できない仕事のみが残る。
私はこれらの本を読んで、これからの社会に不安を感じている。しかし、周りを見回すと相変わらず、過去の価値観で動いていて、その未来への大変化に気づかない様子で、社会は動いている。
未来の社会に適応するには、子供の時から創造的な教育をする必要があると思うが、従来の学校教育や企業ではそのような準備ができていないように思う。まずは個人で少しづつ進めていくしか方法はないのではないかと思う。

3. ずっとやりたかったことを、やりなさい。(2) ジュリア キャメロン

これも生き方に関する本だが、なぜか何度も読んでしまった。簡単に言うと歩くことや書くことで創造的に生きていこうと言う内容だ。私自身、創造的というものがどういうものかわからないので、これを読んで少しだけ創造性というものが分かったような気がする。私なりの解釈では、創造性とは椅子に座って創りだすものではなく、何か行動を起こすことの結果として発生するのではないかと思う。

こうして見ると私の興味の範囲は、働くこと、生きること、社会の変化、創造性だ。今年もこれらのことを追求していきたいと思う。

[解説]「再帰関数で逆順並べ替え」

問題文

再帰関数で逆順並べ替え
基本関数だけで逆順アルゴリズムを実現してみよう!
今回の問題は基本的な関数のみを使って、リスト項目を逆順にするアルゴリズムを考えてみます。

問題
4つの関数car, cdr, cons, nullpのみを使って、リストの項目を逆順にする関数reverse_auxとreverse2をつくってください。

例えば、reverse2は['A','B','C','D']を、逆順の['D','C','B','A']に並べ替えます。

reverse2()は1変数、reverse_aux()は2変数のリストを取ります。
最終的には、reverse2が必要なのですが、その前段階としてreverse_auxを作ってください。


reverse_aux(x, y)の性質は以下の通りです。

reverse_auxは、リストx, yを取ります。
例えば、

reverse_aux( [‘A’, ‘B’, ‘C’, ‘D’], [‘E’, ‘F’, ‘G’] )

= [‘D’, ‘C’, ‘B’, ‘A’, ‘E’, ‘F’, ‘G’]

 のように、リストxを逆順にして、リストyはそのままで連結します。 まず、reverse_auxを作ってください。 
●基本関数 使って良い関数はcar, cdr, cons, nullpのみです。
・carは先頭の項目を返す関数です。
例えば、

car([‘A’, ‘B’, ‘C’]) = ‘A’

・cdrは先頭項目を除いたリストを返す関数です。   例えば、

cdr([‘A’, ‘B’, ‘C’]) = [‘B’, ‘C’]

 ・consは一つの項目とリストを引数する関数です。consは項目xをリストyの最初に付け足したリストを返す関数です。
例えば、

cons(‘X’, [‘A’, ‘B’, ‘C’]) = [‘X’, ‘A’, ‘B’, ‘C’]

 ・nullp()は1変数の関数で、true <- nullp([]) となり、それ以外の時(アトムあるいは有限要素数のリストの場合)はfalseを返します。
reverse_auxを定義する前に、予め自分の処理系でcar, cdr, cons, nullpを定義してください。 その時は、どんな組み込み関数を使っても構いませんが、reverse_auxだけは、上記の基本関数のみを使ってください。ただし、ifなどの条件文やreturnなどはOKです。
最後に、reverse_auxを使って、reverse2を作ってください。 名前がreverse2なのは、built-in関数との競合を防ぐためです。問題なければ、reverseでも結構です。 作成したコードは、ファイル名を reverse.txt として、アップロードしてください。

その他注意事項 今回の問題は、純LISP に関する問題です。 LISPで解くと簡単にできますが、他の言語処理系だと基本関数定義の所で手間取るかもしれません。 結構大変かと思いますが、頑張ってください。 言語はPythonを希望しますが、解答の論理構造がわかるものであれば、どの言語処理系でも解答可能です。

解説

今回は純LISPに関する問題です。純LISPとはatom, eq, car, cdr, consとう5つの基本関数でプログラミング言語です。実際には、cond, quote, lambda, defineという関数も必要となりますが、必要最小限のもので、プログラミング言語を作ることができるというのは非常に面白い考えだと思います。まるで、数学の有限の公理で色々な証明を行うのに似ています。

Pythonでの解答例


#!/usr/bin/python

#
# reverse.py
#

def car(x): return x[0]

def cdr(x): return x[1:]

def cons(x, y): return [x] + y

def nullp(x): return len(x) == 0

def reverse_aux(x, y):

print x, y # Show variables
if nullp(x):
return y
else:
return reverse_aux(cdr(x), cons(car(x), y))

def reverse2(x):

return reverse_aux(x, [])

####
print reverse_aux([‘A’,’B’,’C’,’D’], [‘E’,’F’,’G’])


reverse_aux(X, Y) の解説をします。

diagram

X=[‘A’,’B’,’C’,’D’], Y=[‘E’,’F’,’G’] とすると、cdr(X)=[‘B,’C’,’D’]を次のreverse_auxのX’に引き継ぎます。更に、car(X)=’A’とY=[‘E’,’F’,’G’] をcons()で結合したものを次のreverse_auxのY’に引き継ぎます。処理がreverse_auxで再帰的に行われ、X部分の要素が逆順になります。

うまく、再帰関数で定義できたでしょうか。再帰関数を使うと、whileやfor文などを使わずに、繰返し処理が表現できますね。

統計学の興味は個別データではなく、集団に関する情報

以前、データジャーナリズムのイベントでジャーナリストと一緒に仕事をしたが、どうしてもデータに対する考え方の違いがあって、どうにもはっきりしなかった。しかし、量的研究エッセンシャルという記事を見て、自分の中のモヤモヤ感がはっきりした。

簡単に言うと、統計学・データサイエンティストは個別のデータに関心があるのではなく、個別データの背後にある一般的な仕組みや規則に興味がある。一方、ジャーナリストは個々のデータや事件に興味があるのだと思う。それで、両者のデータに関する考え方の違いでどうも通じ合えないのではないだろうか。

記事の内容をまとめてみた。元の記事を見たほうが分かりやすいかもしれないので、是非元記事をみるのをお勧めする。かなり丁寧に書かれた記事であり、更に連載記事なので他の記事も通して読んでみると統計学・データ解析の本質が分かると思う。

(要約)

量的研究での関心事は個別データの背後にある一般的な仕組みや規則を明らかにすることだ。

統計学では個別データは母集団という仮想世界から現実世界へ偶然に生じたものと考える。

データと説明可能なモデルとノイズに分けると確率的考えで変動をうまく説明できる。

量的研究の関心事は個別データではなく、集団に関する情報であり、個性はノイズとみなす。

世の中の現象は多数の要因が絡みあって生じるので予測は確率的にしかできない。

 

ハンググライダー、人工知能、データマイニングの情報発信していきます