ここから本文です
英語上級者向け 海外一流大学のオープンコースウエア聴講録

書庫MIT6.00

記事検索
検索

全1ページ

[1]

MIT6.00 講義18

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第18回
オープンコースウエア 大学名:MIT
講座名:6.00 Introduction to Computer Science and Programming
講義日:2008年11月11日(火曜日) ― 第11週・1回目 (第10週・2回目の講義は休講でした)
担当教授:Prof. Guttag
全講義数:24コマ
各講義時間:60分
配信開始日:2009年8月19日
講義ビデオソース:Youtube
講義ビデオ収録時間:50分38秒
サブタイトル:有
ジャンル: プログラム出力結果の評価、ランダムウオークのデバッグ、Pylab、Numpy、図表やヒストグラムをプロットする方法
 
ビデオ画像品質5段階評価:4
(解像度が480pあり、コンピュータ画面に表示されたソースコードを比較的はっきりと読み取ることができます。)
ビデオ音声品質5段階評価:4
 
講義コメント:
今回18回目の講義は前回の講義でコーディングしたランダムウオークプログラムの精査およびデバックとなります。
 
基本シミュレーションのコーディングは、以下の3部からなっている。
 
その1. シミュレーションを1回だけ実行するインナーループ。
その2・ シミュレーションの試行回数を管理するループ。このループはその1のループを内蔵する。
その3. 計算および統計処理の(グラフィカル)表示
 
 
 
ランダムウオークプログラムの精査の部分は、前回さらっと流した以下のコード:
 
   f.getDrunk().move(f) 
 
 
 
f.getDrunk() は、インスタンス(つまりメソッドのインボケイション)であり、f.getDrunkとは区別されなければならない。
 
f.getDrunkは、この場合メソッドでインスタンスではない。
 
 
前回でコーディングしたプログラム、エラーメッセージが表示されることもなく無事に結果が出力されていました。
しかしその出力結果をよくよく見てみると、なんか変なことに気がつきました。
それは、100歩や200歩シミュレートした結果がどれも原点から4,5歩の距離しか離れていないのです。
 
これはどうもおかしいじゃないかということになって、プログラムをデバックすることになりました。
 
グダーグ教授のデバック作法の手順は:
  1. Find a really simple example that I know the answer
  2. Take only one step - we know the answer should be one
  3. Go half way in the middle of the program and print some intermediate value (total distance so far)
  4. Label axes and look
  5. Ask if answer makes sense
 
上記の手順に従ってデバッグしてみると、どうやら距離の平均値の求め方にバグがあったようです。
ほんの1行だけなのですが、手直しして再実行すると、前回の結果よりもっともらしい(?)結果が出力されました。
 
 
 
-------------------------------------------------
Lecture 18 Hand out 補助教材 ダウンロード
 
Lecture 18 ホームワーク ダウンロード
 
MIT 6.00 講座のプログラムも含んだ資料のダウンロード 
-------------------------------------------------
 
 

 
-------------------------------------------------
 
講義で取り上げたPythonコードの例
 
注−1! あらかじめ PylabとNumpy という数学・計算用および図表表示モジュールをインストールしておく必要があります。
個別モジュールをダウンロードするには、ソースフォージ(SourceForge)のサイトから次の2つの小さいパッケージをダウンロードしてインストールします。
 
1. Numpy のパッケージ --> http://sourceforge.net/projects/numpy/files/NumPy/
   ダウンロードするパッケージは、numpy-1.5.1-win32-superpack-python2.6.exe
 
2. Pylab のパッケージ --> http://sourceforge.net/projects/matplotlib/files/matplotlib/matplotlib-1.0.1/
   ダウンロードするパッケージは、matplotlib-1.0.1.win32-py2.6.exe
 
注ー2! 前回のコードがデバックされています。
 
 
例−1 ソースコード
 
 

import math, random, pylab

 

class Location(object):
  def __init__(self, x, y):
    self.x = float(x)
    self.y = float(y)
    
  def move(self, xc, yc):
    return Location(self.x+float(xc), self.y+float(yc))

 

  def getCoords(self):
    return self.x, self.y

 

  def getDist(self, other):
    ox, oy = other.getCoords()
    xDist = self.x - ox
    yDist = self.y - oy
    return math.sqrt(xDist**2 + yDist**2)

 
 

