Skip to content

Commit 99b049c

Browse files
committed
第1章のソースコード
1 parent 927a741 commit 99b049c

4 files changed

Lines changed: 172 additions & 0 deletions

File tree

‎ch01/error.py‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import scipy as sp
2+
3+
def error(f, x, y):
4+
return sp.sum((f(x)-y) ** 2)
5+

‎ch01/plot.py‎

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#
2+
# データから複数のモデルを作成してプロットする。
3+
# モデルは1次直線、2次曲線、100次曲線まで。
4+
#
5+
import scipy as sp
6+
import matplotlib.pyplot as plt
7+
import error as err
8+
9+
data = sp.genfromtxt("./data/web_traffic.tsv", delimiter="\t")
10+
x = data[:,0]
11+
y = data[:,1]
12+
13+
x = x[~sp.isnan(y)]
14+
y = y[~sp.isnan(y)]
15+
16+
# 1つめのモデル(直線)
17+
fp1, residuals, rank, sv, rcond = sp.polyfit(x, y, 1, full=True)
18+
f1 = sp.poly1d(fp1)
19+
print("Error: %f" % err.error(f1, x, y))
20+
21+
# 2つめのモデル(2次曲線)
22+
fp2 = sp.polyfit(x, y, 2)
23+
f2 = sp.poly1d(fp2)
24+
print("Error: %f" % err.error(f2, x, y))
25+
26+
# 3つめのモデル(100次)
27+
fp3 = sp.polyfit(x, y, 100)
28+
f3 = sp.poly1d(fp3)
29+
print("Error: %f" % err.error(f3, x, y))
30+
31+
32+
## プロット
33+
34+
# 直線
35+
fx = sp.linspace(0, x[-1], 1000)
36+
37+
plt.plot(fx, f1(fx), linewidth=4)
38+
plt.plot(fx, f2(fx), linewidth=4)
39+
plt.plot(fx, f3(fx), linewidth=4)
40+
41+
# 分布
42+
plt.scatter(x, y)
43+
44+
plt.legend(["d=%i" % f1.order], loc="upper left")
45+
plt.xlabel("Time")
46+
plt.ylabel("Hits/hour")
47+
plt.xticks([w*7*24 for w in range(10)], ['week %i' % w for w in range(10)])
48+
plt.autoscale(tight=True)
49+
plt.grid()
50+
plt.show()
51+

‎ch01/plot2.py‎

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import scipy as sp
2+
import matplotlib.pyplot as plt
3+
import error as err
4+
5+
inflection = (int)(3.5 * 7 * 24) # 変化点
6+
print("Inflection %d" % inflection)
7+
8+
data = sp.genfromtxt("./data/web_traffic.tsv", delimiter="\t")
9+
print(data.shape)
10+
x = data[:,0]
11+
y = data[:,1]
12+
13+
xa = x[:inflection]
14+
ya = y[:inflection]
15+
16+
xb = x[inflection:]
17+
yb = y[inflection:]
18+
19+
fpa = sp.polyfit(xa, ya, 1)
20+
fpb = sp.polyfit(xb, yb, 1)
21+
fa = sp.poly1d(fpa)
22+
fb = sp.poly1d(fpb)
23+
24+
fa_error = err.error(fa, xa, ya)
25+
fb_error = err.error(fb, xb, yb)
26+
27+
print("Error inflection=%s" % "{:,f}".format(fa_error + fb_error))
28+
29+
# プロット
30+
fx = sp.linspace(0, x[-1], 1000)
31+
32+
# 直線
33+
plt.plot(fx, fa(fx), linewidth=4)
34+
plt.plot(fx, fb(fx), linewidth=4)
35+
36+
# 分布
37+
plt.scatter(x, y)
38+
39+
#plt.legend(["d=%i" % f1.order], loc="upper left")
40+
plt.xlabel("Time")
41+
plt.ylabel("Hits/hour")
42+
plt.xticks([w*7*24 for w in range(10)], ['week %i' % w for w in range(10)])
43+
plt.autoscale(tight=True)
44+
plt.grid()
45+
plt.ylim([0, 6500])
46+
plt.show()
47+

‎ch01/plot3.py‎

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import scipy as sp
2+
import matplotlib.pyplot as plt
3+
import error as err
4+
5+
####################################
6+
7+
inflection = (int)(3.5 * 7 * 24) # 変化点
8+
print("Inflection %d" % inflection)
9+
10+
data = sp.genfromtxt("./data/web_traffic.tsv", delimiter="\t")
11+
print(data.shape)
12+
x = data[:,0]
13+
y = data[:,1]
14+
15+
xa = x[:inflection]
16+
ya = y[:inflection]
17+
18+
xb = x[inflection:]
19+
yb = y[inflection:]
20+
21+
frac = 0.3 # テストに用いるデータの割合
22+
split_idx = int(frac * len(xb))
23+
# 全データの30%をランダムに選び出す
24+
#shuffled = sp.random.permutation(list(range(len(xb))))
25+
shuffled = sp.random.permutation(range(len(xb)))
26+
test = sorted(shuffled[:split_idx])
27+
train = sorted(shuffled[split_idx:])
28+
29+
# それぞれ訓練データを用いて訓練を行う
30+
fbt1 = sp.poly1d(sp.polyfit(xb[train], yb[train], 1))
31+
fbt2 = sp.poly1d(sp.polyfit(xb[train], yb[train], 2))
32+
fbt3 = sp.poly1d(sp.polyfit(xb[train], yb[train], 3))
33+
fbt10 = sp.poly1d(sp.polyfit(xb[train], yb[train], 10))
34+
fbt100 = sp.poly1d(sp.polyfit(xb[train], yb[train], 100))
35+
36+
for f in [fbt1, fbt2, fbt3, fbt10, fbt100]:
37+
print("Error d=%i: %f" % (f.order, err.error(f, xb[test], yb[test])))
38+
39+
exit()
40+
41+
fpa = sp.polyfit(xa, ya, 1)
42+
fpb = sp.polyfit(xb, yb, 1)
43+
fa = sp.poly1d(fpa)
44+
fb = sp.poly1d(fpb)
45+
46+
fa_error = err.error(fa, xa, ya)
47+
fb_error = err.error(fb, xb, yb)
48+
49+
print("Error inflection=%s" % "{:,f}".format(fa_error + fb_error))
50+
51+
# プロット
52+
fx = sp.linspace(0, x[-1], 1000)
53+
54+
# 直線
55+
plt.plot(fx, fa(fx), linewidth=4)
56+
plt.plot(fx, fb(fx), linewidth=4)
57+
58+
# 分布
59+
plt.scatter(x, y)
60+
61+
#plt.legend(["d=%i" % f1.order], loc="upper left")
62+
plt.xlabel("Time")
63+
plt.ylabel("Hits/hour")
64+
plt.xticks([w*7*24 for w in range(10)], ['week %i' % w for w in range(10)])
65+
plt.autoscale(tight=True)
66+
plt.grid()
67+
plt.ylim([0, 6500])
68+
plt.show()
69+

0 commit comments

Comments
 (0)