データとは何か

4,364 views

Published on

第3回若手Webエンジニア交流会での発表資料です。

Published in: Technology
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,364
On SlideShare
0
From Embeds
0
Number of Embeds
2,349
Actions
Shares
0
Downloads
0
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

データとは何か

  1. 1. データとは何か第3回若手Webエンジニア交流会 @suzu_v
  2. 2. 自己紹介• 2006.4 – 2012.3 – Keio University • 人工知能、セマンティックWeb、オントロジー工学• 2011.2 – 2012.3 – CTO at Trippiece, Inc. • 旅行系のWebサービスを作っていました。• 2012.4 – – Engineer at VOYAGE GROUP, Inc. • 主にデータ解析業務とオペレーションエンジニアリングを担 当しています。 twitter: @suzu_v http://blog.kentasuzuki.net
  3. 3. 交流会ということで、酒の肴にな るネタを持って来ました。 今日はJenkinsとHadoopの話はしません。 解析の話もしません。
  4. 4. 最近、こんな本を読んでいま す。
  5. 5. 私の仕事は、データと向き合うことです。SICPを通して、私はデータについて知らないということを知りました。
  6. 6. 質問: データとは何でしょう? http://www.flickr.com/photos/wwworks/2959833537/sizes/l/in/photostream/
  7. 7. 大きさ 花の色 ユーザ行動 ビールの銘柄 CPM 転置インデックス 確率 株価 お金 アクションログ 音の高さ アクティブユーザ数 重さ 宗教 クリック数 人口 クロック数 バイト数 降水量 経常利益 親子関係 座標位置 ツイート 行
  8. 8. 質問: 計算機にとってのデータとは 何でしょう? http://www.flickr.com/photos/st3f4n/3708150348/sizes/l/in/photostream/
  9. 9. “一般に、データは選択肢と構成肢と、これらの手続きを有効な表現とするための満たすべき条件とで定義されると思って良い。” 「計算機プログラムの構造と解釈」第2版 p.45 より
  10. 10. (define (data what-we-hope-so))
  11. 11. _人人人人人人人_> 突然のScheme < ̄Y^Y^Y^Y^Y^Y ̄
  12. 12. 今から30秒でSchemeの簡単な説明をします。
  13. 13. (cons 1 2) 対(ペア)を示しています。
  14. 14. (car (cons 1 2))-> 1 carはconsの最初の部分を取り出します。
  15. 15. (cdr (cons 1 2))-> 2 cdrはconsの後ろの部分を取り出します。
  16. 16. (define x (cons 1 2))(car x)-> 1(cdr x)-> 2 defineによって手続きを定義できます。
  17. 17. (define x (cons 1 2))(define y (cons 3 4))(define z (cons x y))(car (car z))-> 1 すなわち、(car (cons 1 2)) です。(car (cdr z))-> 3 すなわち、(car (cons 3 4)) です。
  18. 18. “一般に、データは選択肢と構成肢と、これらの手続きを有効な表現とするための満たすべき条件とで定義されると思って良い。” 「計算機プログラムの構造と解釈」第2版 p.45 より
  19. 19. “だからといって、データとは「与えられた選択肢と構成肢で実装されているもの」というのでは不十分である。” 「計算機プログラムの構造と解釈」第2版 p.51 より
  20. 20. (define x (cons 1 2))(car x)-> 1(cdr x)-> 2
  21. 21. cons, car, cdrは、他のデータ構造を利用せずに定義することができます。
  22. 22. (define (cons x y) (define (dispatch m) (cond ((= m 0) x) ((= m 1) y) (else (error "Argument not 0 or 1 --CONS" m)))) dispatch) (cons x y)は手続きdispatchを返します。 この手続きdispatchは引数を1つとり、 0が渡されるとx, 1が渡されるとyを返します。
  23. 23. carとcdrを定義しましょう。
  24. 24. (define (car z) (z 0))(define (cdr z) (z 1)) これにより、 (car (cons x y)) はxを返し、 (cdr (cons x y)) はyを返します。
  25. 25. (define (cons x y) (define (dispatch m) (cond ((= m 0) x) ((= m 1) y) (else (error "Argument not 0 or 1 -- CONS"m)))) dispatch)(define (car z) (z 0))(define (cdr z) (z 1))cons, car, cdrを、他のデータ構造を利用せずに定義することができました。
  26. 26. 大事なこと:対の手続き実装が実際に普段利用している言語でこうなっている、というわけではありません。しかし、対が満たすべき条件は満たしています。そして、手続きをオブジェクトとして操作する能力が、自動的に合成データを表現する能力を提供することを示しています。
  27. 27. ここまでのあらすじ• 計算機にとってデータとは何か• cons: 対の表現• car, cdr: 値の取り出し• cons, car, cdrを任意のデータ構造によらず に表現
  28. 28. 並びの世界を見ていきます。 http://www.flickr.com/photos/akash_k/125489887/sizes/l/in/photostream/
  29. 29. 並びの表現を導入します。 (list 1 2 3 4)
  30. 30. (cons 1 (cons 2 (cons 3 (cons 4 nil))))対の並びをリストとします。(list 1 2 3 4)
  31. 31. listの演算(define one-through-four (list 1 2 3 4))(car one-through-four)-> 1 carは最初の項を取り出します。(cdr one-through-four)-> (2 3 4) cdrは先頭以外の項からなる部分リストを 取り出します。
  32. 32. ここで「公認インターフェース」 について説明します。
  33. 33. 公認インターフェースとは、データ構造を扱う上の強力な設計原理です。
  34. 34. 例を見ていきましょう。
  35. 35. 引数として木を取り、奇数である葉の二乗の和を計算する手続きと、偶数のフィボナッチ数Fib(k)のリストをつくる手続き
  36. 36. 木 ((2 3) 5 6) (2 3) 5 62 3 葉
  37. 37. 木その要素自身が並びであるような並び(define x (cons (list 1 2) (list 3 4)));-> ((1 2) 3 4)(list x x);-> (((1 2) 3 4) ((1 2) 3 4))
  38. 38. 引数として木を取り、奇数である葉の二乗の和を計算する手続き ((2 3) 5 6) (2 3) 5 6 2 3和: 3^2 + 5^2 = 34 奇数の葉
  39. 39. 引数として木を取り、奇数である葉の二乗の和を計算する手続き(define (sum-odd-squares tree) (cond ((null? tree) 0) ((not (pair? tree)) (if (odd? tree) (square tree) 0)) (else (+ (sum-odd-squares (car tree)) (sum-odd-squares (cdr tree))))))
  40. 40. 偶数のフィボナッチ数Fib(k)の リストをつくる手続き
  41. 41. (1 1 2 3 5 8 13 21 34 55 ...) ( 2 8 34 ...)
  42. 42. 偶数のフィボナッチ数Fib(k)のリストをつくる手続き(define (even-fibs n) (define (next k) (if (> k n) nil (let ((f (fib k))) (if (even? f) (cons f (next (+ k 1))) (next (+ k 1)))))) (next 0))
  43. 43. 引数として木を取り、奇数である葉の 二乗の和を計算する手続き • 木の葉を数え上げる • フィルタを通し、奇数のものを選ぶ • 選ばれたものをそれぞれ二乗する • 0の初期値に結果を + を使いアキュムレー トするenumerate: filter: map: accumulate:tree leaves odd? square +, 0
  44. 44. map filteraccumulate
  45. 45. map, filter(map square (list 1 2 3 4 5))-> (1 4 9 16 25) listの各要素を2乗しています。(filter odd? (list 1 2 3 4 5))-> (1 3 5) listから奇数の要素のみ取り出しています。
  46. 46. accumulate(accumulate + 0 (list 1 2 3 4 5));-> 15 1 + 2 + 3 + 4 + 5です。(accumulate * 1 (list 1 2 3 4 5));-> 120 1 * 2 * 3 * 4 * 5です。(accumulate cons nil (list 1 2 3 4 5));-> (1 2 3 4 5) listの各要素を初期値nilとしてconsします。 これは結局listになります。
  47. 47. 偶数のフィボナッチ数Fib(k)の リストをつくる手続き • 整数を0からnまで数え上げる • 整数のそれぞれのフィボナッチ数を計算 する • フィルタを通し、偶数のものを選ぶ • 空のリストの初期値に結果をconsを使い アキュムレートするenumerate: map: map: accumulate: integers fib even? cons, ()
  48. 48. 信号処理の形式のように書きなおしてみましょう。 http://www.flickr.com/photos/caveman_92223/3346906435/sizes/o/in/photostream/
  49. 49. 引数として木を取り、奇数である葉の 二乗の和を計算する手続き (define (sum-odd-squares tree) (accumulate + 0 (map square (filter odd? (enumerate-tree tree)))))enumerate: filter: map: accumulate:tree leaves odd? square +, 0
  50. 50. 偶数のフィボナッチ数Fib(k)の リストをつくる手続き (define (even-fibs n) (accumulate cons nil (filter even? (map fib (enumerate-interval 0 n)))))enumerate: map: map: accumulate: integers fib even? cons, ()
  51. 51. 共通の構造が明らかになりまし た。(define (sum-odd-squares tree) (accumulate + 0 (map square (filter odd? (enumerate-tree tree)))))(define (even-fibs n) (accumulate cons nil (filter even? (map fib (enumerate-interval 0 n)))))
  52. 52. “プログラムを並びの演算として表す価値は、部品化されたプログラム設計、つまり比較的独立な部品を組み合わせてつくり上げる設計を可能とすることだ。われわれは、標準部品のライブラリと、部品を柔軟に接続するための公認インターフェースを用意することで、部品化された設計を奨励する。” 「計算機プログラムの構造と解釈」第2版 p.67 より
  53. 53. 改めて、並びの世界を見ていきます。 http://www.flickr.com/photos/akash_k/125489887/sizes/l/in/photostream/
  54. 54. これをベクトルとしましょう。 (list 1 2 3)
  55. 55. リストによる行列の表現(list (list 1 2 3 4) (list 5 6 7 8) (list 9 10 11 12))
  56. 56. これから定義するもの (dot-product v w) 総和 を返す(ベクトルの内積)(matrix-*-vector m v) であるようなベクトルtを返す(matrix-*-matrix m n) であるような行列pを返す (transpose m) であるようなマトリックスnを返す
  57. 57. accumulateを拡張します(print (accumulate-n + 0 (list (list 1 2 3) (list 4 5 6))));-> (5 7 9)(print (accumulate-n + 0 (list (list 1 2 3) (list 4 5 6) (list 7 89))));-> (12 15 18)(print (accumulate-n * 1 (list (list 1 2 3) (list 4 5 6))));-> (4 10 18)
  58. 58. (define (dot-product v w) (accumulate + 0 (map * v w)))(define (matrix-*-vector m v) (map (??) m))(define (transpose mat) (accumulate-n (??) (??) mat))(define (matrix-*-matrix m n) (let ((cols (transpose n))) (map (??) m))) 「計算機プログラムの構造と解釈」第2版 p.70 問題2.37より
  59. 59. (define (dot-product v w) (accumulate + 0 (map * v w)))(define (matrix-*-vector m v) (map (??) m))(define (transpose mat) (accumulate-n (??) (??) mat))(define (matrix-*-matrix m n) (let ((cols (transpose n))) (map (??) m))) あまりにも綺麗に書けてしまいました。 (※アップロード用スライドでは伏字にしてあります。)
  60. 60. 実行列の計算を行うまでの流れ• consで最小限のデータ構造を定義した• consの並びでlistを定義した• 2重のlistで行列を表現したたった2つの構成肢を組み合わせるところから、listという合成データをつくり、listに対する演算を合成手続きとして定義することで、実行列の演算を行うまでに表現力を高めることができました。
  61. 61. 発表のまとめ
  62. 62. 質問: 計算機にとってのデータとは 何でしょう? http://www.flickr.com/photos/st3f4n/3708150348/sizes/l/in/photostream/
  63. 63. “一般に、データは選択肢と構成肢と、これらの手続きを有効な表現とするための満たすべき条件とで定義されると思って良い。” 「計算機プログラムの構造と解釈」第2版 p.45 より
  64. 64. “だからといって、データとは「与えられた選択肢と構成肢で実装されているもの」というのでは不十分である。” 「計算機プログラムの構造と解釈」第2版 p.51 より
  65. 65. 適切な抽象化を行うことで、私達プログラマはデータを扱う手段を得ています。
  66. 66. Webにデータにあふれているからこそ、 http://linkeddata.org/
  67. 67. アプリエンジニアもインフラエンジニアも解析エンジニアも同じエンジニアとして、データとのふれあい方を考え、良い仕事をしていけると尐し幸せになれるのではないかと思います。 一緒にSICP読みましょう!
  68. 68. 参考資料
  69. 69. SICP• Welcome to the SICP Web Site – http://mitpress.mit.edu/sicp/ – 邦題: 「計算機プログラムの構造と解釈」 – 今回は第2章の”データによる抽象の構築”の部 分を俯瞰するような形でスライドを構成しま した。とても良い話です。
  70. 70. • Why <cite>Structure and Interpretation of Computer Programs</cite> matters – http://www.eecs.berkeley.edu/~bh/sicp.html – <blockquote>The invention of the MapReduce software for data parallelism at Google, based on functional programming ideas, has helped eliminate that ivory-tower reputation.</blockquote>
  71. 71. 抽象モデルについて• Structured programming: C.A.R. Hoareら (1972) – http://dl.acm.org/citation.cfm?id=1243380&dl= ACM&coll=DL&CFID=203717221&CFTOKEN =47398745
  72. 72. 補足資料
  73. 73. cons, car, cdrの名前の由来• cons – Construct• car – Contents of the Address part of the Register.• cdr – Contents of the Decrement part of the Register
  74. 74. accumulate(define (accumulate op initial sequence) (if (null? sequence) initial (op (car sequence) (accumulate op initial (cdr sequence)))))
  75. 75. accumulate-n(define (accumulate-n op init seqs) (if (null? (car seqs)) nil (cons (accumulate op init (map car seqs)) (accumulate-n op init (map cdr seqs)))))
  76. 76. map(define (map proc items) (if (null? iterms) nil (cons (proc (car items)) (map proc (cdr iterms)))))
  77. 77. filter(define (filter predicate sequence) (cond ((null? sequence) nil) ((predicate (car sequence)) (cons (car sequence) (filter predicate (cdr sequence)))) (else (filter predicate (cdr sequence)))))

×