class CompassPt(object):
  possibles = ('N', 'S', 'E', 'W')
  
  def __init__(self, pt):
    if pt in self.possibles: self.pt = pt
    else: raise ValueError('in CompassPt.__init__')
    
  def move(self, dist):
    if self.pt == 'N': return (0, dist)
    elif self.pt == 'S': return (0, -dist)
    elif self.pt == 'E': return (dist, 0)
    elif self.pt == 'W': return (-dist, 0)
    else: raise ValueError('in CompassPt.move')

 

    
class Field(object):
    
  def __init__(self, drunk, loc):
    self.drunk = drunk
    self.loc = loc
    
  def move(self, cp, dist):
    oldLoc = self.loc
    xc, yc = cp.move(dist)
    self.loc = oldLoc.move(xc, yc)
    
  def getLoc(self):
    return self.loc

 

  def getDrunk(self):
    return self.drunk

 

class Drunk(object):
  def __init__(self, name):
    self.name = name
    
  def move(self, field, time = 1):
    if field.getDrunk() != self:
      raise ValueError('Drunk.move called with drunk not in field')
    for i in range(time):
      pt = CompassPt(random.choice(CompassPt.possibles))
      field.move(pt, 1)
      
def performTrial(time, f):
  start = f.getLoc()
  distances = [0.0]
  for t in range(1, time + 1):
    f.getDrunk().move(f)
    newLoc = f.getLoc()
    distance = newLoc.getDist(start)
    distances.append(distance)
  return distances

 

drunk = Drunk('Homer Simpson')

 

for i in range(3):
  f = Field(drunk, Location(0, 0))
  distances = performTrial(500, f)
  pylab.plot(distances)
  
pylab.title('Homer\'s Random Walk')
pylab.xlabel('Time')
pylab.ylabel('Distance from Origin')

 

def performSim(time, numTrials):
  distLists = []
  for trial in range(numTrials):
    d = Drunk('Drunk' + str(trial))
    f = Field(d, Location(0, 0))
    distances = performTrial(time, f)
    distLists.append(distances)
  return distLists

 

def ansQuest(maxTime, numTrials):
  means = []
  distLists = performSim(maxTime, numTrials)
  for t in range(maxTime + 1):
    tot = 0.0
    for distL in distLists:
      tot += distL[t]
    means.append(tot/len(distLists))
  pylab.figure()
  pylab.plot(means)
  pylab.ylabel('distance')
  pylab.xlabel('time')
  pylab.title('Average Distance vs. Time (' + str(len(distLists)) + ' trials)')
  
ansQuest(500, 300)
pylab.show()

 
 
 
 
 
例−1の実行結果
 
エディタから実行してPython Shell に出力
 
 
 
 
 
 
 
出力した画像の元ファイルをダウンロードしてみる。
 
 
 
 
 
 
SVG(Scalable Vector Graphics)ファイル
 
--------------------------------------------------
 
例−2 ソースコード
 

from pylab import *
import random

 

# Plot - 1
plot([1,2,3,4])
plot([5,6,7,8])

 

# Plot - 2
plot([1,2,3,4], [1,4,9,16])
figure()
plot([1,2,3,4], [1,4,9,16], 'ro')
axis([0, 6, 0, 20])
title('Earnings')
xlabel('Days')
ylabel('Dollars')
figure()

 

# Plot - 3
xAxis = array([1,2,3,4])
print xAxis
test = arange(1,5)
print test
print test == xAxis
yAxis = xAxis**3
plot(xAxis, yAxis, 'ro')

 

# Plot - 4 Plots a histgram
figure()
vals = []
dieVals = [1,2,3,4,5,6]
for i in range(10000):
vals.append(random.choice(dieVals)+random.choice(dieVals))
hist(vals, bins=11)
show()

 
 
 
例−2 の実行結果
 
 
 
 
 
 
 
 
Python コードのHTML表示には、Dan CederholmのSimpleCodeを使用しています。
 
