: c' z# d. }. n3 x* [, Z8 @ target_all_same = True& i1 b; o h& e6 I
for i in train_set.target:+ x% _! B# U0 m5 ^
if i != train_set.target[0]:2 e2 b! A3 W+ w% }6 w! ^$ Z$ ^
target_all_same = False & e! d! ]2 E `% P: z; H break - {4 Q2 x. Y2 j( A8 m3 _ u7 v; z4 K) Q8 x+ o
if target_all_same: # 如果测试集数据中所有数据的标签相同, 则构造叶子节点, 结束递归% M# f& Y' d' }" y1 x+ l
node = dt_node(train_set.target[0], is_leaf=True) ; C. g% a2 O6 m6 k if self.tree == None: # 如果根节点为空,则让该节点成为根节点 - ^! o- Z4 n W& \3 N/ y self.tree = node0 Z& {4 e$ h, H
' U# c0 g# T/ k
# 用于作图, 更新 map_str 内容, 为树图增加一个内容为标签值的叶子节点# {$ r5 j3 Q) ]/ k' g2 S
node_content = "标签:" + str(node.target_value)( K' G" D% o# _; X, R1 t$ [
self.map_str += "id" + str(node.id) + "[label=\"" + node_content + "\", fillcolor=\"" + self.color_dir[node.target_value] + "\", style=filled]\n"# Z- G" t, X. C9 h
8 X4 Z4 R* Z# H( X. T; p8 |. D
return node, ~3 l& O7 o( l) E6 b9 X
elif len(train_set.feature_names) == 0: # 如果测试集待考虑属性为空, 则构造叶子节点, 结束递归7 X: C: E1 W [9 c) T/ T; d1 V9 x
node = dt_node(vote_most(train_set), is_leaf=True) # 这里让叶子结点的标签为概率上最可能的标签- r: {+ j( s6 e' R- @
if self.tree == None: # 如果根节点为空,则让该节点成为根节点 4 s3 l/ A: Z0 ^0 m$ | self.color_dir[vote_most(train_set)] = color_set[0]+ F. ~8 q8 g8 E
self.tree = node/ `8 X. z$ Q8 @. C: G+ d$ [
R+ h. N- U8 r4 S, z( _ # 用于作图, 更新 map_str 内容, 为树图增加一个内容为标签值的叶子节点. n" O/ a E' A% d8 ~, v4 {; l: k
node_content = "标签:" + str(node.target_value)& }7 L( U4 W# u d
self.map_str += "id" + str(node.id) + "[label=\"" + node_content + "\", fillcolor=\"" + self.color_dir[node.target_value] + "\", style=filled]\n"1 G, m1 \* Z0 k/ o s
% w, {6 P+ {* |3 d# J1 j& P6 X' d return node ) f0 Y' e: ]) k3 f5 g* I) D# {( m else: # 普通情况, 构建一个内容为属性的非叶子节点( x6 z. t8 G4 j# S. N; B
best_feature = best_spilt(train_set) # 寻找最优划分属性, 作为该结点的值 2 Y( l, ]4 g, }" d3 b9 |( P6 w" h best_feature_index = -1 - T T6 ?7 w: d% P' D for i in range(len(train_set.feature_names)):1 k1 ]5 r+ I$ W& r# I
if train_set.feature_names == best_feature:$ t6 C2 Z. o1 N- L, o
best_feature_index = i/ s4 s3 q U5 R& X9 t
break ' T( Z9 |- v W3 R6 `1 i% ]. y! n& u% I" I3 z
node = dt_node(best_feature); b2 u) Z0 _: W2 y
node.vote_most = vote_most(train_set) $ _- O" T# T' j2 ~5 `! L( V' i if self.tree == None: # 如果根节点为空,则让该节点成为根节点 ( `8 u) J+ V% v7 n6 C1 ?* A self.tree = node ! q' r2 M6 z A" D # 用于作图, 初始化叶子节点可选颜色 & T2 c; E* _; f' H } for i in range(len(train_set.target)):0 ?' ]8 j3 p5 X) y; F/ |
if train_set.target not in self.color_dir:( v- O, c; z- P
global color_i 1 v& H C( y8 g self.color_dir[train_set.target] = color_set[color_i] : n' ^. y' R0 k! ^" I# g color_i += 13 F5 @ A6 v# f7 c7 y, i, ~
color_i %= len(color_set)7 \' Y0 O9 c. [+ j! @( n9 b2 O; ^
s U6 G& x' [; D# [+ l6 r) C2 s
feature_range = [] # 获取该属性出现在数据集中的可选属性值 0 y& z# j! X2 Z0 f- R' I for t in train_set.data: 7 U: U# @% l! [+ G. s if t[best_feature_index] not in feature_range:6 j* ]7 d. o- U: |) g: ^: s
feature_range.append(t[best_feature_index])# J2 P. C4 v) _" ~
- Q$ d/ X7 L2 ` # 用于做图, 创建一个内容为属性的非叶子节点& w0 c* K+ ] Q8 I$ {( _
node_content = "属性:" + node.feature_name' @6 j8 x, O: n
self.map_str += "id" + str(node.id) + "[label=\"" + node_content + "\", fillcolor=\"#AADDFF\", style=filled]\n"! x$ {, Z+ |9 D! O5 a: K( j- ^
9 k; N5 X5 k7 w! h0 V+ h& K/ c
for feature_value in feature_range:4 y$ [# u1 |: r8 y& s+ p
subset = get_subset(train_set, best_feature, feature_value) # 获取每一个子集 " i9 N& D, P" e" i' T5 P# [9 u7 Q! s node.child[feature_value] = self.fit(subset) # 递归调用 fit 函数生成子节点! n8 C9 H9 ]$ c1 r
if node.child[feature_value] == None: $ k$ A7 \7 U' c* |. ]* ^6 @* c0 D # 如果创建的子节点为空, 则创建一个叶子节点作为其子节点, 其中标签值为概率上最可能的标签4 U) m& ]/ S+ W) |
node.child[feature_value] = dt_node(vote_most(train_set), is_leaf=True) # z* n8 h$ H5 b' F- f5 E1 F3 x node.child[feature_value].parent = node4 R! p4 Y3 e/ a* z
! V6 Y. _7 M& v. C/ H8 D
# 用于做图, 创建当前节点到所有子节点的连线9 u6 w$ z0 ^! h. Y
self.map_str += "id" + str(node.id) + " -> " + "id" + str(node.child[feature_value].id) + "[label=\"" + str(feature_value) + "\"]\n" % d# w& R, g0 M* w6 L1 o6 s+ Q3 f$ e( J. p+ E& h& t) ~' |) {. v4 T
# print("Rest Festure: ", train_set.feature_names) 1 G& K9 D0 k) P9 T # print("Best Feature: ", best_feature_index, best_feature, "Feature Range: ", feature_range) 4 d6 K. ]/ V: ]1 o # for feature_value in feature_range:; }4 T4 L0 x& { }4 m
# print("Child[", feature_value, "]: ", node.child[feature_value].feature_name, node.child[feature_value].target_value) 4 z4 I- \) Q, U return node & o- A- E1 L, I& d ! |8 U# |- e8 |3 c8 |+ ?* Z # 测试模型, 对测试集 test_set 进行预测 ) z8 s9 |1 D/ W def predict(self, test_set): v& O; w$ D$ S3 Z# X test_result = [] 4 [ j# l/ _, Y! x, ~ for test in test_set.data:, Z- r2 J9 L: j1 S# z0 }- q- k
node = self.tree # 从根节点一只往下找, 知道到达叶子节点 % u Y8 s! o: F0 {9 g8 @3 V while node.target_value == None:4 g; A, G' m0 z! n: B: {
feature_name_index = -1* H+ [4 C# t) h/ w0 g) k
for i in range(len(test_set.feature_names)):* H$ M0 F& |0 j% U0 q$ a
if test_set.feature_names == node.feature_name: {8 P. Y" h( p* H. W feature_name_index = i# c9 K ?! n. F' q' [- e8 [
break& a( l$ v- L% t
if test[feature_name_index] not in node.child.keys():* n5 \$ \- E3 G" C3 H: Z/ a9 [
break" w; P( j+ c9 t$ t, e0 }$ J! p
else: % {5 c$ h$ O$ W" e1 L4 M' v node = node.child[test[feature_name_index]]* m; p1 m; n& V/ D, @
, L; l& ?; h3 G6 k; G if node.target_value == None:( l" T3 m7 O4 P u5 G
test_result.append(node.vote_most). B0 [: A+ h$ R% m1 l
else: # 如果没有到达叶子节点, 则取最后到达节点概率上最可能的标签为目标值 + k. ^7 g- G/ C test_result.append(node.target_value)7 v; O, v6 Q7 F9 x6 d" v
) ^1 z' A5 T2 t- d8 o# u; |3 Y$ T return test_result: n! b) J% c" U
# I% I9 F( ]( x' E# \
# 输出树, 生成图片, path: 图片的位置, E1 C) Z6 b+ Q; A6 y
def show_tree(self, path="demo.png"): w" v/ \9 d) Q! O( V map = self.map_str + "}" i( G0 f7 a9 F, K7 l: Y L1 C( @
print(map) / H% y. g& g s; K t graph = pdp.graph_from_dot_data(map) 6 s# P/ u' j1 B% S4 y graph.write_png(path) * H8 E' R7 J( L0 U2 I0 ?* c `4 K0 t% _# `" J- M: c! @
# 学习曲线评估算法精度 dataset: 数据练集, label: 纵轴的标签, interval: 测试规模递增的间隔 " D% J0 u( Y; S. L/ v6 `+ Jdef incremental_train_scale_test(dataset, label, interval=1):* {' L1 O- y0 e# N: x- t9 `$ L
c = dataset5 y7 u+ j) Z1 R9 }) X: n- `$ T
r = range(5, len(c.data) - 1, interval) * K! u9 |5 c1 ?; X6 n4 a rates = [] 3 x# k/ {" I+ ~ R _+ K i for train_num in r:3 m H2 \9 N) g9 R7 W% u: ]
print(train_num)9 q/ W9 r1 V* F& ^3 n
train_set = new_dataset(c.feature_names, c.target_names, c.data[:train_num], c.target[:train_num]) ) l$ J( E, d7 ]" V. B2 L test_set = new_dataset(c.feature_names, c.target_names, c.data[train_num:], c.target[train_num:])4 S4 `0 R3 m, v; z9 b
dt = dt_tree() 6 }' J( |2 j4 u N0 u2 e6 a dt.fit(train_set) , K# q [( Q; m1 E" f rates.append(accuracy_rate(dt.predict(test_set), list(test_set.target))) ) C9 M [, G5 T3 ^- A 3 d- G& W5 t/ g8 H print(rates) : r3 P, e( w# t0 x' H plt.plot(r, rates) $ Q7 ]& N; v" V# M% y' r" g: | plt.ylabel(label) p3 W1 T4 d7 J" r( Z% O plt.show() + ~2 ~$ S% h3 G4 Q( J; r# e- [4 w g5 W8 G
if __name__ == '__main__': * `7 P/ d" X; G: O* G w1 c" x: g j( v
c = load_car() # 载入汽车数据集. D, T1 ^2 L! P! P
# c = load_mushroom() # 载入蘑菇数据集6 H. w( X) J, _$ Q
train_num = 1000 # 训练集规模(剩下的数据就放到测试集) - G+ A. h' N, X- }% }# T0 f train_set = new_dataset(c.feature_names, c.target_names, c.data[:train_num], c.target[:train_num]). f- ]/ m# Y: y- C
test_set = new_dataset(c.feature_names, c.target_names, c.data[train_num:], c.target[train_num:])! ]2 U& z; d; ~
8 K I7 U; c9 `& K/ Z) u# c
dt = dt_tree() # 初始化决策树模型+ L0 p/ B% t9 U0 r& G
dt.fit(train_set) # 训练6 J! x, s0 z5 V4 s# c
dt.show_tree("../image/demo.png") # 输出决策树图片 8 d1 u3 ^7 S* a; X6 X' U print(accuracy_rate(dt.predict(test_set), list(test_set.target))) # 进行测试, 并计算准确率吧9 c7 L' k9 Y' ^5 a" U
% T& y3 a. ?! i) a
# incremental_train_scale_test(load_car(), "car")0 l: @7 n$ C- ^" o* S' Y0 S( ^ B
# incremental_train_scale_test(load_mushroom(), "mushroom", interval=20) S& }% @: B" X- S0 w G) [
6 ~' [+ N4 v3 B( B; h) Z4 ?/ }, y* ?& K7 M, g$ c
1 J m; Q( m" m8 ~
1 % u n4 D* V' W: Q2 6 ^8 D' P A' _8 C+ Z30 B0 z: {8 ]6 ]% m7 r
4) g4 v3 ~ @3 [4 U
5 / w1 B( M" ^% U8 M6 9 J$ A2 _3 E6 k8 f5 C7! N# X0 m w' I3 f# a) q, B6 n
8' P9 {+ W/ P& V" A7 r- x( N
9 ( u$ O9 }2 c7 l, d4 x3 L10 - l( [7 O6 v1 C; i& G: W2 z0 r+ @5 U2 O11 # M! K5 M& g+ D. ]( L6 d7 I" ~12 q) h) G1 R1 x( D7 w; S13 1 O s- W/ t- x7 g7 S0 P0 ?/ B& a14/ s1 Y# [* C! S; z5 s$ w
15$ I8 R3 L! A- L) N9 M: L
16 ; n. }! S9 X a& ]* \5 @' w3 e17 + h3 z8 A% l7 ?2 y0 A) d18 + Y& q$ o) {# V% ~& U5 V2 _19 9 f: V- A* x, H g20; H* T- b0 B) F. z
21 3 z9 v: W1 f8 h222 R2 x1 D) e T- M: G
23 + @2 K: @" B9 [7 I) B# k8 k& h24 / u6 N" ~0 D6 ]25 0 V' F% J$ x) Y$ W$ I266 h' p t& s k* L# T C/ X1 g
27" ^. ?- R6 A+ T6 S l7 V
28 9 @2 z- e) ]. w; s6 d1 B$ I& B29 . S* U& x' U3 C+ t4 S3 ^307 _9 c. U6 s2 G
31 ; r& G. G$ ] T9 s329 ~$ {8 E( j$ i
33/ B0 A L& L3 w) p! o3 r7 e: s
34& r* ? O3 A1 @5 w
35 5 P& ]1 o i$ d2 s: g36 9 k% `) t' I7 ?# U5 R6 P0 ^. L37 # N* Z6 ~9 c O ^38" ^0 a8 X: M0 _ q
39 E3 n$ e& J. l! ~0 j- H' h40 ! Q4 k O3 ~$ l41+ e- l9 _& \! K5 ^; h
42, y8 k$ }# `: h: ^8 B1 ^7 e
43 9 c8 C, j( u' k# R) @44, [0 Z4 N. }3 {' c! \# ?) B* K
45 & x, ^+ N+ H+ S. ]) L J; B. M9 T46 + }2 R. m1 |9 L% v. @! ^47 + H6 {6 G. e$ l8 d48 ; ~8 C$ p" \2 A. Y6 t! y5 v+ t49 & Z" M! s0 X8 L50 ) [7 L+ r* R8 _' r2 S; U51& N3 C0 I* c. }+ ]* v; Z
525 i9 p% Q; Z- o; D: ^
530 f" S; k- C7 H+ N; w& v6 p
54 # z. Q! r4 Z T: E" A# Q55 $ ]( E5 @6 @& S* e/ ~6 r56; I: u K3 Z& z6 ^" r$ \
57 : G% |1 j" ?0 i# n. q: m58 6 n4 j9 `+ `* _# X3 @+ ~) k5 F! x. l59( B/ \+ P+ D/ W: ]; }; D
60! _, o Y6 v+ m+ o- t
61 / q- t! u- ~4 {% b) Z62 . |# _5 X+ W# h63 , n& n) M2 Q; c6 T% F( i64. E- T# Q4 y9 S) C; L
65 . f1 R: ?; j: D66: G' p7 h( g' C3 n Z% c+ T
670 i& i- i0 x) D" ?
68 . O2 c& y+ ?4 _- Z69& b9 O( {1 u0 B4 ]$ S
70 \+ L% E& G" ~) D$ F; y- H71 6 W- {: h7 j6 t1 P72 9 v# k" D. K. k+ B! y! M5 L73 * ^8 ~: x9 Q. f. ?% p74# i0 u4 Y0 Z9 v: {$ |9 d* h+ l e" {
75 7 l8 g' _+ a; I. V' z; d76' g5 X& k5 a0 K( Q( E0 x' }
77 ' ?- L( J9 N/ Q, e& R U78 6 i7 Q1 h' k9 \79 % }$ U' ] D4 g6 E80 0 i: M) H- a D, F0 q0 q8 h2 v( j81% S1 w, j' c2 G# n o# x& r0 ~0 m
82 $ [: z: M- I6 B D, j83* z# ~$ J% U% L6 J/ p. g7 ] R p. C
84/ C( e7 m9 ?0 Y. \8 q x; n6 C& P
85, v0 u1 `. p! b/ n
86 $ ^9 [+ m9 I$ ]! N87. x0 p: u. c% w" v2 T p- R
888 F; z6 o I+ j% K3 Z5 u* W' o" d
89 1 f2 H8 u- j! A: g# @90 5 x0 n# F6 x+ _5 q: M. r91* e7 s( {+ V" O( U, _5 u
92 0 T: W% Y3 V% `6 u* m93: P! O3 j3 Y C2 h8 D0 O" u9 I
94 9 A' ?0 j; G0 i! C5 r95 % H9 m9 q+ l/ K) B6 D2 ^( b96 & v" ^1 p- Y' u0 Q' N2 c97 7 U! W4 D+ K; V3 z$ d, t" z984 @6 i1 L; e4 a4 j
99 - Q2 x/ ]7 D; r100 / \8 p# ~* t; P# l2 Y101% }7 L1 r0 p3 ]
102 & K' u& N. E& `6 Y9 h7 {: I103. l H, |/ t, |
104& U/ z0 H, \5 Y# F3 {& Q# R- v/ X
105& i( |0 z( B% a
106 + }4 j6 ^, Q0 }107! f0 M+ {# V% m" s- {
1086 W. j& W/ u& T. N3 [
1096 X( q. h1 ?% _* s- s' n
1100 k$ J' \7 q e
111 6 a7 N3 z8 ^& a! p M! [8 e) |1125 [* n/ { l8 {% ]5 o# N, G
1136 {% X, Z7 H9 w. @4 v8 P, X
114% k; H9 @' s; t; q
115- F$ E( d3 d' n. u9 J/ _4 s9 p
116 * c7 R& D9 n& m( R- m k+ |8 c5 a! @117 3 `- g6 v5 S+ M- r Q118 : r! G9 P- I4 K( O% P119( \ ]' p* E) s
120& X& \5 ]$ V& O, p
121' P2 } x3 D$ P) B7 `& Y
122- c- r9 ~+ {" f9 H
123+ K1 O" s" ^9 K
124 1 Z, U- H) P ~7 t. J/ V125 & \) N8 m. }) q4 q; q& |2 D126 0 A4 O$ Q1 @# U+ u: _127! X* S8 R/ g' S; R7 m# M8 D$ g
128" z* y q! a' }( |
129 ; N+ G# y7 N5 D6 L- _130 5 c- \; z! T8 Q; l131# M2 B3 j! e- a. n# O
132* e4 j' \) r& G/ u! |
133 / l7 y1 m& R; e: i$ _1344 m& F+ z+ n3 t" |- \
135 0 a& q# @ h- [1363 d( z% W4 L% S. C$ Y5 ~
137 7 w9 r* N6 r" ]138 , m; G, A6 B: _% j# D% M1392 W j& M5 e' F% z
1400 c/ h& \! x3 U% A: q- i" L
141 - @# V9 J6 |: {* {142 4 Q/ k: V) U' e, r q/ F143 * o P9 M! _- H2 a. t144: u0 h7 z. w/ X0 J+ {
145, w# f( c b# G( @7 J$ h' P' s8 g
146 2 P/ a) g4 J7 n- g' `( b( Q147 9 m9 z4 o5 ], ~. d8 R148 8 [6 s& ]6 x: j# D$ _. X149 * y8 ^ O o+ b' r6 C' A150! d$ X: ?3 q1 m6 T
151 & Q# I/ P# e; u1 i8 i152 & D, q" u3 ^: s6 p6 r153 * k$ ?' T) U" I0 w }154 6 b4 g/ G i4 ~/ _) B+ W155 , X+ f6 o n% w6 o: ]156$ F% p7 L+ f* J0 Q
157/ u) V9 G- A, |& `, j* A' c/ J
1587 S! ^; z% f) f: y
1593 N; ?, @' X, \' K e/ a& d
160. g: H* f3 [% g/ n* n% f
161 8 r5 ?0 g- j! O- z* C. B! }& _162 , ~/ N" V' w( d1637 p7 p4 f5 H. h/ e0 e) J8 A& n
164 & ? z. @1 a8 C0 x3 F8 s, h165 8 G' Z# ]( \/ j/ y1665 Y- H7 r) v& R: n+ W* @2 W6 ?
167 0 u8 b4 X' R) h2 f1 Y168 ) }7 [$ r" U# z, i7 z$ O169: `/ T& x2 u. E' K4 x
170 4 Y3 q# l8 a, [2 w6 W171 5 c4 N0 x; T: ^$ ?) R; x, t5 v+ {172: k0 @- ^* L( s- x+ {/ G
173$ `5 Z1 g( \8 q- I R, m
174 4 {0 O1 ~* A+ f9 }9 A& h% G175 & h6 K* H+ |5 N. P# p) ^* @1 s176 : L0 p0 ~. \; f' D& Z2 q% u* e177 4 N" B. @: I, z$ j178: S. a0 @ m7 Y
179! y6 K! C$ v9 ~
180 7 n: t( e( {- p+ a/ v181 ) H8 T6 h6 k" X# m; U' `182 2 _0 V) a- q6 w183! D3 w% \; k2 g% M
184. t: C8 g1 z& p3 H W, X: O
1853 h, X g; v7 ]& e* J2 [/ q
186 ) W. {3 Q4 A/ T187 ( B' \- |6 g! Q& J5 ?6 a, X188 4 x8 f; c* I8 @5 W189 " P( h0 Y1 W1 M3 w4 J190 W8 E# Y, H8 q$ C3 Z
191 3 W9 d' v6 E1 ^) o' ~" p$ e6 E1927 K i3 b8 _1 H; [! t
1937 Y4 t4 @2 [1 s# n$ R) P8 ]
1947 h- c) Z) [2 N0 r' {3 Q
1959 A6 f @: }$ D7 y
1963 v1 v( Z: Y9 d3 s4 F3 k
197 . a* j& Z4 n( u2 p' W g1981 W& A0 R, d& ?) \) a
1991 M4 ?$ `* k1 v; d2 h
200 5 |$ f" I; ^* L" D2019 `/ O+ z0 T4 c' b& f" ~ ]
202 7 t+ i6 d G3 k/ u0 E; W4 y! t203 1 f5 h i" ~3 |5 o204& [* G! X3 @ W& D+ S
205 9 p S5 E# H; I1 x206, _9 m& R& n8 k* r3 e' m
207+ A& ^- g- b+ K# D8 d5 e7 c! y# F& g
2085 T0 D. K' @6 N+ e ?* [
209 4 j2 `9 ] I+ P, _; {2105 h6 ?& f( N+ N# a
211 1 F% J/ h- z: Z1 I& h# E212 % ^( g9 W, a5 n {213 6 c, |' L2 Q. e D$ e8 j214# r& S, }) E6 R: e2 T1 ~5 v
2154 B b* ?4 j. s) F
216 3 C& A1 x1 D1 z- b: y; r1 V& [# Z217 0 S4 D, V4 {: A% l# B9 @$ H0 {2189 L9 a3 B/ i4 C: Z
219 ( ?/ ]1 R9 t+ N220$ _! ]! A' `$ m/ q: w
2217 @( z$ X' J" ]% i
222 3 C' Y) p. ~* o2 W7 {. h$ d223 # J* T9 d2 T' t224 ' _" z& m% V5 _+ A225 - S5 t& o. S, {, E226/ e! V! ]& x4 ?; T. }
2274 Q8 e! w9 d$ u3 r, F
228 ' \6 S t4 B) v$ i7 O- b/ u8 L+ x2292 W9 Q+ G* M% o% I" o
230! D7 G$ m, S4 B2 x( w% s) y
231 ; m, ]1 } m8 [6 y% F& n& j2325 h; o6 F3 y- Z% J; k9 U
233 % u: \( G* X9 \/ ^234$ o& ~7 e) j7 p B8 ~
2354 g# L, A9 W2 p1 I
236+ T; N4 V; L. X& h& ~( o( m% P" F( v
237- ^- B9 f! v% b6 W" l
238 7 L/ ?; L* g2 x L239 a3 R+ s9 k, B# Z2 I9 L2403 e* X* u9 ]. U' p
241 ^& E. T* L4 Y, U. N+ y* F242 ' |, A& W" H; m6 c+ h( Z243 7 c _! ~+ G" {244' J) ]' ^6 ?& i1 A2 w( ^% [
245) u* S' u5 ~/ J" _+ k3 R% {
246 # c6 R7 \; I( H# g$ \" n" f247 : L0 N0 ], v/ f3 x# S248( q/ b% {# X; V' R
249 % A. }1 `/ i& Q2 L9 Z: O* P250$ K6 q3 A8 }5 b& t2 |1 y2 G0 \
251" X, E# W2 } C0 B6 ~7 B4 |5 I% l
252 , K9 z' T8 F& B+ a- ~253 & U" e& M. V- p5 y% D9 t& q: @254 6 n( J1 a8 p4 `3 }. f" b255 2 k( Y5 Z4 U- U/ L# f: A256 5 N8 ^+ p" A! @ T257 }/ }- \' ^& ]3 J
2583 q) b8 x: o* y! U, z
259 2 p# q# m1 p$ I7 U+ {) e260 - |7 g% x" O: o8 ^) ? h# U- O261" ^+ q, I& X I9 w
262 8 u+ \$ b4 M8 B8 T263 , n+ W1 A5 k5 ^8 n2648 N+ I9 `* V/ p- i, e8 [- W1 a8 `
265 9 `% F2 Z4 H9 J266" C( ^6 ^5 c& u; ^+ w- I
267 C1 ]; C' `' V
268& Q- U) M) w$ S% i- {, b( h4 K
269 1 k* F$ n* T: |270 ) @: f* K( ]* y L; r8 w% y271 h4 v- Q8 v: D3 W' P- X272 & d( K# q6 B7 \, c273 ( p' L. f5 P0 K. `274 / `. d! c$ {- T275 - c$ ~2 V, @) m B; Z# O3 c2768 s' v9 k1 g; Z$ n. d; S$ }
2774 X5 z# @1 k( w# g3 z
278$ {0 E. j+ v3 M! g( Z
279* i. ]" E9 p3 z% ~& j: [! X1 `9 @
2808 R$ n8 ?3 P |5 M8 x, y( U q
2810 C$ f* Z+ }" J! q
2822 T. [, }" G: K" j
283! j& ~% g7 I0 S9 Y9 K, T, O0 @
284 0 D+ B. \$ ^: K; }285 R# x2 i7 ^ V# c5 a
286 . R, m/ b' D4 U7 V4 ^% U8 s, w287% X1 _4 }+ x: f& W5 [
288 ! {: D; }( V5 a289, ]" d1 S# I* ~
290 : D4 i P' r3 c* Z291 " u5 A9 W8 X$ _292' K- D! i7 ?5 Y$ X V- n9 j- A
293 , E* f6 Z) I* _ o; l1 m294 ! `$ M9 D, ]& q2 S- ^9 _$ ?295$ n7 c" q& ~ k2 L0 o
296' f& ]) m0 U2 ` h/ U, F
2973 e1 G: N1 {! E2 y
298! j2 q% m& f7 w% l
299 ) E# P( B. n) p& ]$ P: Y8 `) t300 3 y5 F' \' m6 q0 I301 & {% [. j Q$ I0 o( E$ \302& f1 d6 V5 }1 x$ W2 m
303" o/ y: ?* [7 }" D' D
3040 M2 i! F) J6 a- R: R: }& j0 o
305 1 X8 t0 }+ J0 e3 L) E2 \306+ B2 Y k8 H/ B4 e4 y
307 / k0 l3 g2 K( m U' o308 1 L$ K4 n# k" @/ R; f1 a( V# j9 Q; j309* r* W! X- S0 Q& r
310 ; S. [) j2 }# s) [7 F( l9 E311 - o7 b0 _' j% Q( o! s312 - X4 u) `2 [ s7 l313$ ?% N# a$ r5 k y
3143 T& @) @: s x1 m& [
315; g; V( p% x. n" N3 d: h: N
316 9 k( ^2 f( d1 Z317+ n9 k7 w, T- E* V# k
318 ' z) h _0 u+ C2 C) K319 + x; t) @2 W0 \- A320 0 H, ?- A) D4 r5 ]. [* @321 4 R: O! R" ~" w% F322 6 M2 @9 Y9 k# _2 q323 + r% \2 V, @# z9 F" e+ e) E324 3 l9 y6 M2 O5 D; L9 n9 ~* l325 6 ~2 B6 \$ t2 `" b5 }8 L3266 q' M; _3 U4 Q3 v M5 `
327! k( _& m b* D6 X# w
328! w& Y7 ?& B; [+ ^: `1 R
329/ d2 k/ t8 [- ~: j$ n. t# v& U
330/ ` F0 h2 _, d
331: q- m3 o. a0 t4 R2 X1 C( y8 h) @