Python コードの入出力は、Python IDLE から行っています。
 
http://opencourseware.cocolog-nifty.com/blog/images/2011/01/30/python_idle_1_small.jpg -------------------------------------------------
講座第18回のリーディングアサイメント

1. Random walks applet
 
2. Chapter 13 of Matplotlib/pylab reference
 
-------------------------------------------------
 
 
-------------------------------------------------
 
 
 
 
 
 
 
 

MIT6.00 講義17

MIT 6.00 コンピュータサイエンスとプログラミング秋期講座第17回
オープンコースウエア 大学名:MIT
講座名:6.00 Introduction to Computer Science and Programming
講義日:2008年11月4日(火曜日) ― 第10週・1回目


担当教授:Prof. Guttag


全講義数:24コマ
各講義時間:60分


配信開始日:2009年8月19日
講義ビデオソース:Youtube
講義ビデオ収録時間:50分38秒
サブタイトル:有
ジャンル: 乱数、ランダムウオーク、擬似乱数(Psudo Random)
ビデオ画像品質5段階評価:4
(解像度が480pあり、コンピュータ画面に表示されたソースコードを比較的はっきりと読み取ることができます。)
ビデオ音声品質5段階評価:4


講義コメント:
第1回から第16回目の講義までが、基礎固めの講義でした。コンピューターサイエンス専攻の学生向けの入門コースとしては、普通の大学であればこの辺りまでがおそらく範囲なのでしょう。
しかしMITの入門コース、この第17回目の講義から最終回にあたる24回目の講義まで、プログラミングの応用や、さらなる難問の挑戦に当てています。
問題を解くにあたって、コンピューターを問題解決のツールとして使えるか、
それとも紙と鉛筆(つまり数学的にもしくは、OR的に)で解くかにより、
問題解決のアプローチが異なっている。
ばらつき(ランダム)を処理する。
データの意味の整合性を検証する。
プログラムの実行結果の品質を検証する。
プログラムを書いていく前に、単純なシステムからモデリングを始める事。
ランダムウオークをシステム的にモデリングし、Pythonで実装する。
   1. Location
   2. CompassPT(Direction)
   3. Field
   4. Drunk(酔っ払い)
Youtubeでこの講義を見ていたら、お勧め動画(つまりこの17回目の講義を見ている人がこんな動画も見ている!)にアルゴリズム入門 − MIT 6.046J/18.410J Fall 2005)とあるのを発見。
そこに書き込みしてある「学生達」のコメントが面白い。
コメントその1.真のプログラマーが生まれる瞬間がここにある。
コメントその2.黒板を使い倒している。すごい!パワーポイント(PowerPoint)なんてくそくらえだ。
コメントその3.(レイア姫の出身星)アルデロン星からケンブリッジまでどうやってたどり着くかのアルゴリズムだなんて、この先生スターウオーズオタクだね。



-------------------------------------------------

Lecture 17 Hand out 補助教材 ダウンロード
Lecture 17 ホームワーク ダウンロード
MIT 6.00 講座のプログラムも含んだ資料のダウンロード
-------------------------------------------------



-------------------------------------------------
講義で取り上げたPythonコードの例
注! 今回のコード、実行する前にPylabという数学・計算用モジュールをインストールしておく必要があります。イギリス・サウザンプトン大学のサイトPython 教材ダウンロードを参照しても良いです。ここからダウンロードすると、すべて込みこみのサイズが200M以上のパッケージをダウンロードすることになります。
個別モジュールをダウンロードするには、ソースフォージ(SourceForge)のサイトから次の2つの小さいパッケージをダウンロードしてインストールします。
   ダウンロードするパッケージは、numpy-1.5.1-win32-superpack-python2.6.exe
   ダウンロードするパッケージは、matplotlib-1.0.1.win32-py2.6.exe


例−1


import math, random, pylab
class Location(object):
  def __init__(self, x, y):
    self.x = float(x)
    self.y = float(y)
 
  def move(self, xc, yc):
    return Location(self.x+float(xc), self.y+float(yc))
  def getCoords(self):
    return self.x, self.y
  def getDist(self, other):
    ox, oy = other.getCoords()
    xDist = self.x - ox
    yDist = self.y - oy
    return math.sqrt(xDist**2 + yDist**2)
class CompassPt(object):
  possibles = ('N', 'S', 'E', 'W')

  def __init__(self, pt):
    if pt in self.possibles: self.pt = pt
    else: raise ValueError('in CompassPt.__init__')
 
  def move(self, dist):
    if self.pt == 'N': return (0, dist)
    elif self.pt == 'S': return (0, -dist)
    elif self.pt == 'E': return (dist, 0)
    elif self.pt == 'W': return (-dist, 0)
    else: raise ValueError('in CompassPt.move')
 
class Field(object):
 
  def __init__(self, drunk, loc):
    self.drunk = drunk
    self.loc = loc
 
  def move(self, cp, dist):
    oldLoc = self.loc
    xc, yc = cp.move(dist)
    self.loc = oldLoc.move(xc, yc)
 
  def getLoc(self):
    return self.loc
  def getDrunk(self):
    return self.drunk
class Drunk(object):
  def __init__(self, name):
    self.name = name
 
  def move(self, field, time = 1):
    if field.getDrunk() != self:
      raise ValueError('Drunk.move called with drunk not in field')
    for i in range(time):
      pt = CompassPt(random.choice(CompassPt.possibles))
      field.move(pt, 1)
   
def performTrial(time, f):
  start = f.getLoc()
  distances = [0.0]
  for t in range(1, time + 1):
    f.getDrunk().move(f)
    newLoc = f.getLoc()
    distance = newLoc.getDist(start)
    distances.append(distance)
  return distances
drunk = Drunk('Homer Simpson')
for i in range(3):
  f = Field(drunk, Location(0, 0))
  distances = performTrial(500, f)
  pylab.plot(distances)

pylab.title('Homer\'s Random Walk')
pylab.xlabel('Time')
pylab.ylabel('Distance from Origin')
def performSim(time, numTrials):
  distLists = []
  for trial in range(numTrials):
    d = Drunk('Drunk' + str(trial))
    f = Field(d, Location(0, 0))
    distances = performTrial(time, f)
    distLists.append(distances)
  return distLists
def ansQuest(maxTime, numTrials):
  means = []
  distLists = performSim(maxTime, numTrials)
  for t in range(maxTime + 1):
    tot = 0.0
    for distL in distLists:
      tot += distL[t]
    means.append(tot/len(distL))
  pylab.figure()
  pylab.plot(means)
  pylab.ylabel('distance')
  pylab.xlabel('time')
  pylab.title('Average Distance vs. Time (' + str(len(distLists)) + ' trials)')

ansQuest(500, 300)
pylab.show()


例−1の実行結果
エディタから実行してPython Shell に出力
Mit_600_17_2

出力した画像の元ファイルをダウンロードしてみる。
SVG(Scalable Vector Graphics)ファイル


Python コードのHTML表示には、Dan CederholmのSimpleCodeを使用しています。
Python コードの入出力は、Python IDLE から行っています。
Python_idle_1_small


-------------------------------------------------

講座第17回のリーディングアサイメント

1. Random walks applet
2. Chapter 13 of Matplotlib/pylab reference
-------------------------------------------------

-------------------------------------------------

全1ページ

[1]

peak_winds
peak_winds
男性 / 非公開
人気度
Yahoo!ブログヘルプ - ブログ人気度について

過去の記事一覧

検索 検索
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

最新のコメント最新のコメント

Yahoo!からのお知らせ

よしもとブログランキング

もっと見る
本文はここまでですこのページの先頭へ

[PR]お得情報

ふるさと納税サイト『さとふる』
お米、お肉などの好きなお礼品を選べる
毎日人気ランキング更新中!
数量限定!イオンおまとめ企画
「無料お試しクーポン」か
「値引きクーポン」が必ず当たる!
ふるさと納税サイト『さとふる』
実質2000円で特産品がお手元に
11/30までキャンペーン実施中!

その他のキャンペーン

みんなの更新記事