├── README.md
├── 시즌4 발표자료 저장소
├── NatureOfCode
│ └── fractal.pptx
└── 밑바닥
│ └── 11.K-Nearest Neighbors.ipynb
├── 스터디 일정표.xlsx
├── 시즌1 발표자료 저장공간
├── 1회차 ch1
│ ├── Basic Of Symbolic Computation.ipynb
│ ├── ch1codingthematrix(1).ipynb
│ └── ch1codingthematrix.ipynb
├── 2회차 ch2
│ ├── CodingTheMatrix-2.7-Problems-realtime.ipynb
│ └── CodingTheMatrix-2.7-Problems.ipynb
├── 3회차 ch3
│ └── Ch3_Vector.ipynb
├── 4회차 ch4
│ └── 150718_4.vector_space.ipynb
├── 5회차 ch5
│ └── Ch_5(Matrix5.1~5.8).ipynb
├── Collection of References.docx
├── Week 3 주성분 분석 및 클러스터링.html
├── ch13_박정은
│ └── ch13_eigenvector_수정.pdf
└── 직교화-복작복잡.pdf
├── 시즌2 발표자료 저장소
├── 06-slides.pdf
├── 10M_CLASS_2015_AssortativityHierarchy-PartI.pptx
├── 10매개변수.pdf
├── 151128_ch03_RandomNetworks
│ └── ch03_RandomNetwork.pdf
├── 160116_무한수열과 무한급수.pdf
├── 160123_Intro to LIS_Retrieval.pdf
├── 160130_박정은_network_ch09_communities
│ ├── 박정은_ch09_communities_01.pdf
│ └── 박정은_ch09_communities_02.pdf
├── 네크워크 인토로
│ └── 01-slides.pdf
├── 복잡복잡스핀_역지수로그역삼각.pptx
└── 칸아카데미 정보이론
│ ├── infomation_theory_ancient_송치성.pdf
│ └── infomation_theory_modern_송치성.pdf
├── 시즌3 발표자료 저장소
└── JupyterNote
│ ├── ComputationalPhysics(1).html
│ ├── ComputationalPhysics(2).html
│ ├── ComputationalPhysics.html
│ └── ComputationalPhysics.ipynb
├── 시즌4 발표자료 저장소
├── 11 machine learning
│ ├── .ipynb_checkpoints
│ │ └── 11 machine learning-checkpoint.ipynb
│ ├── 1.png
│ ├── 11 machine learning.ipynb
│ ├── 2.png
│ ├── 3.png
│ ├── _DS_Store
│ ├── luke.png
│ └── true.jpg
├── Chapter5_stastics.ipynb
├── NYDW Bandit Presentation.ppsx
├── NatureOfCode
│ ├── Oscillation-Nature Of Code.ipynb
│ ├── 물리엔진라이브러리.pptx
│ ├── 세포오토마톤.pptx
│ └── 파티클 시스템.pptx
├── ch04_linear_algebra.ipynb
├── 밑바닥
│ ├── [밑바닥]선형대수_0730_1.pdf
│ ├── data science from scratch
│ │ ├── data science from scratch 1 .ipynb
│ │ ├── .ipynb_checkpoints
│ │ │ └── data science from scratch 1 -checkpoint.ipynb
│ │ ├── _DS_Store
│ │ ├── a.png
│ │ ├── b.png
│ │ ├── c.png
│ │ └── data.png
│ └── 밑바닥-GradientDescent.ipynb
├── 송영숙 파이썬 통계 자료
│ ├── brain_size.csv
│ └── statis.ipynb
├── 파이썬으로시작하는수학
│ ├── 파이썬-Chapter7.ipynb
│ └── 파이썬으로 풀어보는 수학, 2장.docx
└── 황윤연 특강자료
│ ├── 10분 Pandas.ipynb
│ ├── 10분 Seaborn.ipynb
│ ├── 서울시 지하철 호선별 역별 시간대별 승하차 인원 정보.xls
│ └── 활용예.ipynb
└── 파이콘 발표자료
├── Chapter7.ipynb
├── DoingMathWithPython.Ch02.ipynb
└── DoingMathWithPython.Ch04.ipynb
/README.md:
--------------------------------------------------------------------------------
1 | ## 그룹에 대한 설명
2 | ----------------------
3 |
4 | 1. 본 그룹(https://www.facebook.com/groups/631032050388643/ )은 전산 및 기타 관련 분야들에서 사용하는 기초 학문들(산수, 알고리즘, 자료기초, 병렬처리 알고리즘, 기계학습기법 등)을 스터디하자는 취지로 모임을 개설하였습니다.
5 |
6 | 2. '심플렉스 컴플랙서티'이므로, 복잡계와 연관이 있지만, 1번에 언급했듯이 복잡계외에도 다양한 분야에 대한 기초적인 학문을 스터디할 예정입니다. (단 이 그룹에서 진행할 '복잡복작스핀 스터디'의 경우는 복잡계가 최종 목표입니다.)
7 |
8 | 3. 스터디는 되도록이면 천천히 진행할 예정입니다. 또한 다 같이 배워간다는 느낌으로 할 예정이므로, 각 스터디 참여시 되도록이면 발표를 하나이상은 하실 수 있습니다. (이는 나이랑 관계없이 스터디 참여 분들 전체를 대상으로 합니다. 말 그대로 스터디이니까요^^)
9 | 그러므로 스터디 참여를 하시기 전에 이를 염두해두시고 참여를 부탁드립니다.
10 |
11 |
12 | ## 본 github에 대한 설명
13 | -------------------
14 |
15 | 본 깃허브는 그동안 구글드라이브로 제공되던 자료를 좀더 정리된 형태로, 그리고 누구나 접근이 쉽도록 하기 위해서 만든 것입니다.
16 |
17 | 현재 스터디원을 제외하고는 읽기만 가능하므로, 만일 스터디 원이면서 이 깃허브에 접근권한이 없을 경우 dyanos@gmail.com에 깃허브 아이디를 알려주시면 추가를 해드리도록 하겠습니다.
18 |
19 | 감사합니다.
20 |
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/NatureOfCode/fractal.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/NatureOfCode/fractal.pptx
--------------------------------------------------------------------------------
/스터디 일정표.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/스터디 일정표.xlsx
--------------------------------------------------------------------------------
/시즌1 발표자료 저장공간/1회차 ch1/ch1codingthematrix(1).ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "#1. 3 함수"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "##함수의 종류\n",
15 | "항등함수\n",
16 | "역함수\n",
17 | "가역함수(역함수가 존재하는 함수)"
18 | ]
19 | },
20 | {
21 | "cell_type": "markdown",
22 | "metadata": {},
23 | "source": [
24 | "###집합에 대한 용어와 표기법\n",
25 | "\n"
26 | ]
27 | },
28 | {
29 | "cell_type": "markdown",
30 | "metadata": {},
31 | "source": [
32 | "균등분포\n",
33 | "비균등분포\n"
34 | ]
35 | },
36 | {
37 | "cell_type": "markdown",
38 | "metadata": {},
39 | "source": [
40 | "
"
41 | ]
42 | },
43 | {
44 | "cell_type": "markdown",
45 | "metadata": {},
46 | "source": [
47 | "1.5 Lab 파이썬 소개\n",
48 | "1.5.1 간단한 표현식"
49 | ]
50 | },
51 | {
52 | "cell_type": "markdown",
53 | "metadata": {},
54 | "source": [
55 | "from __future__ import division, unicode_literals"
56 | ]
57 | },
58 | {
59 | "cell_type": "markdown",
60 | "metadata": {},
61 | "source": [
62 | "산술연산과 숫자"
63 | ]
64 | },
65 | {
66 | "cell_type": "code",
67 | "execution_count": 37,
68 | "metadata": {
69 | "collapsed": false
70 | },
71 | "outputs": [
72 | {
73 | "data": {
74 | "text/plain": [
75 | "87.45454545454545"
76 | ]
77 | },
78 | "execution_count": 37,
79 | "metadata": {},
80 | "output_type": "execute_result"
81 | }
82 | ],
83 | "source": [
84 | "44+11*4-6/11"
85 | ]
86 | },
87 | {
88 | "cell_type": "markdown",
89 | "metadata": {},
90 | "source": [
91 | "문자열"
92 | ]
93 | },
94 | {
95 | "cell_type": "code",
96 | "execution_count": 38,
97 | "metadata": {
98 | "collapsed": false
99 | },
100 | "outputs": [
101 | {
102 | "data": {
103 | "text/plain": [
104 | "u'This sentence is false'"
105 | ]
106 | },
107 | "execution_count": 38,
108 | "metadata": {},
109 | "output_type": "execute_result"
110 | }
111 | ],
112 | "source": [
113 | "'This sentence is false'"
114 | ]
115 | },
116 | {
117 | "cell_type": "code",
118 | "execution_count": 39,
119 | "metadata": {
120 | "collapsed": false
121 | },
122 | "outputs": [
123 | {
124 | "data": {
125 | "text/plain": [
126 | "u\"So's this one\""
127 | ]
128 | },
129 | "execution_count": 39,
130 | "metadata": {},
131 | "output_type": "execute_result"
132 | }
133 | ],
134 | "source": [
135 | "\"So's this one\""
136 | ]
137 | },
138 | {
139 | "cell_type": "markdown",
140 | "metadata": {},
141 | "source": [
142 | "비교, 조건, 불리언"
143 | ]
144 | },
145 | {
146 | "cell_type": "code",
147 | "execution_count": 40,
148 | "metadata": {
149 | "collapsed": false
150 | },
151 | "outputs": [
152 | {
153 | "data": {
154 | "text/plain": [
155 | "False"
156 | ]
157 | },
158 | "execution_count": 40,
159 | "metadata": {},
160 | "output_type": "execute_result"
161 | }
162 | ],
163 | "source": [
164 | "5==4"
165 | ]
166 | },
167 | {
168 | "cell_type": "code",
169 | "execution_count": 41,
170 | "metadata": {
171 | "collapsed": false
172 | },
173 | "outputs": [
174 | {
175 | "data": {
176 | "text/plain": [
177 | "True"
178 | ]
179 | },
180 | "execution_count": 41,
181 | "metadata": {},
182 | "output_type": "execute_result"
183 | }
184 | ],
185 | "source": [
186 | "4==4"
187 | ]
188 | },
189 | {
190 | "cell_type": "markdown",
191 | "metadata": {},
192 | "source": [
193 | "##1.5.2할당문"
194 | ]
195 | },
196 | {
197 | "cell_type": "markdown",
198 | "metadata": {},
199 | "source": [
200 | "어떤 값이 할당되게 될 변수는 할당 서술문의 좌변이라 하고 값이 할당되는 표현식을 우변이라 부른다.\n",
201 | "변수 이름은 문자로 시작되어야 하고 도토와 같은 특정 기호는 사용하지 않아야 한다. 밑줄은 변수 이름에 사용될 수 있다. 변수는 어떤 타입의 값도 바인딩될 수 있다. 변수 mynum 은 다시 문자열고 바인딩할 수 있다. "
202 | ]
203 | },
204 | {
205 | "cell_type": "code",
206 | "execution_count": 42,
207 | "metadata": {
208 | "collapsed": true
209 | },
210 | "outputs": [],
211 | "source": [
212 | "mynum = 4+1"
213 | ]
214 | },
215 | {
216 | "cell_type": "code",
217 | "execution_count": 43,
218 | "metadata": {
219 | "collapsed": true
220 | },
221 | "outputs": [],
222 | "source": [
223 | "mynum ='Brown'"
224 | ]
225 | },
226 | {
227 | "cell_type": "code",
228 | "execution_count": 44,
229 | "metadata": {
230 | "collapsed": false
231 | },
232 | "outputs": [
233 | {
234 | "data": {
235 | "text/plain": [
236 | "u'Brown'"
237 | ]
238 | },
239 | "execution_count": 44,
240 | "metadata": {},
241 | "output_type": "execute_result"
242 | }
243 | ],
244 | "source": [
245 | "mynum "
246 | ]
247 | },
248 | {
249 | "cell_type": "markdown",
250 | "metadata": {},
251 | "source": [
252 | "주의) 할당문에서 변수와 바인딩하는 것은 표현식의 값이지 표현식 자체가 아님을 명심하자. 파이썬은 먼저 우변을 평가하고 그 다음에야 비로소 그 결과값을 좌변에 할당한다. "
253 | ]
254 | },
255 | {
256 | "cell_type": "code",
257 | "execution_count": 34,
258 | "metadata": {
259 | "collapsed": false
260 | },
261 | "outputs": [
262 | {
263 | "data": {
264 | "text/plain": [
265 | "18"
266 | ]
267 | },
268 | "execution_count": 34,
269 | "metadata": {},
270 | "output_type": "execute_result"
271 | }
272 | ],
273 | "source": [
274 | "x = 5+4\n",
275 | "y=2*x\n",
276 | "y"
277 | ]
278 | },
279 | {
280 | "cell_type": "code",
281 | "execution_count": 35,
282 | "metadata": {
283 | "collapsed": false
284 | },
285 | "outputs": [
286 | {
287 | "data": {
288 | "text/plain": [
289 | "18"
290 | ]
291 | },
292 | "execution_count": 35,
293 | "metadata": {},
294 | "output_type": "execute_result"
295 | }
296 | ],
297 | "source": [
298 | "x =12\n",
299 | "y"
300 | ]
301 | },
302 | {
303 | "cell_type": "markdown",
304 | "metadata": {},
305 | "source": [
306 | "##1.5.3 조건 표현식"
307 | ]
308 | },
309 | {
310 | "cell_type": "markdown",
311 | "metadata": {},
312 | "source": [
313 | "(조건식) if (조건) else (표현식)"
314 | ]
315 | },
316 | {
317 | "cell_type": "markdown",
318 | "metadata": {},
319 | "source": [
320 | "##1.5.4 집합\n",
321 | "\n",
322 | "집합은 순서가 없는 켤렉션이며 각 원소는 집합 내에 오직 한 번만 표시된다. 어떤 표현식의 값이 집합이라는 것을 나타내기 위해 중괄로{}를 사용할 수 있다. 파이썬은 중괄로를 사용하여 집합을 출력한다."
323 | ]
324 | },
325 | {
326 | "cell_type": "code",
327 | "execution_count": 48,
328 | "metadata": {
329 | "collapsed": false
330 | },
331 | "outputs": [
332 | {
333 | "data": {
334 | "text/plain": [
335 | "[3, 3, u'a']"
336 | ]
337 | },
338 | "execution_count": 48,
339 | "metadata": {},
340 | "output_type": "execute_result"
341 | }
342 | ],
343 | "source": [
344 | "[1+2, 3, \"a\"]"
345 | ]
346 | },
347 | {
348 | "cell_type": "code",
349 | "execution_count": 49,
350 | "metadata": {
351 | "collapsed": false
352 | },
353 | "outputs": [
354 | {
355 | "data": {
356 | "text/plain": [
357 | "{1, 2, 3}"
358 | ]
359 | },
360 | "execution_count": 49,
361 | "metadata": {},
362 | "output_type": "execute_result"
363 | }
364 | ],
365 | "source": [
366 | "{2,1,3}"
367 | ]
368 | },
369 | {
370 | "cell_type": "markdown",
371 | "metadata": {},
372 | "source": [
373 | "집합 S의 크기(cardinal)는 그 집합 내 원소의 수를 나타내며 수학적 표현을 사용하면 {S}라고 쓴다. 파이썬에서 집합의 크기는 len()프로시저를 사용하여 얻는다. "
374 | ]
375 | },
376 | {
377 | "cell_type": "code",
378 | "execution_count": 51,
379 | "metadata": {
380 | "collapsed": false
381 | },
382 | "outputs": [
383 | {
384 | "data": {
385 | "text/plain": [
386 | "3"
387 | ]
388 | },
389 | "execution_count": 51,
390 | "metadata": {},
391 | "output_type": "execute_result"
392 | }
393 | ],
394 | "source": [
395 | "len({'a','b','c','a','a'})"
396 | ]
397 | },
398 | {
399 | "cell_type": "markdown",
400 | "metadata": {},
401 | "source": [
402 | "###합산하기"
403 | ]
404 | },
405 | {
406 | "cell_type": "markdown",
407 | "metadata": {},
408 | "source": [
409 | "컬렉션 내 원소의 합은 sum()이란 프로시저를 사용하여 구한다. "
410 | ]
411 | },
412 | {
413 | "cell_type": "code",
414 | "execution_count": 52,
415 | "metadata": {
416 | "collapsed": false
417 | },
418 | "outputs": [
419 | {
420 | "data": {
421 | "text/plain": [
422 | "6"
423 | ]
424 | },
425 | "execution_count": 52,
426 | "metadata": {},
427 | "output_type": "execute_result"
428 | }
429 | ],
430 | "source": [
431 | "sum({1,2,3})"
432 | ]
433 | },
434 | {
435 | "cell_type": "markdown",
436 | "metadata": {},
437 | "source": [
438 | "합산의 시작을 영이 아닌 다른 값에서 시작하고자 할 경우 sum()의 두 번째 인수로 그 값을 제공하면 된다."
439 | ]
440 | },
441 | {
442 | "cell_type": "code",
443 | "execution_count": 56,
444 | "metadata": {
445 | "collapsed": false
446 | },
447 | "outputs": [
448 | {
449 | "data": {
450 | "text/plain": [
451 | "16"
452 | ]
453 | },
454 | "execution_count": 56,
455 | "metadata": {},
456 | "output_type": "execute_result"
457 | }
458 | ],
459 | "source": [
460 | "sum({1,2,3}, 10)"
461 | ]
462 | },
463 | {
464 | "cell_type": "markdown",
465 | "metadata": {},
466 | "source": [
467 | "###집합의 멤버십 테스트하기\n",
468 | "\n",
469 | "집합의 원소인지에 대한 테스트는 in 연산자 not in 연산자를 사용하여 할 수 있다. 만일 S가 집합이면 x in S는 x의 값이 S의 원소이면 Thue로 평가되고 그렇지 않으면 False로 평가되는 불리언 표현식이다. 표현식 not in의 값은 이와 반대이다."
470 | ]
471 | },
472 | {
473 | "cell_type": "code",
474 | "execution_count": 57,
475 | "metadata": {
476 | "collapsed": false
477 | },
478 | "outputs": [
479 | {
480 | "data": {
481 | "text/plain": [
482 | "True"
483 | ]
484 | },
485 | "execution_count": 57,
486 | "metadata": {},
487 | "output_type": "execute_result"
488 | }
489 | ],
490 | "source": [
491 | "S={1,2,3}\n",
492 | "2 in S"
493 | ]
494 | },
495 | {
496 | "cell_type": "code",
497 | "execution_count": 58,
498 | "metadata": {
499 | "collapsed": false
500 | },
501 | "outputs": [
502 | {
503 | "data": {
504 | "text/plain": [
505 | "False"
506 | ]
507 | },
508 | "execution_count": 58,
509 | "metadata": {},
510 | "output_type": "execute_result"
511 | }
512 | ],
513 | "source": [
514 | "4 in S"
515 | ]
516 | },
517 | {
518 | "cell_type": "code",
519 | "execution_count": 59,
520 | "metadata": {
521 | "collapsed": false
522 | },
523 | "outputs": [
524 | {
525 | "data": {
526 | "text/plain": [
527 | "True"
528 | ]
529 | },
530 | "execution_count": 59,
531 | "metadata": {},
532 | "output_type": "execute_result"
533 | }
534 | ],
535 | "source": [
536 | "4 not in S"
537 | ]
538 | },
539 | {
540 | "cell_type": "markdown",
541 | "metadata": {},
542 | "source": [
543 | "###합집합(union)과 교집합"
544 | ]
545 | },
546 | {
547 | "cell_type": "code",
548 | "execution_count": 60,
549 | "metadata": {
550 | "collapsed": false
551 | },
552 | "outputs": [
553 | {
554 | "data": {
555 | "text/plain": [
556 | "{1, 2, 3, 4}"
557 | ]
558 | },
559 | "execution_count": 60,
560 | "metadata": {},
561 | "output_type": "execute_result"
562 | }
563 | ],
564 | "source": [
565 | "{1,2,3}|{2,3,4,}"
566 | ]
567 | },
568 | {
569 | "cell_type": "code",
570 | "execution_count": 61,
571 | "metadata": {
572 | "collapsed": false
573 | },
574 | "outputs": [
575 | {
576 | "data": {
577 | "text/plain": [
578 | "{2, 3}"
579 | ]
580 | },
581 | "execution_count": 61,
582 | "metadata": {},
583 | "output_type": "execute_result"
584 | }
585 | ],
586 | "source": [
587 | "{1,2,3}&{2,3,4,}"
588 | ]
589 | },
590 | {
591 | "cell_type": "markdown",
592 | "metadata": {},
593 | "source": [
594 | "###집합을 변경하기"
595 | ]
596 | },
597 | {
598 | "cell_type": "markdown",
599 | "metadata": {},
600 | "source": [
601 | "변경이 가능한 값을 mutable 값이라고 한다. 집합은 변경이 가능하다. 즉 집합의 원소는 add와 remove 메서드를 사용하여 추가하거나 삭제할 수 있다."
602 | ]
603 | },
604 | {
605 | "cell_type": "code",
606 | "execution_count": 2,
607 | "metadata": {
608 | "collapsed": false
609 | },
610 | "outputs": [
611 | {
612 | "data": {
613 | "text/plain": [
614 | "{1, 2, 3, 4}"
615 | ]
616 | },
617 | "execution_count": 2,
618 | "metadata": {},
619 | "output_type": "execute_result"
620 | }
621 | ],
622 | "source": [
623 | "s={1,2,3}\n",
624 | "s.add(4)\n",
625 | "s.remove\n",
626 | "s"
627 | ]
628 | },
629 | {
630 | "cell_type": "markdown",
631 | "metadata": {},
632 | "source": [
633 | "파이썬은 어떤 집합에 또 다른 컬렉션(예를 들어 집합 또는 리스트)의 모든 원소를 추가하기 위해 updata(...)를 제공한다."
634 | ]
635 | },
636 | {
637 | "cell_type": "code",
638 | "execution_count": 3,
639 | "metadata": {
640 | "collapsed": false
641 | },
642 | "outputs": [
643 | {
644 | "data": {
645 | "text/plain": [
646 | "{1, 2, 3, 4, 5, 6}"
647 | ]
648 | },
649 | "execution_count": 3,
650 | "metadata": {},
651 | "output_type": "execute_result"
652 | }
653 | ],
654 | "source": [
655 | "s.update({4,5,6})\n",
656 | "s"
657 | ]
658 | },
659 | {
660 | "cell_type": "markdown",
661 | "metadata": {},
662 | "source": [
663 | "마찬가지로 어떤 집합과 또 다른 컬렉션의 교집합을 취하여 다른 컬렉션에 속하지 않는 모든 원소를 그 집합에서 제거할 수 있다."
664 | ]
665 | },
666 | {
667 | "cell_type": "markdown",
668 | "metadata": {},
669 | "source": [
670 | "
"
671 | ]
672 | },
673 | {
674 | "cell_type": "code",
675 | "execution_count": 4,
676 | "metadata": {
677 | "collapsed": false
678 | },
679 | "outputs": [
680 | {
681 | "data": {
682 | "text/plain": [
683 | "{5, 6}"
684 | ]
685 | },
686 | "execution_count": 4,
687 | "metadata": {},
688 | "output_type": "execute_result"
689 | }
690 | ],
691 | "source": [
692 | "s.intersection_update({5,6,7,8,9})\n",
693 | "s"
694 | ]
695 | },
696 | {
697 | "cell_type": "markdown",
698 | "metadata": {},
699 | "source": [
700 | "두 개의 변수가 동일한 어떤 값에 바인드외어 있다고 가정해 보자. 이때 한 변수를 통해 바인드 되어 있는 값을 변경하면 다른 변수도 벼녕된 겂을 참조하게 된다."
701 | ]
702 | },
703 | {
704 | "cell_type": "code",
705 | "execution_count": 75,
706 | "metadata": {
707 | "collapsed": false
708 | },
709 | "outputs": [
710 | {
711 | "data": {
712 | "text/plain": [
713 | "{6}"
714 | ]
715 | },
716 | "execution_count": 75,
717 | "metadata": {},
718 | "output_type": "execute_result"
719 | }
720 | ],
721 | "source": [
722 | "t=s\n",
723 | "t.remove(5)\n",
724 | "s"
725 | ]
726 | },
727 | {
728 | "cell_type": "markdown",
729 | "metadata": {},
730 | "source": [
731 | "###집합 컴프리핸션\n",
732 | "\n",
733 | "파이썬은 컴프리핸션이라는 표현식을 제공하는데 이것은 다른 컬렉션을 사용하여 새로운 결렉션을 만드는 데 사용된다. 컴프리헨션은 값이 컬렉션인 표현식을 구성하는 데 유용하고 전통적인 수학적 표기법과 유사하여 많이 사용하게 될 것이다."
734 | ]
735 | },
736 | {
737 | "cell_type": "code",
738 | "execution_count": 77,
739 | "metadata": {
740 | "collapsed": false
741 | },
742 | "outputs": [
743 | {
744 | "data": {
745 | "text/plain": [
746 | "{2, 4, 6}"
747 | ]
748 | },
749 | "execution_count": 77,
750 | "metadata": {},
751 | "output_type": "execute_result"
752 | }
753 | ],
754 | "source": [
755 | "{2*x for x in {1,2,3}}"
756 | ]
757 | },
758 | {
759 | "cell_type": "raw",
760 | "metadata": {
761 | "collapsed": true
762 | },
763 | "source": [
764 | " 추가문제) 출처(https://datasciencelab.wordpress.com/2014/01/08/list-comprehension-in-python/)"
765 | ]
766 | },
767 | {
768 | "cell_type": "markdown",
769 | "metadata": {},
770 | "source": [
771 | "
"
772 | ]
773 | },
774 | {
775 | "cell_type": "markdown",
776 | "metadata": {},
777 | "source": [
778 | "List Comprehension in Python"
779 | ]
780 | },
781 | {
782 | "cell_type": "markdown",
783 | "metadata": {},
784 | "source": [
785 | "SQUARE ALL NON-NEGATIVE NUMBERS SMALLER THAN 10"
786 | ]
787 | },
788 | {
789 | "cell_type": "code",
790 | "execution_count": 13,
791 | "metadata": {
792 | "collapsed": false
793 | },
794 | "outputs": [
795 | {
796 | "data": {
797 | "text/plain": [
798 | "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]"
799 | ]
800 | },
801 | "execution_count": 13,
802 | "metadata": {},
803 | "output_type": "execute_result"
804 | }
805 | ],
806 | "source": [
807 | "[x**2 for x in range(10)]"
808 | ]
809 | },
810 | {
811 | "cell_type": "markdown",
812 | "metadata": {},
813 | "source": [
814 | "NON-NEGATIVE MULTIPLES OF 5 SMALLER THAN 100"
815 | ]
816 | },
817 | {
818 | "cell_type": "code",
819 | "execution_count": 14,
820 | "metadata": {
821 | "collapsed": false
822 | },
823 | "outputs": [
824 | {
825 | "data": {
826 | "text/plain": [
827 | "[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]"
828 | ]
829 | },
830 | "execution_count": 14,
831 | "metadata": {},
832 | "output_type": "execute_result"
833 | }
834 | ],
835 | "source": [
836 | "[x for x in range(100) if x%5 == 0]"
837 | ]
838 | },
839 | {
840 | "cell_type": "markdown",
841 | "metadata": {},
842 | "source": [
843 | "ALL CONSONANTS IN A GIVEN SENTENCE (WITHOUT REPETITION)"
844 | ]
845 | },
846 | {
847 | "cell_type": "code",
848 | "execution_count": 15,
849 | "metadata": {
850 | "collapsed": false
851 | },
852 | "outputs": [
853 | {
854 | "data": {
855 | "text/plain": [
856 | "[3, 9, 15, 21, 27, 33, 39, 45]"
857 | ]
858 | },
859 | "execution_count": 15,
860 | "metadata": {},
861 | "output_type": "execute_result"
862 | }
863 | ],
864 | "source": [
865 | "[x for x in range(50) if x%3 == 0 and x%6 != 0]"
866 | ]
867 | },
868 | {
869 | "cell_type": "markdown",
870 | "metadata": {},
871 | "source": [
872 | "FIRST CHARACTER OF EVERY WORD IN A SENTENCE"
873 | ]
874 | },
875 | {
876 | "cell_type": "code",
877 | "execution_count": 20,
878 | "metadata": {
879 | "collapsed": false
880 | },
881 | "outputs": [
882 | {
883 | "data": {
884 | "text/plain": [
885 | "{'c', 'd', 'g', 'h', 'l', 'm', 'n', 'p', 's', 't', 'y'}"
886 | ]
887 | },
888 | "execution_count": 20,
889 | "metadata": {},
890 | "output_type": "execute_result"
891 | }
892 | ],
893 | "source": [
894 | "import string\n",
895 | "punct = string.punctuation + ' '\n",
896 | "vowels = \"aeiou\"\n",
897 | "phrase = \"On second thought, let's not go to Camelot. It is a silly place.\"\n",
898 | "set([c for c in phrase.lower() if c not in vowels and c not in punct])"
899 | ]
900 | },
901 | {
902 | "cell_type": "markdown",
903 | "metadata": {},
904 | "source": [
905 | "SUBSTITUTE ALL VOWELS IN A SENTENCE BY THE CHARACTER ‘0’"
906 | ]
907 | },
908 | {
909 | "cell_type": "code",
910 | "execution_count": 21,
911 | "metadata": {
912 | "collapsed": false
913 | },
914 | "outputs": [
915 | {
916 | "data": {
917 | "text/plain": [
918 | "['O', 's', 't', 'l', 'n', 'g', 't', 'C', 'I', 'i', 'a', 's', 'p']"
919 | ]
920 | },
921 | "execution_count": 21,
922 | "metadata": {},
923 | "output_type": "execute_result"
924 | }
925 | ],
926 | "source": [
927 | "[w[0] for w in phrase.split()]"
928 | ]
929 | },
930 | {
931 | "cell_type": "code",
932 | "execution_count": 22,
933 | "metadata": {
934 | "collapsed": false
935 | },
936 | "outputs": [
937 | {
938 | "data": {
939 | "text/plain": [
940 | "\"On s0c0nd th00ght, l0t's n0t g0 t0 C0m0l0t. It 0s 0 s0lly pl0c0.\""
941 | ]
942 | },
943 | "execution_count": 22,
944 | "metadata": {},
945 | "output_type": "execute_result"
946 | }
947 | ],
948 | "source": [
949 | "\"\".join([c if c not in vowels else '0' for c in phrase])"
950 | ]
951 | },
952 | {
953 | "cell_type": "markdown",
954 | "metadata": {},
955 | "source": [
956 | "PAIRS OF ELEMENTS DRAWN FROM DIFFERENT LISTS"
957 | ]
958 | },
959 | {
960 | "cell_type": "code",
961 | "execution_count": 19,
962 | "metadata": {
963 | "collapsed": false
964 | },
965 | "outputs": [
966 | {
967 | "data": {
968 | "text/plain": [
969 | "[('Lancelot', 'Camelot'),\n",
970 | " ('Lancelot', 'Assyria'),\n",
971 | " ('Robin', 'Camelot'),\n",
972 | " ('Robin', 'Assyria'),\n",
973 | " ('Galahad', 'Camelot'),\n",
974 | " ('Galahad', 'Assyria')]"
975 | ]
976 | },
977 | "execution_count": 19,
978 | "metadata": {},
979 | "output_type": "execute_result"
980 | }
981 | ],
982 | "source": [
983 | "words1 = ['Lancelot', 'Robin', 'Galahad']\n",
984 | "words2 = ['Camelot', 'Assyria']\n",
985 | "[(w1,w2) for w1 in words1 for w2 in words2]"
986 | ]
987 | },
988 | {
989 | "cell_type": "code",
990 | "execution_count": null,
991 | "metadata": {
992 | "collapsed": true
993 | },
994 | "outputs": [],
995 | "source": []
996 | },
997 | {
998 | "cell_type": "code",
999 | "execution_count": null,
1000 | "metadata": {
1001 | "collapsed": true
1002 | },
1003 | "outputs": [],
1004 | "source": []
1005 | },
1006 | {
1007 | "cell_type": "code",
1008 | "execution_count": null,
1009 | "metadata": {
1010 | "collapsed": true
1011 | },
1012 | "outputs": [],
1013 | "source": []
1014 | },
1015 | {
1016 | "cell_type": "code",
1017 | "execution_count": null,
1018 | "metadata": {
1019 | "collapsed": true
1020 | },
1021 | "outputs": [],
1022 | "source": []
1023 | },
1024 | {
1025 | "cell_type": "code",
1026 | "execution_count": null,
1027 | "metadata": {
1028 | "collapsed": true
1029 | },
1030 | "outputs": [],
1031 | "source": []
1032 | },
1033 | {
1034 | "cell_type": "code",
1035 | "execution_count": null,
1036 | "metadata": {
1037 | "collapsed": true
1038 | },
1039 | "outputs": [],
1040 | "source": []
1041 | },
1042 | {
1043 | "cell_type": "code",
1044 | "execution_count": null,
1045 | "metadata": {
1046 | "collapsed": true
1047 | },
1048 | "outputs": [],
1049 | "source": []
1050 | },
1051 | {
1052 | "cell_type": "code",
1053 | "execution_count": null,
1054 | "metadata": {
1055 | "collapsed": true
1056 | },
1057 | "outputs": [],
1058 | "source": []
1059 | },
1060 | {
1061 | "cell_type": "code",
1062 | "execution_count": null,
1063 | "metadata": {
1064 | "collapsed": true
1065 | },
1066 | "outputs": [],
1067 | "source": []
1068 | },
1069 | {
1070 | "cell_type": "code",
1071 | "execution_count": null,
1072 | "metadata": {
1073 | "collapsed": true
1074 | },
1075 | "outputs": [],
1076 | "source": []
1077 | },
1078 | {
1079 | "cell_type": "code",
1080 | "execution_count": null,
1081 | "metadata": {
1082 | "collapsed": true
1083 | },
1084 | "outputs": [],
1085 | "source": []
1086 | },
1087 | {
1088 | "cell_type": "code",
1089 | "execution_count": null,
1090 | "metadata": {
1091 | "collapsed": true
1092 | },
1093 | "outputs": [],
1094 | "source": []
1095 | },
1096 | {
1097 | "cell_type": "code",
1098 | "execution_count": null,
1099 | "metadata": {
1100 | "collapsed": true
1101 | },
1102 | "outputs": [],
1103 | "source": []
1104 | },
1105 | {
1106 | "cell_type": "code",
1107 | "execution_count": null,
1108 | "metadata": {
1109 | "collapsed": true
1110 | },
1111 | "outputs": [],
1112 | "source": []
1113 | },
1114 | {
1115 | "cell_type": "code",
1116 | "execution_count": null,
1117 | "metadata": {
1118 | "collapsed": true
1119 | },
1120 | "outputs": [],
1121 | "source": []
1122 | },
1123 | {
1124 | "cell_type": "code",
1125 | "execution_count": null,
1126 | "metadata": {
1127 | "collapsed": true
1128 | },
1129 | "outputs": [],
1130 | "source": []
1131 | },
1132 | {
1133 | "cell_type": "code",
1134 | "execution_count": null,
1135 | "metadata": {
1136 | "collapsed": true
1137 | },
1138 | "outputs": [],
1139 | "source": []
1140 | },
1141 | {
1142 | "cell_type": "code",
1143 | "execution_count": null,
1144 | "metadata": {
1145 | "collapsed": true
1146 | },
1147 | "outputs": [],
1148 | "source": []
1149 | },
1150 | {
1151 | "cell_type": "code",
1152 | "execution_count": null,
1153 | "metadata": {
1154 | "collapsed": true
1155 | },
1156 | "outputs": [],
1157 | "source": []
1158 | }
1159 | ],
1160 | "metadata": {
1161 | "kernelspec": {
1162 | "display_name": "Python 2",
1163 | "language": "python",
1164 | "name": "python2"
1165 | },
1166 | "language_info": {
1167 | "codemirror_mode": {
1168 | "name": "ipython",
1169 | "version": 2
1170 | },
1171 | "file_extension": ".py",
1172 | "mimetype": "text/x-python",
1173 | "name": "python",
1174 | "nbconvert_exporter": "python",
1175 | "pygments_lexer": "ipython2",
1176 | "version": "2.7.6"
1177 | }
1178 | },
1179 | "nbformat": 4,
1180 | "nbformat_minor": 0
1181 | }
1182 |
--------------------------------------------------------------------------------
/시즌1 발표자료 저장공간/1회차 ch1/ch1codingthematrix.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "#1. 3 함수"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "##함수의 종류\n",
15 | "항등함수\n",
16 | "역함수\n",
17 | "가역함수(역함수가 존재하는 함수)"
18 | ]
19 | },
20 | {
21 | "cell_type": "markdown",
22 | "metadata": {},
23 | "source": [
24 | "###집합에 대한 용어와 표기법\n",
25 | "\n"
26 | ]
27 | },
28 | {
29 | "cell_type": "markdown",
30 | "metadata": {},
31 | "source": [
32 | "균등분포\n",
33 | "비균등분포\n"
34 | ]
35 | },
36 | {
37 | "cell_type": "markdown",
38 | "metadata": {},
39 | "source": [
40 | "
"
41 | ]
42 | },
43 | {
44 | "cell_type": "markdown",
45 | "metadata": {},
46 | "source": [
47 | "1.5 Lab 파이썬 소개\n",
48 | "1.5.1 간단한 표현식"
49 | ]
50 | },
51 | {
52 | "cell_type": "markdown",
53 | "metadata": {},
54 | "source": [
55 | "from __future__ import division, unicode_literals"
56 | ]
57 | },
58 | {
59 | "cell_type": "markdown",
60 | "metadata": {},
61 | "source": [
62 | "산술연산과 숫자"
63 | ]
64 | },
65 | {
66 | "cell_type": "code",
67 | "execution_count": 37,
68 | "metadata": {
69 | "collapsed": false
70 | },
71 | "outputs": [
72 | {
73 | "data": {
74 | "text/plain": [
75 | "87.45454545454545"
76 | ]
77 | },
78 | "execution_count": 37,
79 | "metadata": {},
80 | "output_type": "execute_result"
81 | }
82 | ],
83 | "source": [
84 | "44+11*4-6/11"
85 | ]
86 | },
87 | {
88 | "cell_type": "markdown",
89 | "metadata": {},
90 | "source": [
91 | "문자열"
92 | ]
93 | },
94 | {
95 | "cell_type": "code",
96 | "execution_count": 38,
97 | "metadata": {
98 | "collapsed": false
99 | },
100 | "outputs": [
101 | {
102 | "data": {
103 | "text/plain": [
104 | "u'This sentence is false'"
105 | ]
106 | },
107 | "execution_count": 38,
108 | "metadata": {},
109 | "output_type": "execute_result"
110 | }
111 | ],
112 | "source": [
113 | "'This sentence is false'"
114 | ]
115 | },
116 | {
117 | "cell_type": "code",
118 | "execution_count": 39,
119 | "metadata": {
120 | "collapsed": false
121 | },
122 | "outputs": [
123 | {
124 | "data": {
125 | "text/plain": [
126 | "u\"So's this one\""
127 | ]
128 | },
129 | "execution_count": 39,
130 | "metadata": {},
131 | "output_type": "execute_result"
132 | }
133 | ],
134 | "source": [
135 | "\"So's this one\""
136 | ]
137 | },
138 | {
139 | "cell_type": "markdown",
140 | "metadata": {},
141 | "source": [
142 | "비교, 조건, 불리언"
143 | ]
144 | },
145 | {
146 | "cell_type": "code",
147 | "execution_count": 40,
148 | "metadata": {
149 | "collapsed": false
150 | },
151 | "outputs": [
152 | {
153 | "data": {
154 | "text/plain": [
155 | "False"
156 | ]
157 | },
158 | "execution_count": 40,
159 | "metadata": {},
160 | "output_type": "execute_result"
161 | }
162 | ],
163 | "source": [
164 | "5==4"
165 | ]
166 | },
167 | {
168 | "cell_type": "code",
169 | "execution_count": 41,
170 | "metadata": {
171 | "collapsed": false
172 | },
173 | "outputs": [
174 | {
175 | "data": {
176 | "text/plain": [
177 | "True"
178 | ]
179 | },
180 | "execution_count": 41,
181 | "metadata": {},
182 | "output_type": "execute_result"
183 | }
184 | ],
185 | "source": [
186 | "4==4"
187 | ]
188 | },
189 | {
190 | "cell_type": "markdown",
191 | "metadata": {},
192 | "source": [
193 | "##1.5.2할당문"
194 | ]
195 | },
196 | {
197 | "cell_type": "markdown",
198 | "metadata": {},
199 | "source": [
200 | "어떤 값이 할당되게 될 변수는 할당 서술문의 좌변이라 하고 값이 할당되는 표현식을 우변이라 부른다.\n",
201 | "변수 이름은 문자로 시작되어야 하고 도토와 같은 특정 기호는 사용하지 않아야 한다. 밑줄은 변수 이름에 사용될 수 있다. 변수는 어떤 타입의 값도 바인딩될 수 있다. 변수 mynum 은 다시 문자열고 바인딩할 수 있다. "
202 | ]
203 | },
204 | {
205 | "cell_type": "code",
206 | "execution_count": 42,
207 | "metadata": {
208 | "collapsed": true
209 | },
210 | "outputs": [],
211 | "source": [
212 | "mynum = 4+1"
213 | ]
214 | },
215 | {
216 | "cell_type": "code",
217 | "execution_count": 43,
218 | "metadata": {
219 | "collapsed": true
220 | },
221 | "outputs": [],
222 | "source": [
223 | "mynum ='Brown'"
224 | ]
225 | },
226 | {
227 | "cell_type": "code",
228 | "execution_count": 44,
229 | "metadata": {
230 | "collapsed": false
231 | },
232 | "outputs": [
233 | {
234 | "data": {
235 | "text/plain": [
236 | "u'Brown'"
237 | ]
238 | },
239 | "execution_count": 44,
240 | "metadata": {},
241 | "output_type": "execute_result"
242 | }
243 | ],
244 | "source": [
245 | "mynum "
246 | ]
247 | },
248 | {
249 | "cell_type": "markdown",
250 | "metadata": {},
251 | "source": [
252 | "주의) 할당문에서 변수와 바인딩하는 것은 표현식의 값이지 표현식 자체가 아님을 명심하자. 파이썬은 먼저 우변을 평가하고 그 다음에야 비로소 그 결과값을 좌변에 할당한다. "
253 | ]
254 | },
255 | {
256 | "cell_type": "code",
257 | "execution_count": 34,
258 | "metadata": {
259 | "collapsed": false
260 | },
261 | "outputs": [
262 | {
263 | "data": {
264 | "text/plain": [
265 | "18"
266 | ]
267 | },
268 | "execution_count": 34,
269 | "metadata": {},
270 | "output_type": "execute_result"
271 | }
272 | ],
273 | "source": [
274 | "x = 5+4\n",
275 | "y=2*x\n",
276 | "y"
277 | ]
278 | },
279 | {
280 | "cell_type": "code",
281 | "execution_count": 35,
282 | "metadata": {
283 | "collapsed": false
284 | },
285 | "outputs": [
286 | {
287 | "data": {
288 | "text/plain": [
289 | "18"
290 | ]
291 | },
292 | "execution_count": 35,
293 | "metadata": {},
294 | "output_type": "execute_result"
295 | }
296 | ],
297 | "source": [
298 | "x =12\n",
299 | "y"
300 | ]
301 | },
302 | {
303 | "cell_type": "markdown",
304 | "metadata": {},
305 | "source": [
306 | "##1.5.3 조건 표현식"
307 | ]
308 | },
309 | {
310 | "cell_type": "markdown",
311 | "metadata": {},
312 | "source": [
313 | "(조건식) if (조건) else (표현식)"
314 | ]
315 | },
316 | {
317 | "cell_type": "markdown",
318 | "metadata": {},
319 | "source": [
320 | "##1.5.4 집합\n",
321 | "\n",
322 | "집합은 순서가 없는 켤렉션이며 각 원소는 집합 내에 오직 한 번만 표시된다. 어떤 표현식의 값이 집합이라는 것을 나타내기 위해 중괄로{}를 사용할 수 있다. 파이썬은 중괄로를 사용하여 집합을 출력한다."
323 | ]
324 | },
325 | {
326 | "cell_type": "code",
327 | "execution_count": 48,
328 | "metadata": {
329 | "collapsed": false
330 | },
331 | "outputs": [
332 | {
333 | "data": {
334 | "text/plain": [
335 | "[3, 3, u'a']"
336 | ]
337 | },
338 | "execution_count": 48,
339 | "metadata": {},
340 | "output_type": "execute_result"
341 | }
342 | ],
343 | "source": [
344 | "[1+2, 3, \"a\"]"
345 | ]
346 | },
347 | {
348 | "cell_type": "code",
349 | "execution_count": 49,
350 | "metadata": {
351 | "collapsed": false
352 | },
353 | "outputs": [
354 | {
355 | "data": {
356 | "text/plain": [
357 | "{1, 2, 3}"
358 | ]
359 | },
360 | "execution_count": 49,
361 | "metadata": {},
362 | "output_type": "execute_result"
363 | }
364 | ],
365 | "source": [
366 | "{2,1,3}"
367 | ]
368 | },
369 | {
370 | "cell_type": "markdown",
371 | "metadata": {},
372 | "source": [
373 | "집합 S의 크기(cardinal)는 그 집합 내 원소의 수를 나타내며 수학적 표현을 사용하면 {S}라고 쓴다. 파이썬에서 집합의 크기는 len()프로시저를 사용하여 얻는다. "
374 | ]
375 | },
376 | {
377 | "cell_type": "code",
378 | "execution_count": 51,
379 | "metadata": {
380 | "collapsed": false
381 | },
382 | "outputs": [
383 | {
384 | "data": {
385 | "text/plain": [
386 | "3"
387 | ]
388 | },
389 | "execution_count": 51,
390 | "metadata": {},
391 | "output_type": "execute_result"
392 | }
393 | ],
394 | "source": [
395 | "len({'a','b','c','a','a'})"
396 | ]
397 | },
398 | {
399 | "cell_type": "markdown",
400 | "metadata": {},
401 | "source": [
402 | "###합산하기"
403 | ]
404 | },
405 | {
406 | "cell_type": "markdown",
407 | "metadata": {},
408 | "source": [
409 | "컬렉션 내 원소의 합은 sum()이란 프로시저를 사용하여 구한다. "
410 | ]
411 | },
412 | {
413 | "cell_type": "code",
414 | "execution_count": 52,
415 | "metadata": {
416 | "collapsed": false
417 | },
418 | "outputs": [
419 | {
420 | "data": {
421 | "text/plain": [
422 | "6"
423 | ]
424 | },
425 | "execution_count": 52,
426 | "metadata": {},
427 | "output_type": "execute_result"
428 | }
429 | ],
430 | "source": [
431 | "sum({1,2,3})"
432 | ]
433 | },
434 | {
435 | "cell_type": "markdown",
436 | "metadata": {},
437 | "source": [
438 | "합산의 시작을 영이 아닌 다른 값에서 시작하고자 할 경우 sum()의 두 번째 인수로 그 값을 제공하면 된다."
439 | ]
440 | },
441 | {
442 | "cell_type": "code",
443 | "execution_count": 56,
444 | "metadata": {
445 | "collapsed": false
446 | },
447 | "outputs": [
448 | {
449 | "data": {
450 | "text/plain": [
451 | "16"
452 | ]
453 | },
454 | "execution_count": 56,
455 | "metadata": {},
456 | "output_type": "execute_result"
457 | }
458 | ],
459 | "source": [
460 | "sum({1,2,3}, 10)"
461 | ]
462 | },
463 | {
464 | "cell_type": "markdown",
465 | "metadata": {},
466 | "source": [
467 | "###집합의 멤버십 테스트하기\n",
468 | "\n",
469 | "집합의 원소인지에 대한 테스트는 in 연산자 not in 연산자를 사용하여 할 수 있다. 만일 S가 집합이면 x in S는 x의 값이 S의 원소이면 Thue로 평가되고 그렇지 않으면 False로 평가되는 불리언 표현식이다. 표현식 not in의 값은 이와 반대이다."
470 | ]
471 | },
472 | {
473 | "cell_type": "code",
474 | "execution_count": 57,
475 | "metadata": {
476 | "collapsed": false
477 | },
478 | "outputs": [
479 | {
480 | "data": {
481 | "text/plain": [
482 | "True"
483 | ]
484 | },
485 | "execution_count": 57,
486 | "metadata": {},
487 | "output_type": "execute_result"
488 | }
489 | ],
490 | "source": [
491 | "S={1,2,3}\n",
492 | "2 in S"
493 | ]
494 | },
495 | {
496 | "cell_type": "code",
497 | "execution_count": 58,
498 | "metadata": {
499 | "collapsed": false
500 | },
501 | "outputs": [
502 | {
503 | "data": {
504 | "text/plain": [
505 | "False"
506 | ]
507 | },
508 | "execution_count": 58,
509 | "metadata": {},
510 | "output_type": "execute_result"
511 | }
512 | ],
513 | "source": [
514 | "4 in S"
515 | ]
516 | },
517 | {
518 | "cell_type": "code",
519 | "execution_count": 59,
520 | "metadata": {
521 | "collapsed": false
522 | },
523 | "outputs": [
524 | {
525 | "data": {
526 | "text/plain": [
527 | "True"
528 | ]
529 | },
530 | "execution_count": 59,
531 | "metadata": {},
532 | "output_type": "execute_result"
533 | }
534 | ],
535 | "source": [
536 | "4 not in S"
537 | ]
538 | },
539 | {
540 | "cell_type": "markdown",
541 | "metadata": {},
542 | "source": [
543 | "###합집합(union)과 교집합"
544 | ]
545 | },
546 | {
547 | "cell_type": "code",
548 | "execution_count": 60,
549 | "metadata": {
550 | "collapsed": false
551 | },
552 | "outputs": [
553 | {
554 | "data": {
555 | "text/plain": [
556 | "{1, 2, 3, 4}"
557 | ]
558 | },
559 | "execution_count": 60,
560 | "metadata": {},
561 | "output_type": "execute_result"
562 | }
563 | ],
564 | "source": [
565 | "{1,2,3}|{2,3,4,}"
566 | ]
567 | },
568 | {
569 | "cell_type": "code",
570 | "execution_count": 61,
571 | "metadata": {
572 | "collapsed": false
573 | },
574 | "outputs": [
575 | {
576 | "data": {
577 | "text/plain": [
578 | "{2, 3}"
579 | ]
580 | },
581 | "execution_count": 61,
582 | "metadata": {},
583 | "output_type": "execute_result"
584 | }
585 | ],
586 | "source": [
587 | "{1,2,3}&{2,3,4,}"
588 | ]
589 | },
590 | {
591 | "cell_type": "markdown",
592 | "metadata": {},
593 | "source": [
594 | "###집합을 변경하기"
595 | ]
596 | },
597 | {
598 | "cell_type": "markdown",
599 | "metadata": {},
600 | "source": [
601 | "변경이 가능한 값을 mutable 값이라고 한다. 집합은 변경이 가능하다. 즉 집합의 원소는 add와 remove 메서드를 사용하여 추가하거나 삭제할 수 있다."
602 | ]
603 | },
604 | {
605 | "cell_type": "code",
606 | "execution_count": 2,
607 | "metadata": {
608 | "collapsed": false
609 | },
610 | "outputs": [
611 | {
612 | "data": {
613 | "text/plain": [
614 | "{1, 2, 3, 4}"
615 | ]
616 | },
617 | "execution_count": 2,
618 | "metadata": {},
619 | "output_type": "execute_result"
620 | }
621 | ],
622 | "source": [
623 | "s={1,2,3}\n",
624 | "s.add(4)\n",
625 | "s.remove\n",
626 | "s"
627 | ]
628 | },
629 | {
630 | "cell_type": "markdown",
631 | "metadata": {},
632 | "source": [
633 | "파이썬은 어떤 집합에 또 다른 컬렉션(예를 들어 집합 또는 리스트)의 모든 원소를 추가하기 위해 updata(...)를 제공한다."
634 | ]
635 | },
636 | {
637 | "cell_type": "code",
638 | "execution_count": 3,
639 | "metadata": {
640 | "collapsed": false
641 | },
642 | "outputs": [
643 | {
644 | "data": {
645 | "text/plain": [
646 | "{1, 2, 3, 4, 5, 6}"
647 | ]
648 | },
649 | "execution_count": 3,
650 | "metadata": {},
651 | "output_type": "execute_result"
652 | }
653 | ],
654 | "source": [
655 | "s.update({4,5,6})\n",
656 | "s"
657 | ]
658 | },
659 | {
660 | "cell_type": "markdown",
661 | "metadata": {},
662 | "source": [
663 | "마찬가지로 어떤 집합과 또 다른 컬렉션의 교집합을 취하여 다른 컬렉션에 속하지 않는 모든 원소를 그 집합에서 제거할 수 있다."
664 | ]
665 | },
666 | {
667 | "cell_type": "markdown",
668 | "metadata": {},
669 | "source": [
670 | "
"
671 | ]
672 | },
673 | {
674 | "cell_type": "code",
675 | "execution_count": 4,
676 | "metadata": {
677 | "collapsed": false
678 | },
679 | "outputs": [
680 | {
681 | "data": {
682 | "text/plain": [
683 | "{5, 6}"
684 | ]
685 | },
686 | "execution_count": 4,
687 | "metadata": {},
688 | "output_type": "execute_result"
689 | }
690 | ],
691 | "source": [
692 | "s.intersection_update({5,6,7,8,9})\n",
693 | "s"
694 | ]
695 | },
696 | {
697 | "cell_type": "markdown",
698 | "metadata": {},
699 | "source": [
700 | "두 개의 변수가 동일한 어떤 값에 바인드외어 있다고 가정해 보자. 이때 한 변수를 통해 바인드 되어 있는 값을 변경하면 다른 변수도 벼녕된 겂을 참조하게 된다."
701 | ]
702 | },
703 | {
704 | "cell_type": "code",
705 | "execution_count": 75,
706 | "metadata": {
707 | "collapsed": false
708 | },
709 | "outputs": [
710 | {
711 | "data": {
712 | "text/plain": [
713 | "{6}"
714 | ]
715 | },
716 | "execution_count": 75,
717 | "metadata": {},
718 | "output_type": "execute_result"
719 | }
720 | ],
721 | "source": [
722 | "t=s\n",
723 | "t.remove(5)\n",
724 | "s"
725 | ]
726 | },
727 | {
728 | "cell_type": "markdown",
729 | "metadata": {},
730 | "source": [
731 | "###집합 컴프리핸션\n",
732 | "\n",
733 | "파이썬은 컴프리핸션이라는 표현식을 제공하는데 이것은 다른 컬렉션을 사용하여 새로운 결렉션을 만드는 데 사용된다. 컴프리헨션은 값이 컬렉션인 표현식을 구성하는 데 유용하고 전통적인 수학적 표기법과 유사하여 많이 사용하게 될 것이다."
734 | ]
735 | },
736 | {
737 | "cell_type": "code",
738 | "execution_count": 77,
739 | "metadata": {
740 | "collapsed": false
741 | },
742 | "outputs": [
743 | {
744 | "data": {
745 | "text/plain": [
746 | "{2, 4, 6}"
747 | ]
748 | },
749 | "execution_count": 77,
750 | "metadata": {},
751 | "output_type": "execute_result"
752 | }
753 | ],
754 | "source": [
755 | "{2*x for x in {1,2,3}}"
756 | ]
757 | },
758 | {
759 | "cell_type": "raw",
760 | "metadata": {
761 | "collapsed": true
762 | },
763 | "source": [
764 | " 추가문제) 출처(https://datasciencelab.wordpress.com/2014/01/08/list-comprehension-in-python/)"
765 | ]
766 | },
767 | {
768 | "cell_type": "markdown",
769 | "metadata": {},
770 | "source": [
771 | "
"
772 | ]
773 | },
774 | {
775 | "cell_type": "markdown",
776 | "metadata": {},
777 | "source": [
778 | "List Comprehension in Python"
779 | ]
780 | },
781 | {
782 | "cell_type": "markdown",
783 | "metadata": {},
784 | "source": [
785 | "SQUARE ALL NON-NEGATIVE NUMBERS SMALLER THAN 10"
786 | ]
787 | },
788 | {
789 | "cell_type": "code",
790 | "execution_count": 13,
791 | "metadata": {
792 | "collapsed": false
793 | },
794 | "outputs": [
795 | {
796 | "data": {
797 | "text/plain": [
798 | "[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]"
799 | ]
800 | },
801 | "execution_count": 13,
802 | "metadata": {},
803 | "output_type": "execute_result"
804 | }
805 | ],
806 | "source": [
807 | "[x**2 for x in range(10)]"
808 | ]
809 | },
810 | {
811 | "cell_type": "markdown",
812 | "metadata": {},
813 | "source": [
814 | "NON-NEGATIVE MULTIPLES OF 5 SMALLER THAN 100"
815 | ]
816 | },
817 | {
818 | "cell_type": "code",
819 | "execution_count": 14,
820 | "metadata": {
821 | "collapsed": false
822 | },
823 | "outputs": [
824 | {
825 | "data": {
826 | "text/plain": [
827 | "[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]"
828 | ]
829 | },
830 | "execution_count": 14,
831 | "metadata": {},
832 | "output_type": "execute_result"
833 | }
834 | ],
835 | "source": [
836 | "[x for x in range(100) if x%5 == 0]"
837 | ]
838 | },
839 | {
840 | "cell_type": "markdown",
841 | "metadata": {},
842 | "source": [
843 | "ALL CONSONANTS IN A GIVEN SENTENCE (WITHOUT REPETITION)"
844 | ]
845 | },
846 | {
847 | "cell_type": "code",
848 | "execution_count": 15,
849 | "metadata": {
850 | "collapsed": false
851 | },
852 | "outputs": [
853 | {
854 | "data": {
855 | "text/plain": [
856 | "[3, 9, 15, 21, 27, 33, 39, 45]"
857 | ]
858 | },
859 | "execution_count": 15,
860 | "metadata": {},
861 | "output_type": "execute_result"
862 | }
863 | ],
864 | "source": [
865 | "[x for x in range(50) if x%3 == 0 and x%6 != 0]"
866 | ]
867 | },
868 | {
869 | "cell_type": "markdown",
870 | "metadata": {},
871 | "source": [
872 | "FIRST CHARACTER OF EVERY WORD IN A SENTENCE"
873 | ]
874 | },
875 | {
876 | "cell_type": "code",
877 | "execution_count": 20,
878 | "metadata": {
879 | "collapsed": false
880 | },
881 | "outputs": [
882 | {
883 | "data": {
884 | "text/plain": [
885 | "{'c', 'd', 'g', 'h', 'l', 'm', 'n', 'p', 's', 't', 'y'}"
886 | ]
887 | },
888 | "execution_count": 20,
889 | "metadata": {},
890 | "output_type": "execute_result"
891 | }
892 | ],
893 | "source": [
894 | "import string\n",
895 | "punct = string.punctuation + ' '\n",
896 | "vowels = \"aeiou\"\n",
897 | "phrase = \"On second thought, let's not go to Camelot. It is a silly place.\"\n",
898 | "set([c for c in phrase.lower() if c not in vowels and c not in punct])"
899 | ]
900 | },
901 | {
902 | "cell_type": "markdown",
903 | "metadata": {},
904 | "source": [
905 | "SUBSTITUTE ALL VOWELS IN A SENTENCE BY THE CHARACTER ‘0’"
906 | ]
907 | },
908 | {
909 | "cell_type": "code",
910 | "execution_count": 21,
911 | "metadata": {
912 | "collapsed": false
913 | },
914 | "outputs": [
915 | {
916 | "data": {
917 | "text/plain": [
918 | "['O', 's', 't', 'l', 'n', 'g', 't', 'C', 'I', 'i', 'a', 's', 'p']"
919 | ]
920 | },
921 | "execution_count": 21,
922 | "metadata": {},
923 | "output_type": "execute_result"
924 | }
925 | ],
926 | "source": [
927 | "[w[0] for w in phrase.split()]"
928 | ]
929 | },
930 | {
931 | "cell_type": "code",
932 | "execution_count": 22,
933 | "metadata": {
934 | "collapsed": false
935 | },
936 | "outputs": [
937 | {
938 | "data": {
939 | "text/plain": [
940 | "\"On s0c0nd th00ght, l0t's n0t g0 t0 C0m0l0t. It 0s 0 s0lly pl0c0.\""
941 | ]
942 | },
943 | "execution_count": 22,
944 | "metadata": {},
945 | "output_type": "execute_result"
946 | }
947 | ],
948 | "source": [
949 | "\"\".join([c if c not in vowels else '0' for c in phrase])"
950 | ]
951 | },
952 | {
953 | "cell_type": "markdown",
954 | "metadata": {},
955 | "source": [
956 | "PAIRS OF ELEMENTS DRAWN FROM DIFFERENT LISTS"
957 | ]
958 | },
959 | {
960 | "cell_type": "code",
961 | "execution_count": 19,
962 | "metadata": {
963 | "collapsed": false
964 | },
965 | "outputs": [
966 | {
967 | "data": {
968 | "text/plain": [
969 | "[('Lancelot', 'Camelot'),\n",
970 | " ('Lancelot', 'Assyria'),\n",
971 | " ('Robin', 'Camelot'),\n",
972 | " ('Robin', 'Assyria'),\n",
973 | " ('Galahad', 'Camelot'),\n",
974 | " ('Galahad', 'Assyria')]"
975 | ]
976 | },
977 | "execution_count": 19,
978 | "metadata": {},
979 | "output_type": "execute_result"
980 | }
981 | ],
982 | "source": [
983 | "words1 = ['Lancelot', 'Robin', 'Galahad']\n",
984 | "words2 = ['Camelot', 'Assyria']\n",
985 | "[(w1,w2) for w1 in words1 for w2 in words2]"
986 | ]
987 | },
988 | {
989 | "cell_type": "code",
990 | "execution_count": null,
991 | "metadata": {
992 | "collapsed": true
993 | },
994 | "outputs": [],
995 | "source": []
996 | },
997 | {
998 | "cell_type": "code",
999 | "execution_count": null,
1000 | "metadata": {
1001 | "collapsed": true
1002 | },
1003 | "outputs": [],
1004 | "source": []
1005 | },
1006 | {
1007 | "cell_type": "code",
1008 | "execution_count": null,
1009 | "metadata": {
1010 | "collapsed": true
1011 | },
1012 | "outputs": [],
1013 | "source": []
1014 | },
1015 | {
1016 | "cell_type": "code",
1017 | "execution_count": null,
1018 | "metadata": {
1019 | "collapsed": true
1020 | },
1021 | "outputs": [],
1022 | "source": []
1023 | },
1024 | {
1025 | "cell_type": "code",
1026 | "execution_count": null,
1027 | "metadata": {
1028 | "collapsed": true
1029 | },
1030 | "outputs": [],
1031 | "source": []
1032 | },
1033 | {
1034 | "cell_type": "code",
1035 | "execution_count": null,
1036 | "metadata": {
1037 | "collapsed": true
1038 | },
1039 | "outputs": [],
1040 | "source": []
1041 | },
1042 | {
1043 | "cell_type": "code",
1044 | "execution_count": null,
1045 | "metadata": {
1046 | "collapsed": true
1047 | },
1048 | "outputs": [],
1049 | "source": []
1050 | },
1051 | {
1052 | "cell_type": "code",
1053 | "execution_count": null,
1054 | "metadata": {
1055 | "collapsed": true
1056 | },
1057 | "outputs": [],
1058 | "source": []
1059 | },
1060 | {
1061 | "cell_type": "code",
1062 | "execution_count": null,
1063 | "metadata": {
1064 | "collapsed": true
1065 | },
1066 | "outputs": [],
1067 | "source": []
1068 | },
1069 | {
1070 | "cell_type": "code",
1071 | "execution_count": null,
1072 | "metadata": {
1073 | "collapsed": true
1074 | },
1075 | "outputs": [],
1076 | "source": []
1077 | },
1078 | {
1079 | "cell_type": "code",
1080 | "execution_count": null,
1081 | "metadata": {
1082 | "collapsed": true
1083 | },
1084 | "outputs": [],
1085 | "source": []
1086 | },
1087 | {
1088 | "cell_type": "code",
1089 | "execution_count": null,
1090 | "metadata": {
1091 | "collapsed": true
1092 | },
1093 | "outputs": [],
1094 | "source": []
1095 | },
1096 | {
1097 | "cell_type": "code",
1098 | "execution_count": null,
1099 | "metadata": {
1100 | "collapsed": true
1101 | },
1102 | "outputs": [],
1103 | "source": []
1104 | },
1105 | {
1106 | "cell_type": "code",
1107 | "execution_count": null,
1108 | "metadata": {
1109 | "collapsed": true
1110 | },
1111 | "outputs": [],
1112 | "source": []
1113 | },
1114 | {
1115 | "cell_type": "code",
1116 | "execution_count": null,
1117 | "metadata": {
1118 | "collapsed": true
1119 | },
1120 | "outputs": [],
1121 | "source": []
1122 | },
1123 | {
1124 | "cell_type": "code",
1125 | "execution_count": null,
1126 | "metadata": {
1127 | "collapsed": true
1128 | },
1129 | "outputs": [],
1130 | "source": []
1131 | },
1132 | {
1133 | "cell_type": "code",
1134 | "execution_count": null,
1135 | "metadata": {
1136 | "collapsed": true
1137 | },
1138 | "outputs": [],
1139 | "source": []
1140 | },
1141 | {
1142 | "cell_type": "code",
1143 | "execution_count": null,
1144 | "metadata": {
1145 | "collapsed": true
1146 | },
1147 | "outputs": [],
1148 | "source": []
1149 | },
1150 | {
1151 | "cell_type": "code",
1152 | "execution_count": null,
1153 | "metadata": {
1154 | "collapsed": true
1155 | },
1156 | "outputs": [],
1157 | "source": []
1158 | }
1159 | ],
1160 | "metadata": {
1161 | "kernelspec": {
1162 | "display_name": "Python 2",
1163 | "language": "python",
1164 | "name": "python2"
1165 | },
1166 | "language_info": {
1167 | "codemirror_mode": {
1168 | "name": "ipython",
1169 | "version": 2
1170 | },
1171 | "file_extension": ".py",
1172 | "mimetype": "text/x-python",
1173 | "name": "python",
1174 | "nbconvert_exporter": "python",
1175 | "pygments_lexer": "ipython2",
1176 | "version": "2.7.6"
1177 | }
1178 | },
1179 | "nbformat": 4,
1180 | "nbformat_minor": 0
1181 | }
1182 |
--------------------------------------------------------------------------------
/시즌1 발표자료 저장공간/2회차 ch2/CodingTheMatrix-2.7-Problems-realtime.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# 파이썬의 컴프리헨션 문제"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "Problem 2.7.1: my_filter(L, num)\n",
15 | "- input: 숫자들의 리스트와 하나의 숫자\n",
16 | "- out: num의 배수를 포함하지 않는 숫자들의 리스트\n",
17 | "- example: 주어진 L=[1,2,4,5,7]과 num=2에 대해 [1,5,7]을 리턴한다."
18 | ]
19 | },
20 | {
21 | "cell_type": "code",
22 | "execution_count": 87,
23 | "metadata": {
24 | "collapsed": false
25 | },
26 | "outputs": [],
27 | "source": [
28 | "def my_filter(L, num):\n",
29 | " "
30 | ]
31 | },
32 | {
33 | "cell_type": "code",
34 | "execution_count": 86,
35 | "metadata": {
36 | "collapsed": false
37 | },
38 | "outputs": [
39 | {
40 | "name": "stdout",
41 | "output_type": "stream",
42 | "text": [
43 | "[1, 5, 7]\n"
44 | ]
45 | }
46 | ],
47 | "source": [
48 | "print(my_filter([1,2,5,7], 2))"
49 | ]
50 | },
51 | {
52 | "cell_type": "markdown",
53 | "metadata": {},
54 | "source": [
55 | "Problem 2.7.2: my_lists(L)\n",
56 | "- input: 음이 아닌 정수들의 리스트 L\n",
57 | "- output: 리스트들로 구성된 리스트. L 내에 모든 원소 x에 대해 1,2, ... ,x를 포함하는 리스트 생성\n",
58 | "- example: 주어진 [1,2,3]에 대해, [[1],[1,2],[1,2,3]]을 리턴한다.\n",
59 | "- example: 주어진 [0]에 대해, [[]]을 리턴한다."
60 | ]
61 | },
62 | {
63 | "cell_type": "code",
64 | "execution_count": 32,
65 | "metadata": {
66 | "collapsed": true
67 | },
68 | "outputs": [],
69 | "source": [
70 | "def my_lists(L):\n",
71 | " "
72 | ]
73 | },
74 | {
75 | "cell_type": "code",
76 | "execution_count": 33,
77 | "metadata": {
78 | "collapsed": false
79 | },
80 | "outputs": [
81 | {
82 | "name": "stdout",
83 | "output_type": "stream",
84 | "text": [
85 | "[[1], [1, 2], [1, 2, 3]]\n"
86 | ]
87 | }
88 | ],
89 | "source": [
90 | "print(my_lists([1,2,3]))"
91 | ]
92 | },
93 | {
94 | "cell_type": "code",
95 | "execution_count": 34,
96 | "metadata": {
97 | "collapsed": false
98 | },
99 | "outputs": [
100 | {
101 | "name": "stdout",
102 | "output_type": "stream",
103 | "text": [
104 | "[[]]\n"
105 | ]
106 | }
107 | ],
108 | "source": [
109 | "print(my_lists([0]))"
110 | ]
111 | },
112 | {
113 | "cell_type": "markdown",
114 | "metadata": {},
115 | "source": [
116 | "Problem 2.7.3: my_function_composition(f, g)\n",
117 | "- input: 두개의 함수 f와 g. 함수들은 딕셔너리로 표현되고 g.f존재\n",
118 | "- output: 함수 g.f를 나타내는 딕셔너리\n",
119 | "- example: 주어진 f={0:'a', 1:'b'}, g={'a':'apple', 'b':'banana'}에 대해, {0:'apple', 1:'banana'}을 리턴한다."
120 | ]
121 | },
122 | {
123 | "cell_type": "code",
124 | "execution_count": 68,
125 | "metadata": {
126 | "collapsed": false
127 | },
128 | "outputs": [],
129 | "source": [
130 | "def f():\n",
131 | " return {0:'a', 1:'b'}\n",
132 | "\n",
133 | "def g():\n",
134 | " return {'a':'apple', 'b':'banana'}"
135 | ]
136 | },
137 | {
138 | "cell_type": "code",
139 | "execution_count": 88,
140 | "metadata": {
141 | "collapsed": true
142 | },
143 | "outputs": [],
144 | "source": [
145 | "def my_function_composition(f, g):\n",
146 | " "
147 | ]
148 | },
149 | {
150 | "cell_type": "code",
151 | "execution_count": 89,
152 | "metadata": {
153 | "collapsed": false
154 | },
155 | "outputs": [
156 | {
157 | "name": "stdout",
158 | "output_type": "stream",
159 | "text": [
160 | "{0: 'apple', 1: 'banana'}\n"
161 | ]
162 | }
163 | ],
164 | "source": [
165 | "result = my_function_composition(f, g)\n",
166 | "print(result)"
167 | ]
168 | },
169 | {
170 | "cell_type": "markdown",
171 | "metadata": {},
172 | "source": [
173 | "# 파이썬의 루프 문제"
174 | ]
175 | },
176 | {
177 | "cell_type": "raw",
178 | "metadata": {},
179 | "source": [
180 | "def (L):\n",
181 | " current = ...\n",
182 | " for x in L:\n",
183 | " current = ...\n",
184 | " return current"
185 | ]
186 | },
187 | {
188 | "cell_type": "markdown",
189 | "metadata": {},
190 | "source": [
191 | "Problem 2.7.4: mySum(L)\n",
192 | "- input: 숫자들의 리스트\n",
193 | "- output: 리스트 내에 숫자들의 합"
194 | ]
195 | },
196 | {
197 | "cell_type": "code",
198 | "execution_count": 43,
199 | "metadata": {
200 | "collapsed": true
201 | },
202 | "outputs": [],
203 | "source": [
204 | "def mySum(L):\n",
205 | " "
206 | ]
207 | },
208 | {
209 | "cell_type": "code",
210 | "execution_count": 44,
211 | "metadata": {
212 | "collapsed": false
213 | },
214 | "outputs": [
215 | {
216 | "name": "stdout",
217 | "output_type": "stream",
218 | "text": [
219 | "6\n"
220 | ]
221 | }
222 | ],
223 | "source": [
224 | "print(mySum([1,2,3]))"
225 | ]
226 | },
227 | {
228 | "cell_type": "markdown",
229 | "metadata": {},
230 | "source": [
231 | "Problem 2.7.5: myProduct(L)\n",
232 | "- input: 숫자들의 리스트\n",
233 | "- output: 리스트 내에 숫자들의 곱"
234 | ]
235 | },
236 | {
237 | "cell_type": "code",
238 | "execution_count": 47,
239 | "metadata": {
240 | "collapsed": true
241 | },
242 | "outputs": [],
243 | "source": [
244 | "def myProduct(L):\n",
245 | " "
246 | ]
247 | },
248 | {
249 | "cell_type": "code",
250 | "execution_count": 48,
251 | "metadata": {
252 | "collapsed": false
253 | },
254 | "outputs": [
255 | {
256 | "name": "stdout",
257 | "output_type": "stream",
258 | "text": [
259 | "6\n"
260 | ]
261 | }
262 | ],
263 | "source": [
264 | "print(myProduct([1,2,3]))"
265 | ]
266 | },
267 | {
268 | "cell_type": "markdown",
269 | "metadata": {},
270 | "source": [
271 | "Problem 2.7.6: myMin(L)\n",
272 | "- input: 숫자들의 리스트\n",
273 | "- output: 리스트 내에 최소 숫자"
274 | ]
275 | },
276 | {
277 | "cell_type": "code",
278 | "execution_count": 80,
279 | "metadata": {
280 | "collapsed": true
281 | },
282 | "outputs": [],
283 | "source": [
284 | "import sys\n",
285 | "\n",
286 | "def myMin(L):\n",
287 | " "
288 | ]
289 | },
290 | {
291 | "cell_type": "code",
292 | "execution_count": 81,
293 | "metadata": {
294 | "collapsed": false
295 | },
296 | "outputs": [
297 | {
298 | "name": "stdout",
299 | "output_type": "stream",
300 | "text": [
301 | "1\n"
302 | ]
303 | }
304 | ],
305 | "source": [
306 | "print(myMin([1,2,3,4]))"
307 | ]
308 | },
309 | {
310 | "cell_type": "markdown",
311 | "metadata": {},
312 | "source": [
313 | "Problem 2.7.7: myConcat(L)\n",
314 | "- input: 문자열들의 리스트\n",
315 | "- output: L 내에 모든 문자열의 결함"
316 | ]
317 | },
318 | {
319 | "cell_type": "code",
320 | "execution_count": 61,
321 | "metadata": {
322 | "collapsed": true
323 | },
324 | "outputs": [],
325 | "source": [
326 | "def myConcat(L):\n",
327 | " "
328 | ]
329 | },
330 | {
331 | "cell_type": "code",
332 | "execution_count": 62,
333 | "metadata": {
334 | "collapsed": false
335 | },
336 | "outputs": [
337 | {
338 | "name": "stdout",
339 | "output_type": "stream",
340 | "text": [
341 | "abclmnxyz\n"
342 | ]
343 | }
344 | ],
345 | "source": [
346 | "print(myConcat([\"abc\",\"lmn\",\"xyz\"]))"
347 | ]
348 | },
349 | {
350 | "cell_type": "markdown",
351 | "metadata": {},
352 | "source": [
353 | "Problem 2.7.8: myUnion(L)\n",
354 | "- input: 집합들의 리스트\n",
355 | "- output: L 내에 모든 집합의 합집합"
356 | ]
357 | },
358 | {
359 | "cell_type": "code",
360 | "execution_count": 74,
361 | "metadata": {
362 | "collapsed": true
363 | },
364 | "outputs": [],
365 | "source": [
366 | "def myUnion(L):\n",
367 | " "
368 | ]
369 | },
370 | {
371 | "cell_type": "code",
372 | "execution_count": 75,
373 | "metadata": {
374 | "collapsed": false
375 | },
376 | "outputs": [
377 | {
378 | "name": "stdout",
379 | "output_type": "stream",
380 | "text": [
381 | "{1, 2, 22, 105, 106, 11}\n"
382 | ]
383 | }
384 | ],
385 | "source": [
386 | "print(myUnion([{1,2},{11,22},{105,106}]))"
387 | ]
388 | },
389 | {
390 | "cell_type": "markdown",
391 | "metadata": {},
392 | "source": [
393 | "Problem 2.7.9: 위에서 언ㄴ급한 내용을 참고하여 다음 각각에 대한 답을 찾아보자\n",
394 | "1. 빈 집합에 있는 숫자들의 합\n",
395 | "2. 빈 집합에 있는 숫자들의 곱\n",
396 | "3. 빈 집합에 있는 숫자들 중 최소값\n",
397 | "4. 문자열들을 원소로 가지는 리스트가 빈 리스트인 경우의 결합\n",
398 | "5. 집합들을 원소로 가지는 리스트가 빈 리스트인 경우의 합결합"
399 | ]
400 | },
401 | {
402 | "cell_type": "code",
403 | "execution_count": 83,
404 | "metadata": {
405 | "collapsed": false
406 | },
407 | "outputs": [
408 | {
409 | "name": "stdout",
410 | "output_type": "stream",
411 | "text": [
412 | "0\n",
413 | "1\n",
414 | "9223372036854775807\n",
415 | "\n",
416 | "set()\n"
417 | ]
418 | }
419 | ],
420 | "source": [
421 | "print(mySum([]))\n",
422 | "print(myProduct([]))\n",
423 | "print(myMin([]))\n",
424 | "print(myConcat([]))\n",
425 | "print(myUnion([]))"
426 | ]
427 | },
428 | {
429 | "cell_type": "markdown",
430 | "metadata": {},
431 | "source": [
432 | "# 복소수 덧셈 연습"
433 | ]
434 | },
435 | {
436 | "cell_type": "markdown",
437 | "metadata": {},
438 | "source": [
439 | "Problem 2.7.10: 다음 문제들의 각각은 두 개의 복소수의 합을 구하는 것이다. 각각에 대해 해를 구하고 그림 2.1과 같이 그림으로 나타내어 보자. 그리는 화살표는 더해지는 벡터에(대략적으로) 대응되어야 한다.\n",
440 | "\n",
441 | "1. (3+1i)+(2+2i)\n",
442 | "2. (-1+2i)+(1-1i)\n",
443 | "3. (2+0i)+(-3+.00i) \n",
444 | "4. 4(0+2i)+(.001+1i)"
445 | ]
446 | },
447 | {
448 | "cell_type": "markdown",
449 | "metadata": {},
450 | "source": [
451 | "1. 5+3i\n",
452 | "2. 0+1i\n",
453 | "3. -1+.00i\n",
454 | "4. .001+1i"
455 | ]
456 | },
457 | {
458 | "cell_type": "markdown",
459 | "metadata": {},
460 | "source": [
461 | "# 지수의 곱"
462 | ]
463 | },
464 | {
465 | "cell_type": "markdown",
466 | "metadata": {},
467 | "source": [
468 | "Problem 2.7.11: 지수의 첫 번째 법칙을 사용하여 (섹션 2.4.9) 두 지수의 곱을 하나의 지수로 표현해 보자. 예를 들어, exp(π/4i)exp(π/4i) = exp(π/2i)이다\n",
469 | "\n",
470 | "1. exp(1i)exp(2i)\n",
471 | "2. exp(π/4i)exp(2π/3i)\n",
472 | "3. exp(-π/4i)exp(2π/3i)"
473 | ]
474 | },
475 | {
476 | "cell_type": "markdown",
477 | "metadata": {},
478 | "source": [
479 | "1. exp(3i)\n",
480 | "2. exp(11/12i)\n",
481 | "3. exp(5/12i)"
482 | ]
483 | },
484 | {
485 | "cell_type": "markdown",
486 | "metadata": {},
487 | "source": [
488 | "# 복소수에 대한 연산 결합"
489 | ]
490 | },
491 | {
492 | "cell_type": "markdown",
493 | "metadata": {},
494 | "source": [
495 | "Problem 2.7.12: 다음 스펙을 가지고 프로시저, transform(a,b,L)을 작성해 보자\n",
496 | "\n",
497 | "- input: 복소수 a와 b, 복소수들의 리스트 L\n",
498 | "- output: f(z) = az + b를 L내의 각 복소수에 적용하여 얻은 복소수들의 리스트\n",
499 | "\n",
500 | "다음의 각 문제에 명시된 변환을 이루기 위해, a와 b 값으로 어떤 값을 선택해야 하는지 설명해 보자. 만일 명시된 변환을 이룰 방법이 없으면, 그 이유를 설명해 보자.\n",
501 | "\n",
502 | "1. z를 위로 1유닛, 오른쪽으로 1유닛 평행이동하고, 다음에 시계 방향으로 45도 회전한 후, 아래로 2만큼 스케일링해 보자\n",
503 | "2. 실수부를 2만큼, 허수부를 3만큼 스케일링하고 반시계 방향으로 45도 회전한 후, 아래에 2유닛, 왼쪽으로 3유닛 평행 이동해 보자"
504 | ]
505 | },
506 | {
507 | "cell_type": "code",
508 | "execution_count": 30,
509 | "metadata": {
510 | "collapsed": true
511 | },
512 | "outputs": [],
513 | "source": [
514 | "def transform(a,b,L):\n",
515 | " "
516 | ]
517 | },
518 | {
519 | "cell_type": "code",
520 | "execution_count": 32,
521 | "metadata": {
522 | "collapsed": false
523 | },
524 | "outputs": [
525 | {
526 | "name": "stdout",
527 | "output_type": "stream",
528 | "text": [
529 | "[(3+6j), (5+7j)]\n"
530 | ]
531 | }
532 | ],
533 | "source": [
534 | "print(transform((2+1j),(2+3j),[(1+1j),(2+1j)]))"
535 | ]
536 | },
537 | {
538 | "cell_type": "markdown",
539 | "metadata": {},
540 | "source": [
541 | "1. 풀어 봅시다."
542 | ]
543 | },
544 | {
545 | "cell_type": "code",
546 | "execution_count": 2,
547 | "metadata": {
548 | "collapsed": false
549 | },
550 | "outputs": [],
551 | "source": [
552 | "import math"
553 | ]
554 | },
555 | {
556 | "cell_type": "code",
557 | "execution_count": 3,
558 | "metadata": {
559 | "collapsed": false
560 | },
561 | "outputs": [
562 | {
563 | "ename": "NameError",
564 | "evalue": "name 'transform' is not defined",
565 | "output_type": "error",
566 | "traceback": [
567 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
568 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
569 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmath\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m2\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mmath\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m2j\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mb\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m1\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;36m1j\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mtransformed\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtransform\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mb\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m+\u001b[0m\u001b[1;36m4j\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtransformed\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
570 | "\u001b[1;31mNameError\u001b[0m: name 'transform' is not defined"
571 | ]
572 | }
573 | ],
574 | "source": [
575 | "a = math.sqrt(2)/2 + math.sqrt(2)/2j\n",
576 | "b = 1 + 1j\n",
577 | "transformed = transform(a,b,[(5+4j)])\n",
578 | "print(transformed)"
579 | ]
580 | },
581 | {
582 | "cell_type": "markdown",
583 | "metadata": {},
584 | "source": [
585 | "2. 풀어 봅시다."
586 | ]
587 | },
588 | {
589 | "cell_type": "markdown",
590 | "metadata": {},
591 | "source": [
592 | "실수부를 2만큼, 허수부를 3만큼 스케일링하고 반시계 방향으로 45도 회전한 후, 아래에 2유닛, 왼쪽으로 3유닛 평행 이동해 보자"
593 | ]
594 | },
595 | {
596 | "cell_type": "code",
597 | "execution_count": 4,
598 | "metadata": {
599 | "collapsed": false
600 | },
601 | "outputs": [
602 | {
603 | "ename": "NameError",
604 | "evalue": "name 'transform' is not defined",
605 | "output_type": "error",
606 | "traceback": [
607 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
608 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
609 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0ma\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m3\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m2j\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0mb\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m2\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mmath\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m2\u001b[0m \u001b[1;33m-\u001b[0m \u001b[1;36m3\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mmath\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msqrt\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m/\u001b[0m\u001b[1;36m2j\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[0mtransformed\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtransform\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0ma\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mb\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m+\u001b[0m\u001b[1;36m4j\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[0mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtransformed\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
610 | "\u001b[1;31mNameError\u001b[0m: name 'transform' is not defined"
611 | ]
612 | }
613 | ],
614 | "source": [
615 | "a = 3-2j\n",
616 | "b = 2*math.sqrt(2)/2 - 3*math.sqrt(2)/2j\n",
617 | "transformed = transform(a,b,[(5+4j)])\n",
618 | "print(transformed)"
619 | ]
620 | },
621 | {
622 | "cell_type": "markdown",
623 | "metadata": {},
624 | "source": [
625 | "# GF(2) 연산"
626 | ]
627 | },
628 | {
629 | "cell_type": "markdown",
630 | "metadata": {},
631 | "source": [
632 | "Problem 2.7.13: 다음의 각 문제에 대해 GF(2)연산의 결과를 계산해 보자\n",
633 | "\n",
634 | "1. 1 + 1 + 1 + 0\n",
635 | "2. 1 * 1 + 1 * 1 + 0 * 0 + 1 * 1\n",
636 | "3. (1 + 1 + 1) * (1 + 1 + 1 + 1)"
637 | ]
638 | },
639 | {
640 | "cell_type": "markdown",
641 | "metadata": {},
642 | "source": [
643 | "1. 1\n",
644 | "2. 1\n",
645 | "3. 0"
646 | ]
647 | },
648 | {
649 | "cell_type": "markdown",
650 | "metadata": {},
651 | "source": [
652 | "# 네트워크 코딩"
653 | ]
654 | },
655 | {
656 | "cell_type": "markdown",
657 | "metadata": {},
658 | "source": [
659 | "Problem 2.7.14: 섹션 2.5.2에서 사용된 네트워크 예를 생각해 보자. 주어진 순간에 전송되어야 할 비트는 b1=1, b2=1이다. 네트워크의 각 링크를 그 링크를 통해 전송되어야 비트를 가지고 표시해 보자. 이 때, 비트는 네트워크 코딩 기법에 따라 전송된다. 사용자 노드 c와 d는 어떻게 b1과 b2를 수신할 수 있는지 설명해 보자."
660 | ]
661 | },
662 | {
663 | "cell_type": "markdown",
664 | "metadata": {},
665 | "source": [
666 | "\n"
667 | ]
668 | }
669 | ],
670 | "metadata": {
671 | "kernelspec": {
672 | "display_name": "Python 3",
673 | "language": "python",
674 | "name": "python3"
675 | },
676 | "language_info": {
677 | "codemirror_mode": {
678 | "name": "ipython",
679 | "version": 3
680 | },
681 | "file_extension": ".py",
682 | "mimetype": "text/x-python",
683 | "name": "python",
684 | "nbconvert_exporter": "python",
685 | "pygments_lexer": "ipython3",
686 | "version": "3.4.0"
687 | }
688 | },
689 | "nbformat": 4,
690 | "nbformat_minor": 0
691 | }
692 |
--------------------------------------------------------------------------------
/시즌1 발표자료 저장공간/2회차 ch2/CodingTheMatrix-2.7-Problems.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# 파이썬의 컴프리헨션 문제"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "Problem 2.7.1: my_filter(L, num)\n",
15 | "- input: 숫자들의 리스트와 하나의 숫자\n",
16 | "- out: num의 배수를 포함하지 않는 숫자들의 리스트\n",
17 | "- example: 주어진 L=[1,2,4,5,7]과 num=2에 대해 [1,5,7]을 리턴한다."
18 | ]
19 | },
20 | {
21 | "cell_type": "code",
22 | "execution_count": 10,
23 | "metadata": {
24 | "collapsed": false
25 | },
26 | "outputs": [],
27 | "source": [
28 | "def my_filter(L, num):\n",
29 | " filtered = [x for x in L if x % 2 != 0]\n",
30 | " return filtered"
31 | ]
32 | },
33 | {
34 | "cell_type": "code",
35 | "execution_count": 11,
36 | "metadata": {
37 | "collapsed": false
38 | },
39 | "outputs": [
40 | {
41 | "name": "stdout",
42 | "output_type": "stream",
43 | "text": [
44 | "[1, 5, 7]\n"
45 | ]
46 | }
47 | ],
48 | "source": [
49 | "print(my_filter([1,2,5,7], 2))"
50 | ]
51 | },
52 | {
53 | "cell_type": "markdown",
54 | "metadata": {},
55 | "source": [
56 | "Problem 2.7.2: my_lists(L)\n",
57 | "- input: 음이 아닌 정수들의 리스트 L\n",
58 | "- output: 리스트들로 구성된 리스트. L 내에 모든 원소 x에 대해 1,2, ... ,x를 포함하는 리스트 생성\n",
59 | "- example: 주어진 [1,2,3]에 대해, [[1],[1,2],[1,2,3]]을 리턴한다.\n",
60 | "- example: 주어진 [0]에 대해, [[]]을 리턴한다."
61 | ]
62 | },
63 | {
64 | "cell_type": "code",
65 | "execution_count": 12,
66 | "metadata": {
67 | "collapsed": true
68 | },
69 | "outputs": [],
70 | "source": [
71 | "def my_lists(L):\n",
72 | " length = len(L)\n",
73 | " L1 = [ elem for elem in L if elem > 0]\n",
74 | "\n",
75 | " result = [L1[:idx+1] for idx in range(length)]\n",
76 | " return result"
77 | ]
78 | },
79 | {
80 | "cell_type": "code",
81 | "execution_count": 13,
82 | "metadata": {
83 | "collapsed": false
84 | },
85 | "outputs": [
86 | {
87 | "name": "stdout",
88 | "output_type": "stream",
89 | "text": [
90 | "[[1], [1, 2], [1, 2, 3]]\n"
91 | ]
92 | }
93 | ],
94 | "source": [
95 | "print(my_lists([1,2,3]))"
96 | ]
97 | },
98 | {
99 | "cell_type": "code",
100 | "execution_count": 14,
101 | "metadata": {
102 | "collapsed": false
103 | },
104 | "outputs": [
105 | {
106 | "name": "stdout",
107 | "output_type": "stream",
108 | "text": [
109 | "[[]]\n"
110 | ]
111 | }
112 | ],
113 | "source": [
114 | "print(my_lists([0]))"
115 | ]
116 | },
117 | {
118 | "cell_type": "markdown",
119 | "metadata": {},
120 | "source": [
121 | "Problem 2.7.3: my_function_composition(f, g)\n",
122 | "- input: 두개의 함수 f와 g. 함수들은 딕셔너리로 표현되고 g.f존재\n",
123 | "- output: 함수 g.f를 나타내는 딕셔너리\n",
124 | "- example: 주어진 f={0:'a', 1:'b'}, g={'a':'apple', 'b':'banana'}에 대해, {0:'apple', 1:'banana'}을 리턴한다."
125 | ]
126 | },
127 | {
128 | "cell_type": "code",
129 | "execution_count": 15,
130 | "metadata": {
131 | "collapsed": false
132 | },
133 | "outputs": [],
134 | "source": [
135 | "def f():\n",
136 | " return {0:'a', 1:'b'}\n",
137 | "\n",
138 | "def g():\n",
139 | " return {'a':'apple', 'b':'banana'}"
140 | ]
141 | },
142 | {
143 | "cell_type": "code",
144 | "execution_count": 16,
145 | "metadata": {
146 | "collapsed": true
147 | },
148 | "outputs": [],
149 | "source": [
150 | "def my_function_composition(f, g):\n",
151 | " fr = f()\n",
152 | " gr = g()\n",
153 | " result = {key:gr[fr[key]] for key in fr}\n",
154 | " return result"
155 | ]
156 | },
157 | {
158 | "cell_type": "code",
159 | "execution_count": 17,
160 | "metadata": {
161 | "collapsed": false
162 | },
163 | "outputs": [
164 | {
165 | "name": "stdout",
166 | "output_type": "stream",
167 | "text": [
168 | "{0: 'apple', 1: 'banana'}\n"
169 | ]
170 | }
171 | ],
172 | "source": [
173 | "result = my_function_composition(f, g)\n",
174 | "print(result)"
175 | ]
176 | },
177 | {
178 | "cell_type": "markdown",
179 | "metadata": {},
180 | "source": [
181 | "# 파이썬의 루프 문제"
182 | ]
183 | },
184 | {
185 | "cell_type": "raw",
186 | "metadata": {},
187 | "source": [
188 | "def (L):\n",
189 | " current = ...\n",
190 | " for x in L:\n",
191 | " current = ...\n",
192 | " return current"
193 | ]
194 | },
195 | {
196 | "cell_type": "markdown",
197 | "metadata": {},
198 | "source": [
199 | "Problem 2.7.4: mySum(L)\n",
200 | "- input: 숫자들의 리스트\n",
201 | "- output: 리스트 내에 숫자들의 합"
202 | ]
203 | },
204 | {
205 | "cell_type": "code",
206 | "execution_count": 30,
207 | "metadata": {
208 | "collapsed": true
209 | },
210 | "outputs": [],
211 | "source": [
212 | "def mySum(L):\n",
213 | " sum = 0\n",
214 | " for elem in L:\n",
215 | " sum += elem\n",
216 | " return sum"
217 | ]
218 | },
219 | {
220 | "cell_type": "code",
221 | "execution_count": 19,
222 | "metadata": {
223 | "collapsed": false
224 | },
225 | "outputs": [
226 | {
227 | "name": "stdout",
228 | "output_type": "stream",
229 | "text": [
230 | "6\n"
231 | ]
232 | }
233 | ],
234 | "source": [
235 | "print(mySum([1,2,3]))"
236 | ]
237 | },
238 | {
239 | "cell_type": "markdown",
240 | "metadata": {},
241 | "source": [
242 | "Problem 2.7.5: myProduct(L)\n",
243 | "- input: 숫자들의 리스트\n",
244 | "- output: 리스트 내에 숫자들의 곱"
245 | ]
246 | },
247 | {
248 | "cell_type": "code",
249 | "execution_count": 31,
250 | "metadata": {
251 | "collapsed": true
252 | },
253 | "outputs": [],
254 | "source": [
255 | "def myProduct(L):\n",
256 | " product = 1\n",
257 | " for elem in L:\n",
258 | " product *= elem\n",
259 | " return product"
260 | ]
261 | },
262 | {
263 | "cell_type": "code",
264 | "execution_count": 48,
265 | "metadata": {
266 | "collapsed": false
267 | },
268 | "outputs": [
269 | {
270 | "name": "stdout",
271 | "output_type": "stream",
272 | "text": [
273 | "6\n"
274 | ]
275 | }
276 | ],
277 | "source": [
278 | "print(myProduct([1,2,3]))"
279 | ]
280 | },
281 | {
282 | "cell_type": "markdown",
283 | "metadata": {},
284 | "source": [
285 | "Problem 2.7.6: myMin(L)\n",
286 | "- input: 숫자들의 리스트\n",
287 | "- output: 리스트 내에 최소 숫자"
288 | ]
289 | },
290 | {
291 | "cell_type": "code",
292 | "execution_count": 32,
293 | "metadata": {
294 | "collapsed": true
295 | },
296 | "outputs": [],
297 | "source": [
298 | "import sys\n",
299 | "\n",
300 | "def myMin(L):\n",
301 | " min = sys.maxsize\n",
302 | " for elem in L:\n",
303 | " if(elem < min): min = elem\n",
304 | " return min"
305 | ]
306 | },
307 | {
308 | "cell_type": "code",
309 | "execution_count": 22,
310 | "metadata": {
311 | "collapsed": false
312 | },
313 | "outputs": [
314 | {
315 | "name": "stdout",
316 | "output_type": "stream",
317 | "text": [
318 | "1\n"
319 | ]
320 | }
321 | ],
322 | "source": [
323 | "print(myMin([1,2,3,4]))"
324 | ]
325 | },
326 | {
327 | "cell_type": "markdown",
328 | "metadata": {},
329 | "source": [
330 | "Problem 2.7.7: myConcat(L)\n",
331 | "- input: 문자열들의 리스트\n",
332 | "- output: L 내에 모든 문자열의 결함"
333 | ]
334 | },
335 | {
336 | "cell_type": "code",
337 | "execution_count": 33,
338 | "metadata": {
339 | "collapsed": true
340 | },
341 | "outputs": [],
342 | "source": [
343 | "def myConcat(L):\n",
344 | " concat = \"\"\n",
345 | " for elem in L:\n",
346 | " concat += elem\n",
347 | " return concat"
348 | ]
349 | },
350 | {
351 | "cell_type": "code",
352 | "execution_count": 24,
353 | "metadata": {
354 | "collapsed": false
355 | },
356 | "outputs": [
357 | {
358 | "name": "stdout",
359 | "output_type": "stream",
360 | "text": [
361 | "abclmnxyz\n"
362 | ]
363 | }
364 | ],
365 | "source": [
366 | "print(myConcat([\"abc\",\"lmn\",\"xyz\"]))"
367 | ]
368 | },
369 | {
370 | "cell_type": "markdown",
371 | "metadata": {},
372 | "source": [
373 | "Problem 2.7.8: myUnion(L)\n",
374 | "- input: 집합들의 리스트\n",
375 | "- output: L 내에 모든 집합의 합집합"
376 | ]
377 | },
378 | {
379 | "cell_type": "code",
380 | "execution_count": 34,
381 | "metadata": {
382 | "collapsed": true
383 | },
384 | "outputs": [],
385 | "source": [
386 | "def myUnion(L):\n",
387 | " union = set()\n",
388 | " for elem in L:\n",
389 | " union = union | elem\n",
390 | " return union"
391 | ]
392 | },
393 | {
394 | "cell_type": "code",
395 | "execution_count": 27,
396 | "metadata": {
397 | "collapsed": false
398 | },
399 | "outputs": [
400 | {
401 | "name": "stdout",
402 | "output_type": "stream",
403 | "text": [
404 | "{1, 2, 22, 105, 106, 11}\n"
405 | ]
406 | }
407 | ],
408 | "source": [
409 | "print(myUnion([{1,2},{11,22},{105,106,2}]))"
410 | ]
411 | },
412 | {
413 | "cell_type": "markdown",
414 | "metadata": {},
415 | "source": [
416 | "Problem 2.7.9: 위에서 언ㄴ급한 내용을 참고하여 다음 각각에 대한 답을 찾아보자\n",
417 | "1. 빈 집합에 있는 숫자들의 합\n",
418 | "2. 빈 집합에 있는 숫자들의 곱\n",
419 | "3. 빈 집합에 있는 숫자들 중 최소값\n",
420 | "4. 문자열들을 원소로 가지는 리스트가 빈 리스트인 경우의 결합\n",
421 | "5. 집합들을 원소로 가지는 리스트가 빈 리스트인 경우의 합결합"
422 | ]
423 | },
424 | {
425 | "cell_type": "code",
426 | "execution_count": 35,
427 | "metadata": {
428 | "collapsed": false
429 | },
430 | "outputs": [
431 | {
432 | "name": "stdout",
433 | "output_type": "stream",
434 | "text": [
435 | "0\n",
436 | "1\n",
437 | "9223372036854775807\n",
438 | "\n",
439 | "set()\n"
440 | ]
441 | }
442 | ],
443 | "source": [
444 | "print(mySum([]))\n",
445 | "print(myProduct([]))\n",
446 | "print(myMin([]))\n",
447 | "print(myConcat([]))\n",
448 | "print(myUnion([]))"
449 | ]
450 | },
451 | {
452 | "cell_type": "markdown",
453 | "metadata": {},
454 | "source": [
455 | "# 복소수 덧셈 연습"
456 | ]
457 | },
458 | {
459 | "cell_type": "markdown",
460 | "metadata": {},
461 | "source": [
462 | "Problem 2.7.10: 다음 문제들의 각각은 두 개의 복소수의 합을 구하는 것이다. 각각에 대해 해를 구하고 그림 2.1과 같이 그림으로 나타내어 보자. 그리는 화살표는 더해지는 벡터에(대략적으로) 대응되어야 한다.\n",
463 | "\n",
464 | "1. (3+1i)+(2+2i)\n",
465 | "2. (-1+2i)+(1-1i)\n",
466 | "3. (2+0i)+(-3+.00i) \n",
467 | "4. 4(0+2i)+(.001+1i)"
468 | ]
469 | },
470 | {
471 | "cell_type": "markdown",
472 | "metadata": {},
473 | "source": [
474 | "1. 5+3i\n",
475 | "2. 0+1i\n",
476 | "3. -1+.00i\n",
477 | "4. .001+1i"
478 | ]
479 | },
480 | {
481 | "cell_type": "markdown",
482 | "metadata": {},
483 | "source": [
484 | "# 지수의 곱"
485 | ]
486 | },
487 | {
488 | "cell_type": "markdown",
489 | "metadata": {},
490 | "source": [
491 | "Problem 2.7.11: 지수의 첫 번째 법칙을 사용하여 (섹션 2.4.9) 두 지수의 곱을 하나의 지수로 표현해 보자. 예를 들어, exp(π/4i)exp(π/4i) = exp(π/2i)이다\n",
492 | "\n",
493 | "1. exp(1i)exp(2i)\n",
494 | "2. exp(π/4i)exp(2π/3i)\n",
495 | "3. exp(-π/4i)exp(2π/3i)"
496 | ]
497 | },
498 | {
499 | "cell_type": "markdown",
500 | "metadata": {},
501 | "source": [
502 | "1. exp(3i)\n",
503 | "2. exp(11/12i)\n",
504 | "3. exp(5/12i)"
505 | ]
506 | },
507 | {
508 | "cell_type": "markdown",
509 | "metadata": {},
510 | "source": [
511 | "# 복소수에 대한 연산 결합"
512 | ]
513 | },
514 | {
515 | "cell_type": "markdown",
516 | "metadata": {},
517 | "source": [
518 | "Problem 2.7.12: 다음 스펙을 가지고 프로시저, transform(a,b,L)을 작성해 보자\n",
519 | "\n",
520 | "- input: 복소수 a와 b, 복소수들의 리스트 L\n",
521 | "- output: f(z) = az + b를 L내의 각 복소수에 적용하여 얻은 복소수들의 리스트\n",
522 | "\n",
523 | "다음의 각 문제에 명시된 변환을 이루기 위해, a와 b 값으로 어떤 값을 선택해야 하는지 설명해 보자. 만일 명시된 변환을 이룰 방법이 없으면, 그 이유를 설명해 보자.\n",
524 | "\n",
525 | "1. z를 위로 1유닛, 오른쪽으로 1유닛 평행이동하고, 다음에 시계 방향으로 45도 회전한 후, 아래로 2만큼 스케일링해 보자\n",
526 | "2. 실수부를 2만큼, 허수부를 3만큼 스케일링하고 반시계 방향으로 45도 회전한 후, 아래에 2유닛, 왼쪽으로 3유닛 평행 이동해 보자"
527 | ]
528 | },
529 | {
530 | "cell_type": "code",
531 | "execution_count": 36,
532 | "metadata": {
533 | "collapsed": true
534 | },
535 | "outputs": [],
536 | "source": [
537 | "def transform(a,b,L):\n",
538 | " result = [ a*elem + b for elem in L]\n",
539 | " return result"
540 | ]
541 | },
542 | {
543 | "cell_type": "code",
544 | "execution_count": 32,
545 | "metadata": {
546 | "collapsed": false
547 | },
548 | "outputs": [
549 | {
550 | "name": "stdout",
551 | "output_type": "stream",
552 | "text": [
553 | "[(3+6j), (5+7j)]\n"
554 | ]
555 | }
556 | ],
557 | "source": [
558 | "print(transform((2+1j),(2+3j),[(1+1j),(2+1j)]))"
559 | ]
560 | },
561 | {
562 | "cell_type": "markdown",
563 | "metadata": {},
564 | "source": [
565 | "1. 풀어 봅시다."
566 | ]
567 | },
568 | {
569 | "cell_type": "code",
570 | "execution_count": 4,
571 | "metadata": {
572 | "collapsed": false
573 | },
574 | "outputs": [],
575 | "source": [
576 | "import math"
577 | ]
578 | },
579 | {
580 | "cell_type": "code",
581 | "execution_count": 37,
582 | "metadata": {
583 | "collapsed": false
584 | },
585 | "outputs": [
586 | {
587 | "name": "stdout",
588 | "output_type": "stream",
589 | "text": [
590 | "[(7.363961030678928+0.29289321881345254j)]\n"
591 | ]
592 | }
593 | ],
594 | "source": [
595 | "a = math.sqrt(2)/2 + math.sqrt(2)/2j\n",
596 | "b = 1 + 1j\n",
597 | "transformed = transform(a,b,[(5+4j)])\n",
598 | "print(transformed)"
599 | ]
600 | },
601 | {
602 | "cell_type": "markdown",
603 | "metadata": {},
604 | "source": [
605 | "2. 풀어 봅시다."
606 | ]
607 | },
608 | {
609 | "cell_type": "markdown",
610 | "metadata": {},
611 | "source": [
612 | "실수부를 2만큼, 허수부를 3만큼 스케일링하고 반시계 방향으로 45도 회전한 후, 아래에 2유닛, 왼쪽으로 3유닛 평행 이동해 보자"
613 | ]
614 | },
615 | {
616 | "cell_type": "code",
617 | "execution_count": 38,
618 | "metadata": {
619 | "collapsed": false
620 | },
621 | "outputs": [
622 | {
623 | "name": "stdout",
624 | "output_type": "stream",
625 | "text": [
626 | "[(24.414213562373096-0.12132034355964283j)]\n"
627 | ]
628 | }
629 | ],
630 | "source": [
631 | "a = 3-2j\n",
632 | "b = 2*math.sqrt(2)/2 - 3j*math.sqrt(2)/2\n",
633 | "transformed = transform(a,b,[(5+4j)])\n",
634 | "print(transformed)"
635 | ]
636 | },
637 | {
638 | "cell_type": "markdown",
639 | "metadata": {},
640 | "source": [
641 | "# GF(2) 연산"
642 | ]
643 | },
644 | {
645 | "cell_type": "markdown",
646 | "metadata": {},
647 | "source": [
648 | "Problem 2.7.13: 다음의 각 문제에 대해 GF(2)연산의 결과를 계산해 보자\n",
649 | "\n",
650 | "1. 1 + 1 + 1 + 0\n",
651 | "2. 1 * 1 + 1 * 1 + 0 * 0 + 1 * 1\n",
652 | "3. (1 + 1 + 1) * (1 + 1 + 1 + 1)"
653 | ]
654 | },
655 | {
656 | "cell_type": "markdown",
657 | "metadata": {},
658 | "source": [
659 | "1. 1\n",
660 | "2. 1\n",
661 | "3. 0"
662 | ]
663 | },
664 | {
665 | "cell_type": "markdown",
666 | "metadata": {},
667 | "source": [
668 | "# 네트워크 코딩"
669 | ]
670 | },
671 | {
672 | "cell_type": "markdown",
673 | "metadata": {},
674 | "source": [
675 | "Problem 2.7.14: 섹션 2.5.2에서 사용된 네트워크 예를 생각해 보자. 주어진 순간에 전송되어야 할 비트는 b1=1, b2=1이다. 네트워크의 각 링크를 그 링크를 통해 전송되어야 비트를 가지고 표시해 보자. 이 때, 비트는 네트워크 코딩 기법에 따라 전송된다. 사용자 노드 c와 d는 어떻게 b1과 b2를 수신할 수 있는지 설명해 보자."
676 | ]
677 | },
678 | {
679 | "cell_type": "markdown",
680 | "metadata": {},
681 | "source": [
682 | "\n"
683 | ]
684 | }
685 | ],
686 | "metadata": {
687 | "kernelspec": {
688 | "display_name": "Python 3",
689 | "language": "python",
690 | "name": "python3"
691 | },
692 | "language_info": {
693 | "codemirror_mode": {
694 | "name": "ipython",
695 | "version": 3
696 | },
697 | "file_extension": ".py",
698 | "mimetype": "text/x-python",
699 | "name": "python",
700 | "nbconvert_exporter": "python",
701 | "pygments_lexer": "ipython3",
702 | "version": "3.4.0"
703 | }
704 | },
705 | "nbformat": 4,
706 | "nbformat_minor": 0
707 | }
708 |
--------------------------------------------------------------------------------
/시즌1 발표자료 저장공간/5회차 ch5/Ch_5(Matrix5.1~5.8).ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Chapter 5\n",
8 | "## 5.1 행렬이란 무엇인가?\n",
9 | "### 5.1.1 전통적인 행렬\n",
10 | "\n",
11 | "\n",
12 | "$$\n",
13 | "\\begin{bmatrix}\n",
14 | "1 & 2 & 3 \\\\\n",
15 | "10 & 20 & 30 \\\\\n",
16 | "\\end{bmatrix}\n",
17 | "$$\n",
18 | " \n",
19 | " - 행렬을 행-리스트(row-list)들로 구성된 리스트로 표현하면, [[1,2,3],[10,20,30]]\n",
20 | " - 행렬을 열-리스트(column-list)로 구성된 리스트로 표현하면, [[1,10], [2,20],[3,30]]"
21 | ]
22 | },
23 | {
24 | "cell_type": "code",
25 | "execution_count": 5,
26 | "metadata": {
27 | "collapsed": true
28 | },
29 | "outputs": [],
30 | "source": [
31 | "%matplotlib inline "
32 | ]
33 | },
34 | {
35 | "cell_type": "code",
36 | "execution_count": 6,
37 | "metadata": {
38 | "collapsed": false
39 | },
40 | "outputs": [],
41 | "source": [
42 | "import matplotlib\n",
43 | "import numpy as np\n",
44 | "import matplotlib.pyplot as plt"
45 | ]
46 | },
47 | {
48 | "cell_type": "code",
49 | "execution_count": 7,
50 | "metadata": {
51 | "collapsed": true
52 | },
53 | "outputs": [],
54 | "source": [
55 | "class Vec :\n",
56 | " def __init__(self, labels, function):\n",
57 | " self.D = labels\n",
58 | " self.f = function"
59 | ]
60 | },
61 | {
62 | "cell_type": "code",
63 | "execution_count": 8,
64 | "metadata": {
65 | "collapsed": false
66 | },
67 | "outputs": [],
68 | "source": [
69 | "class Vec:\n",
70 | " def __init__(self, labels, function):\n",
71 | " self.D = labels\n",
72 | " self.f = function\n",
73 | " \n",
74 | " def getitem(v,d):\n",
75 | " return v.f[d] if d in v.f else 0\n",
76 | " \n",
77 | " def scalar_mul(v, alpha):\n",
78 | " return Vec(v.D, {d:alpha*value for d, value in v.f.items()})\n",
79 | "\n",
80 | " def vec_add(D, vec_list):\n",
81 | " return Vec(D, {d:sum(Vec.getitem(v,d) for v in vec_list) for d in D})"
82 | ]
83 | },
84 | {
85 | "cell_type": "markdown",
86 | "metadata": {},
87 | "source": [
88 | "** Quiz 5.1.1 ** 값이 행-리스트들로 구성된 리스트인 중첩된 컴프리핸션을 작성해 보자.\n",
89 | "\n",
90 | "$$\n",
91 | "\\begin{bmatrix}\n",
92 | "0 & 0 & 0 & 0 \\\\\n",
93 | "0 & 0 & 0 & 0 \\\\\n",
94 | "0 & 0 & 0 & 0 \\\\\n",
95 | "\\end{bmatrix}\n",
96 | "$$"
97 | ]
98 | },
99 | {
100 | "cell_type": "code",
101 | "execution_count": 4,
102 | "metadata": {
103 | "collapsed": false
104 | },
105 | "outputs": [
106 | {
107 | "data": {
108 | "text/plain": [
109 | "[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]"
110 | ]
111 | },
112 | "execution_count": 4,
113 | "metadata": {},
114 | "output_type": "execute_result"
115 | }
116 | ],
117 | "source": [
118 | "[[0 for j in range(4)] for i in range(3)]"
119 | ]
120 | },
121 | {
122 | "cell_type": "markdown",
123 | "metadata": {},
124 | "source": [
125 | "** Quiz 5.1.2 ** 값이 열-리스트들로 구성된 리스트인 중첩된 컴프리핸션을 작성해 보자.\n",
126 | "\n",
127 | " 3 X 4 행렬 , 이 행렬의 i,j원소는 i-j이다.\n",
128 | " \n",
129 | "$$\n",
130 | "\\begin{bmatrix}\n",
131 | "0 & -1 & -2 & -3 \\\\\n",
132 | "1 & 0 & -1 & -2 \\\\\n",
133 | "2 & 1 & 0 & -1 \\\\\n",
134 | "\\end{bmatrix}\n",
135 | "$$\n",
136 | " \n",
137 | "\n"
138 | ]
139 | },
140 | {
141 | "cell_type": "code",
142 | "execution_count": 5,
143 | "metadata": {
144 | "collapsed": false
145 | },
146 | "outputs": [
147 | {
148 | "data": {
149 | "text/plain": [
150 | "[[0, 1, 2], [-1, 0, 1], [-2, -1, 0], [-3, -2, -1]]"
151 | ]
152 | },
153 | "execution_count": 5,
154 | "metadata": {},
155 | "output_type": "execute_result"
156 | }
157 | ],
158 | "source": [
159 | "[[i-j for i in range(3)] for j in range(4)]"
160 | ]
161 | },
162 | {
163 | "cell_type": "markdown",
164 | "metadata": {},
165 | "source": [
166 | "### 5.1.2 행렬에 대해 알아보기\n",
167 | "\n",
168 | "\n",
169 | "** Example 5.1.3 ** 행의 원소들 row label = {'a', 'b'}, 열의 요소들 column label = {'#','@','?'}\n",
170 | "\n",
171 | "$$\n",
172 | "\\begin{array}{c|lcr}\n",
173 | " & \\text{@} & \\text{#} & \\text{?} \\\\\n",
174 | "\\hline\n",
175 | "a & 1 & 2 & 3 \\\\\n",
176 | "b & 10 & 20 & 30 \\\\\n",
177 | "\\end{array}\n",
178 | "$$\n",
179 | "\n",
180 | " \n",
181 | " 파이썬의 딕셔너리 표현법으로 나타내면,\n",
182 | " {('a','@'):1, ('a','#'):2, ('a','?'):3, ('b','@'):10, ('b','#'):20, ('b','?'):30}\n",
183 | "\n",
184 | "\n",
185 | "### 5.1.3 행, 열, 엔트리\n",
186 | "\n",
187 | " 행렬이 유용한 이유는 행과 열을 벡터로 해석할 수 있기 때문이다.\n",
188 | " \n",
189 | " Example 5.1.3의 해석\n",
190 | " - 행 'a'는 벡터 Vec({'@', '#', '?'}, {'@':1, '#':2, '?':3})이다.\n",
191 | " - 행 'b'는 벡터 Vec({'@', '#', '?'}, {'@':10, '#':20, '?':30})이다.\n",
192 | " - 열 '@'는 벡터 Vec({'a', 'b'}, {'a':1, 'b':10})이다.\n",
193 | " - 열 '#'는 벡터 Vec({'a', 'b'}, {'a':2, 'b':20})이다.\n",
194 | "\n",
195 | "\n",
196 | "** Quiz 5.1.4 : ** Vec을 사용하여 열 '?'에 대한 파이썬 표현식을 작성해 보자."
197 | ]
198 | },
199 | {
200 | "cell_type": "code",
201 | "execution_count": 3,
202 | "metadata": {
203 | "collapsed": false
204 | },
205 | "outputs": [
206 | {
207 | "ename": "SyntaxError",
208 | "evalue": "invalid syntax (, line 1)",
209 | "output_type": "error",
210 | "traceback": [
211 | "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m1\u001b[0m\n\u001b[1;33m Vec({'a', 'b'}, {'a':3, 'b':30}.)\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m invalid syntax\n"
212 | ]
213 | }
214 | ],
215 | "source": [
216 | "Vec({'a', 'b'}, {'a':3, 'b':30}.)"
217 | ]
218 | },
219 | {
220 | "cell_type": "markdown",
221 | "metadata": {},
222 | "source": [
223 | "- 행들로 구성된 딕셔너리 표현 ( rowdict )\n",
224 | "\n",
225 | " {'a' : Vec ({'@', '#', '?'}, {'@':1, '#':2, '?':3}),\n",
226 | "\n",
227 | " 'b' : Vec ({'@', '#', '?'}, {'@':10, '#':20, '?':30})}\n",
228 | "\n",
229 | "\n",
230 | "\n",
231 | "- 열들로 구성된 딕셔너리 표현 ( coldict )\n",
232 | " \n",
233 | " {'#' : Vec ({'a', 'b'}, {'a':2, 'b':20}),\n",
234 | " \n",
235 | " '@' : Vec ({'a', 'b'}, {'a':1, 'b':10}),\n",
236 | " \n",
237 | " '?' : Vec ({'a', 'b'}, {'a':3, 'b':30}), }\n",
238 | "\n",
239 | "** Quiz 5.1.5 :** Example 5.1.3의 행렬에 대한 coldict표현인 파이썬 표현식을 작성해 보자."
240 | ]
241 | },
242 | {
243 | "cell_type": "code",
244 | "execution_count": 9,
245 | "metadata": {
246 | "collapsed": false
247 | },
248 | "outputs": [
249 | {
250 | "data": {
251 | "text/plain": [
252 | "{'#': {'a', 'b'}, '?': {'a', 'b'}, '@': {'a', 'b'}}"
253 | ]
254 | },
255 | "execution_count": 9,
256 | "metadata": {},
257 | "output_type": "execute_result"
258 | }
259 | ],
260 | "source": [
261 | "{'#': Vec({'a', 'b'}, {'a':2, 'b':20}).D,\n",
262 | "'@': Vec({'a', 'b'}, {'a':1, 'b':10}).D,\n",
263 | "'?': Vec({'a', 'b'}, {'a':3, 'b':30}).D}"
264 | ]
265 | },
266 | {
267 | "cell_type": "markdown",
268 | "metadata": {},
269 | "source": [
270 | "### 5.1.4 행렬의 파이썬 구현\n",
271 | "\n",
272 | "벡터 클래스 Vec와 유사한 Mat로 행렬 정의하는 것이 편리하다.\n",
273 | "\n",
274 | "클래스 Mat의 인스턴스는 다음과 같다.\n",
275 | "\n",
276 | "- 집합들의 쌍(R,C)에 바인딩될 D (D가 하나의 집합인 Vec와는 다름)\n",
277 | "- 쌍 (r,c) ∈ R * C을 필드 원소에 매핑하는 함수를 나타내는 딕셔너리에 바인딩 될 f\n",
278 | "\n",
279 | "\n",
280 | "행렬의 sparsity표현\n",
281 | "- 행렬의 엔트리 중 값이 0인 것은 딕셔너리에 표현할 필요가 없다. (벡터보다 행렬이 훨씬 크기 때문에 중요)"
282 | ]
283 | },
284 | {
285 | "cell_type": "markdown",
286 | "metadata": {},
287 | "source": [
288 | "\n",
289 | "클래스 Mat를 정의하는데 필요한 파이썬 코드는 다음과 같다.\n"
290 | ]
291 | },
292 | {
293 | "cell_type": "code",
294 | "execution_count": 10,
295 | "metadata": {
296 | "collapsed": true
297 | },
298 | "outputs": [],
299 | "source": [
300 | "class Mat :\n",
301 | " def __init__(self, labels, function):\n",
302 | " self.D = labels\n",
303 | " self.f = function"
304 | ]
305 | },
306 | {
307 | "cell_type": "code",
308 | "execution_count": 11,
309 | "metadata": {
310 | "collapsed": true
311 | },
312 | "outputs": [],
313 | "source": [
314 | "M = Mat(({'a', 'b'}, {'@', '#', '?'}), {('a', '@'):1, ('a', '#'):2, ('a', '?'):3, ('b', '@'):10, ('b', '#'):20, ('b', '?'):30})"
315 | ]
316 | },
317 | {
318 | "cell_type": "code",
319 | "execution_count": 12,
320 | "metadata": {
321 | "collapsed": false
322 | },
323 | "outputs": [
324 | {
325 | "name": "stdout",
326 | "output_type": "stream",
327 | "text": [
328 | "<__main__.Mat instance at 0x000000000A541D08>\n"
329 | ]
330 | }
331 | ],
332 | "source": [
333 | "print(M)"
334 | ]
335 | },
336 | {
337 | "cell_type": "markdown",
338 | "metadata": {},
339 | "source": [
340 | "### 5.1.5 단위행렬\n",
341 | "\n",
342 | "** Definition 5.1.6 ** 유한집합 D에 대해, D X D 단위행렬은 행-라벨 집합과 열-라벨 집합이 둘다 D이고 모든 d ∈ D 에 대해 엔트리 (d,d)는 1 (모든 다른 엔트리는 0)인 핼렬이다.\n",
343 | "\n",
344 | "$$\n",
345 | "\\begin{array}{c|lcr}\n",
346 | " & \\text{a} & \\text{b} & \\text{c} \\\\\n",
347 | "\\hline\n",
348 | "a & 1 & 0 & 0 \\\\\n",
349 | "b & 0 & 1 & 0 \\\\\n",
350 | "b & 0 & 0 & 1 \\\\\n",
351 | "\\end{array}\n",
352 | "$$\n",
353 | "\n",
354 | "** Quiz 5.1.7 : ** Mat의 인스턴스로 표현되는 {'a', 'b', 'c'} X {'a', 'b', 'c'}단위행렬에 대한 표현식을 작성해 보자."
355 | ]
356 | },
357 | {
358 | "cell_type": "code",
359 | "execution_count": 103,
360 | "metadata": {
361 | "collapsed": false
362 | },
363 | "outputs": [
364 | {
365 | "data": {
366 | "text/plain": [
367 | "<__main__.Mat instance at 0x0000000009E4E588>"
368 | ]
369 | },
370 | "execution_count": 103,
371 | "metadata": {},
372 | "output_type": "execute_result"
373 | }
374 | ],
375 | "source": [
376 | "Mat(({'a', 'b', 'c'}, {'a', 'b', 'c'}), {('a', 'a'):1, ('b', 'b'):1, ('c', 'c'):1})"
377 | ]
378 | },
379 | {
380 | "cell_type": "markdown",
381 | "metadata": {},
382 | "source": [
383 | "** Quiz 5.1.8 : **한 줄로 된 프로시저, identity(D)를 작성해 보자.\n",
384 | " 이 프로시져는 주어진 유한한 집합 D에 대해 Mat의 인스턴스로 표현된 D * D 단위행렬을 리턴한다."
385 | ]
386 | },
387 | {
388 | "cell_type": "code",
389 | "execution_count": 104,
390 | "metadata": {
391 | "collapsed": true
392 | },
393 | "outputs": [],
394 | "source": [
395 | "def identity(D) : return Mat(D, D), {(d,d):1 for d in D}"
396 | ]
397 | },
398 | {
399 | "cell_type": "markdown",
400 | "metadata": {},
401 | "source": [
402 | "### 5.1.6 행렬 표현의 변환\n",
403 | "\n",
404 | "** Quiz 5.1.9 : **한 줄로 된 프로시져, mat2rowdict(A)를 작성해 보자. 이 프로시져는 Mat의 인스턴스에 대해 동일한 행렬의 rowdict 표현을 리턴한다. (matrix 를 rowdict로 변환)"
405 | ]
406 | },
407 | {
408 | "cell_type": "code",
409 | "execution_count": 77,
410 | "metadata": {
411 | "collapsed": true
412 | },
413 | "outputs": [],
414 | "source": [
415 | "def mat2rowdict(A) :\n",
416 | " return {r:Vec(A.D[1], {c:A[r,c] for c in A.D[1] for r in A.D[0]})}"
417 | ]
418 | },
419 | {
420 | "cell_type": "markdown",
421 | "metadata": {},
422 | "source": [
423 | "** Quiz 5.1.10 : ** 한 줄로 된 프로시져, mat2coldict(A)를 작성해 보자. 이 프로시져는 Mat의 인스턴스에 대해 동일한 행렬의 coldict 표현을 리턴한다. (matrix 를 coldict로 변환)"
424 | ]
425 | },
426 | {
427 | "cell_type": "code",
428 | "execution_count": 46,
429 | "metadata": {
430 | "collapsed": true
431 | },
432 | "outputs": [],
433 | "source": [
434 | "def mat2coldict(A) :\n",
435 | " return {c:Vec(A, D[0], {r:A[r,c] for r in A.D[0] for c in A.D[1]})}"
436 | ]
437 | },
438 | {
439 | "cell_type": "markdown",
440 | "metadata": {},
441 | "source": [
442 | "### 5.1.7 matutil.py"
443 | ]
444 | },
445 | {
446 | "cell_type": "code",
447 | "execution_count": 105,
448 | "metadata": {
449 | "collapsed": false
450 | },
451 | "outputs": [
452 | {
453 | "ename": "NameError",
454 | "evalue": "name 'listlist2mat' is not defined",
455 | "output_type": "error",
456 | "traceback": [
457 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
458 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
459 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mA\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mlistlist2mat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m10\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m20\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m30\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m40\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;36m50\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m60\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m70\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m80\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
460 | "\u001b[1;31mNameError\u001b[0m: name 'listlist2mat' is not defined"
461 | ]
462 | }
463 | ],
464 | "source": [
465 | "A = listlist2mat([[10, 20, 30, 40], [50, 60, 70, 80]])"
466 | ]
467 | },
468 | {
469 | "cell_type": "code",
470 | "execution_count": 106,
471 | "metadata": {
472 | "collapsed": false
473 | },
474 | "outputs": [
475 | {
476 | "ename": "NameError",
477 | "evalue": "name 'A' is not defined",
478 | "output_type": "error",
479 | "traceback": [
480 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
481 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
482 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mA\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
483 | "\u001b[1;31mNameError\u001b[0m: name 'A' is not defined"
484 | ]
485 | }
486 | ],
487 | "source": [
488 | "print(A)"
489 | ]
490 | },
491 | {
492 | "cell_type": "markdown",
493 | "metadata": {},
494 | "source": [
495 | "## 5.2 열공간 (Column space)과 행공간 (Row space)\n",
496 | "\n",
497 | "행렬은 \"열들의 묶음\"과 \"행들의 묶음\"으로 해석할 수 있다.\n",
498 | "\n",
499 | "** Definition 5.2.1 : **행렬 M에 대해,\n",
500 | "- M의 열공간은 Col M으로 나타내며 M의 열들에 의해 생성된 벡터공간이다.\n",
501 | "- M의 행공간은 Row M으로 나타내며 M의 행들에 의해 생성된 벡터공간이다.\n",
502 | "\n",
503 | "\n",
504 | "** Example 5,2,2 **\n",
505 | "\n",
506 | "$$\n",
507 | "\\begin{bmatrix}\n",
508 | "1 & 2 & 3 \\\\\n",
509 | "10 & 20 & 30 \\\\\n",
510 | "\\end{bmatrix}\n",
511 | "$$\n",
512 | "\n",
513 | "의 열공간은 Span {[1,10], [2,20], [3,30]}이다. 이 경우, [2,20]과 [3,30]은 [1.10]의 스칼라배이므로 열공간은 Span{[1,10]}과 동일하다.\n",
514 | "\n",
515 | "\n",
516 | "## 5.3 벡터로서의 행렬\n",
517 | "\n",
518 | "- 행렬은 벡터로 해석될 수 있다. 그래서, \"스칼라-벡터 곱셈\" 과 \"벡터 덧셈\"을 행렬에도 사용할 수 있다.\n",
519 | "\n",
520 | "** Quiz 5.3.1 :** 프로시져, mat2Vec(M)을 작성해 보자. 이 프로시져는 주어진 Mat의 인스턴스에 대해 대응하는 Vec의 인스턴스를 리턴한다."
521 | ]
522 | },
523 | {
524 | "cell_type": "code",
525 | "execution_count": 82,
526 | "metadata": {
527 | "collapsed": false
528 | },
529 | "outputs": [],
530 | "source": [
531 | "def mat2vec(M) :\n",
532 | " return Vec({(r,s) for r in M.D[0] for s in M.D[1]}, M.f)"
533 | ]
534 | },
535 | {
536 | "cell_type": "markdown",
537 | "metadata": {},
538 | "source": [
539 | "## 5.4 전치 (Transpose)\n",
540 | "\n",
541 | "- 행렬의 전치는 행과 열을 바꾸는 것이다.\n",
542 | "\n",
543 | "\n",
544 | "** Definition 5.4.1 : ** P * Q 행렬의 전치는 $\n",
545 | "M^T\n",
546 | "$로 나타내며, 모든 i ∈ P, j ∈Q에 대해 $(M^T)_ij$ = $M_ij$을 만족하는 Q X P 행렬이다.\n",
547 | "\n",
548 | "** Quiz 5.4.1 :** 프로시져, transpose(M)을 작성해 보자"
549 | ]
550 | },
551 | {
552 | "cell_type": "code",
553 | "execution_count": 83,
554 | "metadata": {
555 | "collapsed": false
556 | },
557 | "outputs": [
558 | {
559 | "ename": "NameError",
560 | "evalue": "global name 'p' is not defined",
561 | "output_type": "error",
562 | "traceback": [
563 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
564 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
565 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mprint\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtranspose\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mM\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
566 | "\u001b[1;32m\u001b[0m in \u001b[0;36mtranspose\u001b[1;34m(M)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mtranspose\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mM\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mMat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mM\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mD\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mM\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mD\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;36m0\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mp\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mq\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mv\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mM\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mF\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mitems\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
567 | "\u001b[1;31mNameError\u001b[0m: global name 'p' is not defined"
568 | ]
569 | }
570 | ],
571 | "source": [
572 | "print(transpose(M))"
573 | ]
574 | },
575 | {
576 | "cell_type": "code",
577 | "execution_count": 14,
578 | "metadata": {
579 | "collapsed": true
580 | },
581 | "outputs": [],
582 | "source": [
583 | "def transpose(M):\n",
584 | " return Mat((M.D[1], M.D[0]), {(q, p): v for (p,q), v in M.F.items()})"
585 | ]
586 | },
587 | {
588 | "cell_type": "markdown",
589 | "metadata": {},
590 | "source": [
591 | "- 대칭행렬 M 설명\n",
592 | "\n",
593 | "** Example 5.4.3 : ** \n",
594 | "\n",
595 | "$$\n",
596 | "\\begin{bmatrix}\n",
597 | "1 & 2 \\\\\n",
598 | "3 & 4 \\\\\n",
599 | "\\end{bmatrix}\n",
600 | "$$는 대칭행렬이 아니다. \n",
601 | "\n",
602 | "$$\n",
603 | "\\begin{bmatrix}\n",
604 | "1 & 2 \\\\\n",
605 | "2 & 4 \\\\\n",
606 | "\\end{bmatrix}\n",
607 | "$$는 대칭행렬이다. \n",
608 | "\n",
609 | "\n",
610 | "## 5.5 선형결합의 행렬-벡터 곱셈과 벡터-행렬 곱셈\n",
611 | "\n",
612 | "- 행렬을 벡터로 곱하는 2가지 방법 : 행렬-벡터 곱셈 , 벡터-행렬 곱셈\n",
613 | "- 이에 대한 계산을 선형결합, 도트곱을 사용하여 보여준다.\n",
614 | "\n",
615 | "\n",
616 | "### 5.5.1 선형결합의 행렬-벡터 곱셈\n",
617 | "\n",
618 | "** Definion 5.5.1 ** M을 F상의 R X C 행렬이라 하자. v는 F상의 C-벡터라 하자. 그러면 M * v 는 선형결합이다.\n",
619 | "이 경우, M이 m X n행렬이면 n-벡터 인경우에만 선형결합으로 계산할 수 있다.\n",
620 | "\n",
621 | "** Example 5.5.2: ** 전통적인 행렬을 사용하는 한 예를 고려해 보자.\n",
622 | "\n",
623 | "$$\n",
624 | "\\begin{bmatrix}\n",
625 | "1 & 2 & 3 \\\\\n",
626 | "10 & 20 & 30 \\\\\n",
627 | "\\end{bmatrix}\n",
628 | "* [7,0,4] = 7[1,10] + 0[2,20] + 4[3,30] = [7,70]+[0,0]+[12,120]=[19,190]\n",
629 | "$$ \n",
630 | "\n",
631 | "** Example 5.5.3 :** 행렬에 곱할 수 있는 벡터의 조건은?\n",
632 | "$$\n",
633 | "\\begin{bmatrix}\n",
634 | "1 & 2 & 3 \\\\\n",
635 | "10 & 20 & 30 \\\\\n",
636 | "\\end{bmatrix}\n",
637 | "* [7,0]은 할 수 없다.\n",
638 | "$$\n",
639 | "\n",
640 | "\n",
641 | "** Example 5.5.5 :** Lights Out 퍼즐에 대한 해는 \"버튼 벡터\"들의 선형결합이다. (Example 4.1.9 - p129)\n",
642 | "\n",
643 | "\n",
644 | "### 5.5.2 선형결합의 벡터-행렬 곱셈\n",
645 | "\n",
646 | "\n",
647 | "** definition 5.5.6 ** : M을 R X C 행렬이라 하자. w는 R벡터라 하자. 그러면, w*M은 선형결합니다.\n",
648 | "\n",
649 | "- 행렬과 벡터 사이의 곱은 **교환성**이 성립하지 않는다.\n",
650 | "\n",
651 | "** Example 5.5.7 : **\n",
652 | "\n",
653 | "$$\n",
654 | "[3,4] *\n",
655 | "\\begin{bmatrix}\n",
656 | "1 & 2 & 3 \\\\\n",
657 | "10 & 20 & 30 \\\\\n",
658 | "\\end{bmatrix}\n",
659 | "= 3[1,2,3] + 4[10,20,30] = [3,6,9] + [40,80,120] = [43,86,129]\n",
660 | "$$ \n",
661 | "\n",
662 | "\n",
663 | "** Example 5.5.10 : ** 섹션 4.1.2에서 선형결합의 응용 예 (p 126 ~ 127 참조)"
664 | ]
665 | },
666 | {
667 | "cell_type": "markdown",
668 | "metadata": {},
669 | "source": [
670 | "### 5.5.3 주어진 벡터의 선형결합 표현을 행랼-벡터 곱셈으로 구성하기\n",
671 | "\n",
672 | "- 다음 예는 주어진 벡터를 선형결합으로 표현하는 문제\n",
673 | "\n",
674 | "** Example 5.5.11 :** 섹션 4.1.4의 산업 스파이 문제는 ** x * M = b ** 로 풀 수 있다.\n",
675 | "\n",
676 | "** Example 5.5.12 : ** Example 4.1.9(p129)의 Lights Out 퍼즐 문제"
677 | ]
678 | },
679 | {
680 | "cell_type": "code",
681 | "execution_count": 60,
682 | "metadata": {
683 | "collapsed": false
684 | },
685 | "outputs": [
686 | {
687 | "ename": "NameError",
688 | "evalue": "name 'coldict2mat' is not defined",
689 | "output_type": "error",
690 | "traceback": [
691 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
692 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
693 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mB\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mcoldict2mat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mbutton_vectors\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m5\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
694 | "\u001b[1;31mNameError\u001b[0m: name 'coldict2mat' is not defined"
695 | ]
696 | }
697 | ],
698 | "source": [
699 | "B = coldict2mat(button_vectors(5))"
700 | ]
701 | },
702 | {
703 | "cell_type": "code",
704 | "execution_count": 61,
705 | "metadata": {
706 | "collapsed": false
707 | },
708 | "outputs": [
709 | {
710 | "ename": "NameError",
711 | "evalue": "name 'b' is not defined",
712 | "output_type": "error",
713 | "traceback": [
714 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
715 | "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
716 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0ms\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mVec\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mb\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mD\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;33m{\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m \u001b[0mone\u001b[0m\u001b[1;33m}\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
717 | "\u001b[1;31mNameError\u001b[0m: name 'b' is not defined"
718 | ]
719 | }
720 | ],
721 | "source": [
722 | "s = Vec(b.D, {(2,2): one})"
723 | ]
724 | },
725 | {
726 | "cell_type": "markdown",
727 | "metadata": {},
728 | "source": [
729 | "### 5.5.4 행렬-벡터 방정식의 해 구하기\n",
730 | "\n",
731 | "** Computational Problem 5,5,13 : ** 행렬-벡터 방정식의 해 구하기\n",
732 | "- input : R X C 행렬 A와 R-벡터 b\n",
733 | "- output : A * x = b를 만족하는 C-벡터 x\n",
734 | "\n",
735 | "\n",
736 | "** Example 5.5. 14 :** Example 4.4.13(p 143)에서 Span{[a,b], [c,d]}을 고려하였다.\n",
737 | "\n",
738 | "이 때, 모든 벡터 [p,q]에 대해 다음을 만족하는 계수 α와 β가 있다.\n",
739 | "\n",
740 | "$$[p, q] = α[a,b] + β[c,d] 는 \n",
741 | "\\begin{bmatrix}\n",
742 | "a & c \\\\\n",
743 | "b & d \\\\\n",
744 | "\\end{bmatrix} * [α,β] = [p,q] 와 같다.\n",
745 | "$$\n",
746 | "\n",
747 | "\n",
748 | "** Example 5.5.15 : ** solve(A, b)를 사용하요 산업스파이 문제를 풀어보자.\n",
749 | "\n",
750 | "** Example 5.5.16 : ** Example 5.5.12 (p174), solve(A, b)를 사용하여 가운데 버튼의 불만 켜져 있는 상태에서 시작하여 5 X 5 Lights Out 퍼즐을 풀어 보자.\n",
751 | "\n",
752 | "\n",
753 | "## 5.6 도트곱의 행렬-벡터 곱셈\n",
754 | "\n",
755 | "### 5.6.1 정의\n",
756 | "\n",
757 | "** Definition 5.6.1 **(행렬-벡터 곱셈의 도트곱 정의) 만약 M이 R X C 행렬이고, u는 C-벡터이면, M * u 는 벡터 v이다. 이때, v[r]은 M의 행 r과 u의 도트곱이다.\n",
758 | "\n",
759 | "** Example 5.6.2 :** 행렬-벡터 곱셈을 고려해 보자.\n",
760 | "\n",
761 | "$$\n",
762 | "\\begin{bmatrix}\n",
763 | "1 & 2 \\\\\n",
764 | "3 & 4 \\\\\n",
765 | "10 & 0 \\\\\n",
766 | "\\end{bmatrix} * [3,-1] = [[1,2]•[3,-1], [3,4]•[3,-1], [10,0]•[3,-1]] = [1,5,30]\n",
767 | "$$\n",
768 | "\n",
769 | "\n",
770 | "** Definition 5.6.3 ** (벡터-행렬 곱셈의 도트곱 정의) 만약 M이 R X C 행렬이고, u는 R-벡터이면, u * M 는 벡터 v이다. 이때, v[c]은 u와 M의 열 c의 도트곱이다.\n",
771 | "\n",
772 | "\n",
773 | "\n",
774 | "### 5.6.3 선형방정식들의 시스템을 행렬-벡터 방정식으로 구성하기\n",
775 | "\n",
776 | "** Example 5.6.7 : ** Example 3.9.7(p 98)에서 센서 노드들의 하드웨어 구성 요소들에 대한 전력 소모를 알아보았다. 이 예제의 목적은 각 하드웨어 구성 요소에 대해 그 구성요소가 사용하는 전류를 나타내는 D-벡터를 계산하난 것이다.\n",
777 | "\n",
778 | "- 선형시스템의 해를 구하는 것은 (Computational Problem 3.9.12)은 행렬방정식의 해를 구하는 것(Computational Problem 5.5.13)이 된다.\n",
779 | "\n",
780 | "\n",
781 | "### 5.6.4 삼각시스템(Triangular system)과 삼각행렬(Triangular matrix)\n",
782 | "\n",
783 | "** Example 5.6.8 :** Example 3.11.11(p 113)의 삼각시스템을 행렬-벡타 방정식으로 다시 표현하면 다음과 같다.\n",
784 | "\n",
785 | "$$\n",
786 | "\\begin{bmatrix}\n",
787 | "1 & 0.5 & -2 & 4 \\\\\n",
788 | "0 & 3 & 3 & 2 \\\\\n",
789 | "0 & 0 & 1 & 5 \\\\\n",
790 | "0 & 0 & 0 & 2 \\\\\n",
791 | "\\end{bmatrix} * x = [-8,3,-4,6]\n",
792 | "$$\n",
793 | "\n",
794 | "** Definition 5.6.9 :** n X n 상삼각 (upper-triangular) 행렬 A는 i>j에 대해 Aij = 0인 행렬이다.\n",
795 | "\n",
796 | "** Example 5.6.11 :** {a,b,c} X {@, #, ?} 행렬\n",
797 | "\n",
798 | "$$\n",
799 | "\\begin{array}{c|lcr}\n",
800 | " & \\text{@} & \\text{#} & \\text{?} \\\\\n",
801 | "\\hline\n",
802 | "a & 0 & 2 & 3 \\\\\n",
803 | "b & 10 & 20 & 30 \\\\\n",
804 | "b & 0 & 35 & 0 \\\\\n",
805 | "\\end{array}\n",
806 | "$$ 은 삼각행렬이다. 재정렬하면 다음과 같다.\n",
807 | "\n",
808 | "$$\n",
809 | "\\begin{array}{c|lcr}\n",
810 | " & \\text{@} & \\text{?} & \\text{#} \\\\\n",
811 | "\\hline\n",
812 | "b & 10 & 20 & 30 \\\\\n",
813 | "a & 0 & 3 & 2 \\\\\n",
814 | "b & 0 & 0 & 35 \\\\\n",
815 | "\\end{array}\n",
816 | "$$\n",
817 | "\n",
818 | "\n",
819 | "\n",
820 | "### 5.6.5 행렬-벡터 곱셈의 산술적 성질\n",
821 | "\n",
822 | "행렬-벡터의 도트곱을 이용하여 두 가지 중요한 성질이 있다.\n",
823 | "\n",
824 | "- 임의의 C-벡터 v와 임의의 스칼라 a에 대해 , M * (av) = a(M * v)\n",
825 | "- 임의의 C-벡터 u와 v에 대해, M * (u + v) = M * u + M * v\n",
826 | "\n",
827 | "\n",
828 | "## 5.7 영공간 (Nul l space)\n",
829 | "\n",
830 | "\n",
831 | "\n",
832 | "### 5.7.1 동차 선형시스템과 행렬방정식\n",
833 | "\n",
834 | "- 동차 선형시스템 : 우변의 값들이 모두 0 인 선형방정식들의 시스템이다. A * x = 0\n",
835 | "\n",
836 | "\n",
837 | "** Definition 5.7.1 :** 행렬 A의 영공간은 집합 {u : A * u = 0 } 이다. 이것은 Null A로 나타낸다.\n",
838 | "\n",
839 | "** Example 5.7.2 :** \n",
840 | "\n",
841 | "$$ \\left[\n",
842 | " \\begin{array}{c|c|c}\n",
843 | " 1&4&5\\\\\n",
844 | " 2&5&7\\\\\n",
845 | " 3&6&9\\\\\n",
846 | " \\end{array}\n",
847 | "\\right] $$는 첫 두열의 합이 세번째 열과 동일하므로, A * [1,1,-1]은 영벡터이다. 따라서, [1,1,-1]은 Null A에 속한다.\n",
848 | "\n",
849 | "임의의 α에 대해 A * (α[1,1,-1])도 영벡터이다.\n",
850 | "\n",
851 | "** Lemma 5.7.4 : ** 임의의 R X C행렬 A과 C-벡터 v에 대해 벡터 z가 A의 영공간에 있을 필요충분조선은 ** A * (v + z) = A * v ** 이다.\n",
852 | "\n",
853 | "\n",
854 | "### 5.7.2 행렬-벡터 방정식의 해공간\n",
855 | "\n",
856 | "** Corollary 5.7.5: ** $u_1$ 은 행렬-벡터 방정식 A * x = b 의 해라고 하자. 그러면, $u_2$ 도 또한 해가 될 필요충분조건은 $u_1 - u_2$ 가 A의 영공간에 속하는 것이다.\n",
857 | "\n",
858 | "## 5.8 스파스 (Sparse) 행렬-벡터 곱 계산\n",
859 | "\n",
860 | "** Definition 5.8.1 ** (행렬-벡터 곱셈의 일반적 정의)"
861 | ]
862 | },
863 | {
864 | "cell_type": "code",
865 | "execution_count": null,
866 | "metadata": {
867 | "collapsed": true
868 | },
869 | "outputs": [],
870 | "source": []
871 | }
872 | ],
873 | "metadata": {
874 | "kernelspec": {
875 | "display_name": "Python 2",
876 | "language": "python",
877 | "name": "python2"
878 | },
879 | "language_info": {
880 | "codemirror_mode": {
881 | "name": "ipython",
882 | "version": 2
883 | },
884 | "file_extension": ".py",
885 | "mimetype": "text/x-python",
886 | "name": "python",
887 | "nbconvert_exporter": "python",
888 | "pygments_lexer": "ipython2",
889 | "version": "2.7.8"
890 | }
891 | },
892 | "nbformat": 4,
893 | "nbformat_minor": 0
894 | }
895 |
--------------------------------------------------------------------------------
/시즌1 발표자료 저장공간/Collection of References.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌1 발표자료 저장공간/Collection of References.docx
--------------------------------------------------------------------------------
/시즌1 발표자료 저장공간/ch13_박정은/ch13_eigenvector_수정.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌1 발표자료 저장공간/ch13_박정은/ch13_eigenvector_수정.pdf
--------------------------------------------------------------------------------
/시즌1 발표자료 저장공간/직교화-복작복잡.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌1 발표자료 저장공간/직교화-복작복잡.pdf
--------------------------------------------------------------------------------
/시즌2 발표자료 저장소/06-slides.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌2 발표자료 저장소/06-slides.pdf
--------------------------------------------------------------------------------
/시즌2 발표자료 저장소/10M_CLASS_2015_AssortativityHierarchy-PartI.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌2 발표자료 저장소/10M_CLASS_2015_AssortativityHierarchy-PartI.pptx
--------------------------------------------------------------------------------
/시즌2 발표자료 저장소/10매개변수.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌2 발표자료 저장소/10매개변수.pdf
--------------------------------------------------------------------------------
/시즌2 발표자료 저장소/151128_ch03_RandomNetworks/ch03_RandomNetwork.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌2 발표자료 저장소/151128_ch03_RandomNetworks/ch03_RandomNetwork.pdf
--------------------------------------------------------------------------------
/시즌2 발표자료 저장소/160116_무한수열과 무한급수.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌2 발표자료 저장소/160116_무한수열과 무한급수.pdf
--------------------------------------------------------------------------------
/시즌2 발표자료 저장소/160123_Intro to LIS_Retrieval.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌2 발표자료 저장소/160123_Intro to LIS_Retrieval.pdf
--------------------------------------------------------------------------------
/시즌2 발표자료 저장소/160130_박정은_network_ch09_communities/박정은_ch09_communities_01.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌2 발표자료 저장소/160130_박정은_network_ch09_communities/박정은_ch09_communities_01.pdf
--------------------------------------------------------------------------------
/시즌2 발표자료 저장소/160130_박정은_network_ch09_communities/박정은_ch09_communities_02.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌2 발표자료 저장소/160130_박정은_network_ch09_communities/박정은_ch09_communities_02.pdf
--------------------------------------------------------------------------------
/시즌2 발표자료 저장소/네크워크 인토로/01-slides.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌2 발표자료 저장소/네크워크 인토로/01-slides.pdf
--------------------------------------------------------------------------------
/시즌2 발표자료 저장소/복잡복잡스핀_역지수로그역삼각.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌2 발표자료 저장소/복잡복잡스핀_역지수로그역삼각.pptx
--------------------------------------------------------------------------------
/시즌2 발표자료 저장소/칸아카데미 정보이론/infomation_theory_ancient_송치성.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌2 발표자료 저장소/칸아카데미 정보이론/infomation_theory_ancient_송치성.pdf
--------------------------------------------------------------------------------
/시즌2 발표자료 저장소/칸아카데미 정보이론/infomation_theory_modern_송치성.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌2 발표자료 저장소/칸아카데미 정보이론/infomation_theory_modern_송치성.pdf
--------------------------------------------------------------------------------
/시즌3 발표자료 저장소/JupyterNote/ComputationalPhysics(1).html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌3 발표자료 저장소/JupyterNote/ComputationalPhysics(1).html
--------------------------------------------------------------------------------
/시즌3 발표자료 저장소/JupyterNote/ComputationalPhysics.html:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌3 발표자료 저장소/JupyterNote/ComputationalPhysics.html
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/11 machine learning/.ipynb_checkpoints/11 machine learning-checkpoint.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {
6 | "collapsed": false
7 | },
8 | "source": [
9 | "# 11 기계학습 "
10 | ]
11 | },
12 | {
13 | "cell_type": "markdown",
14 | "metadata": {},
15 | "source": [
16 | "## 11.1 모델링"
17 | ]
18 | },
19 | {
20 | "cell_type": "markdown",
21 | "metadata": {},
22 | "source": [
23 | "모델이란? 모델은 다양한 변수 간의 수학적(혹은 확률적) 관계를 표현한 것이다. \n",
24 | "\n",
25 | "\n",
26 | "예) 소셜 네트워킹을 이용한 수익을 창출하고자 할 때 사용자의 수나 사용자 당 광고 수익 혹은 직원 수 같은 입력 변수로 \n",
27 | "\n",
28 | "차후 몇 년 동안의 연간 수익을 예측하는 비즈니스 모델을 만들곤 한다. \n",
29 | "\n",
30 | "요리책의 경우 먹는 사람의 수나 배고픈 정도 같은 입력 변수로 재료의 양을 결정하는 모델을 사용한다. "
31 | ]
32 | },
33 | {
34 | "cell_type": "markdown",
35 | "metadata": {},
36 | "source": [
37 | "## 11.2 기계학습이란?"
38 | ]
39 | },
40 | {
41 | "cell_type": "markdown",
42 | "metadata": {},
43 | "source": [
44 | "데이터를 통해 모델을 만들고 사용하는 것으로 학습에 사용될 데이터의 정답이 포함되어 있는 지도 학습과 포함되어 있지 않은 비지도 학습을 살펴볼 것이다. \n",
45 | "\n",
46 | "많이 사용하는 분야\n",
47 | "\n",
48 | "이메일이 스팸메일인지 아닌지\n",
49 | "\n",
50 | "신용카드 사기 예측\n",
51 | "\n",
52 | "쇼핑 고객이 클릭할 확률이 높은 광고 예측\n",
53 | "\n",
54 | "슈퍼볼에서 우승할 미식 축구팀 예측\n",
55 | "\n",
56 | "아주 단순한 상황에서도 우리가 사용할 수 있는 모델은 무수히 많다. 일반적으로는 파라미터가 있는 모델을 고른 후 데이터를 통해 파라미터의 최적값을 찾으려고 한다. \n",
57 | "\n",
58 | "예) 키와 몸무게는 선형함수로\n",
59 | " 환자의 병은 의사결정나무로 \n"
60 | ]
61 | },
62 | {
63 | "cell_type": "markdown",
64 | "metadata": {},
65 | "source": [
66 | "## 오버피팅과 언더피팅 "
67 | ]
68 | },
69 | {
70 | "cell_type": "markdown",
71 | "metadata": {
72 | "collapsed": true
73 | },
74 | "source": [
75 | "기계학습의 일반적인 문제는 오버피팅이다. 오버피팅이란 만들어진 모델의 성능이 학습 데이터에서는 좋지만 기존에 관측한 적이 없는 새로운 데이터에서는 좋지 않은 경우를 의미한다. \n",
76 | "\n",
77 | "이러한 현상은 데이터의 잡음까지 학습되거나 원하는 결과를 예측해 주는 요소가 아닌 요소들이 학습되기 때문에 발생한다. \n",
78 | "\n",
79 | "언터피팅은 보통 모델의 성능이 학습 데이터에서도 좋지 않은 경우를 의미한다. 보통 언더피팅이 발생하면 해당 모델은 문제에 적합하지 않다는 것을 의미하며 새로운 모델을 찾아봐야 한다. "
80 | ]
81 | },
82 | {
83 | "cell_type": "markdown",
84 | "metadata": {
85 | "collapsed": true
86 | },
87 | "source": [
88 | "
"
89 | ]
90 | },
91 | {
92 | "cell_type": "markdown",
93 | "metadata": {
94 | "collapsed": true
95 | },
96 | "source": [
97 | "파란색 가로줄은 degree가 0인 다항 함수(상수 함수) 중 표본 데이터에 가장 적합한 함수를 나타낸다. \n",
98 | "\n",
99 | "학습 데이터에 상수 함수를 적용하면 심각한 언더피팅이 발생.\n",
100 | "\n",
101 | "빨간색 표본 데이터에 가장 적합한 빨간색 9차 함수(파라미터10개)는 정확하게 모든 학습 데이터를 통과하지지만 심각한 오버피팅이 발생\n",
102 | "\n",
103 | "초록색이 가장 적합"
104 | ]
105 | },
106 | {
107 | "cell_type": "markdown",
108 | "metadata": {
109 | "collapsed": true
110 | },
111 | "source": [
112 | "가장 적합한 방법은 모델을 나누는 것이다. 예를 들어 전체 데이터의 2/3로 모델을 학습시키고 나머지 1/3로 모델의 성능을 평가한다. "
113 | ]
114 | },
115 | {
116 | "cell_type": "code",
117 | "execution_count": 3,
118 | "metadata": {
119 | "collapsed": true
120 | },
121 | "outputs": [],
122 | "source": [
123 | "# data splitting \n",
124 | "from collections import Counter\n",
125 | "import math, random\n",
126 | "\n",
127 | "def split_data(data, prob):\n",
128 | " \"\"\"split data into fractions [prob, 1 - prob]\"\"\"\n",
129 | " results = [], []\n",
130 | " for row in data:\n",
131 | " results[0 if random.random() < prob else 1].append(row)\n",
132 | " return results\n",
133 | "\n",
134 | " "
135 | ]
136 | },
137 | {
138 | "cell_type": "markdown",
139 | "metadata": {
140 | "collapsed": true
141 | },
142 | "source": [
143 | "대부분의 경우 입력 변수로 행렬 x 출력 변수로 벡터 y가 주어질 것이다. 이 때 traning data나 test data에 x나 y가 쌍을 이뤄서 들어갈 수 있도록 해야 한다. "
144 | ]
145 | },
146 | {
147 | "cell_type": "code",
148 | "execution_count": 4,
149 | "metadata": {
150 | "collapsed": true
151 | },
152 | "outputs": [],
153 | "source": [
154 | "def train_test_split(x, y, test_pct):\n",
155 | " data = list(zip(x, y)) # pair corresponding values\n",
156 | " train, test = split_data(data, 1 - test_pct) # split the dataset of pairs\n",
157 | " x_train, y_train = list(zip(*train)) # magical un-zip trick\n",
158 | " x_test, y_test = list(zip(*test))\n",
159 | " return x_train, x_test, y_train, y_test "
160 | ]
161 | },
162 | {
163 | "cell_type": "markdown",
164 | "metadata": {},
165 | "source": [
166 | "이 때 다음과 같이 모델을 학습하고 성능을 평가할 수 있다. "
167 | ]
168 | },
169 | {
170 | "cell_type": "markdown",
171 | "metadata": {},
172 | "source": [
173 | "model = somekindofModel()\n",
174 | "x_train, y_train, x_test, y_test = train_test_split(xs, ys, 0.33)\n",
175 | "performance = model.test(x_test, y_test)"
176 | ]
177 | },
178 | {
179 | "cell_type": "markdown",
180 | "metadata": {},
181 | "source": [
182 | "만약 모델이 학습 데이터에서 오버피팅됐다면 (왁벽히 별개인) 평가 데이터에서 모델의 성능은 좋지 않을 것이다. \n",
183 | "== 평가 데이터에 대한 성능이 좋은 모델은 오버피팅되지 않았다고 볼 수 있다. "
184 | ]
185 | },
186 | {
187 | "cell_type": "markdown",
188 | "metadata": {
189 | "collapsed": true
190 | },
191 | "source": [
192 | "1.1.4 정확도 "
193 | ]
194 | },
195 | {
196 | "cell_type": "markdown",
197 | "metadata": {
198 | "collapsed": true
199 | },
200 | "source": [
201 | "이 메일은 스팸 메일인가? 저 지원자를 채용해야 하는가에 대한 모델을 만든다고 할 때 4가지 가능성이 있다. "
202 | ]
203 | },
204 | {
205 | "cell_type": "markdown",
206 | "metadata": {},
207 | "source": [
208 | "
"
209 | ]
210 | },
211 | {
212 | "cell_type": "markdown",
213 | "metadata": {
214 | "collapsed": true
215 | },
216 | "source": [
217 | "
"
218 | ]
219 | },
220 | {
221 | "cell_type": "markdown",
222 | "metadata": {
223 | "collapsed": true
224 | },
225 | "source": [
226 | "출처:http://www.nature.com/nrneph/journal/v10/n4/fig_tab/nrneph.2013.281_F1.html"
227 | ]
228 | },
229 | {
230 | "cell_type": "markdown",
231 | "metadata": {
232 | "collapsed": true
233 | },
234 | "source": [
235 | "이름이 LUke인 아이가 백혈병이 걸릴 확률을 계산해 보자. "
236 | ]
237 | },
238 | {
239 | "cell_type": "markdown",
240 | "metadata": {},
241 | "source": [
242 | "Confusion table을 이용하여 백혈병에 걸릴 확률을 생각해 보자. 최근 동향을 보면 신생아 천명 중 5명에게 Luke라는 이름을 지어준다. \n",
243 | "\n",
244 | "그리고 사람이 살면서 백혈병에 걸릴 확률은 1.4%이므로 14명이 백혈병에 걸린다. \n",
245 | "\n",
246 | "만약에 이 두 가지 요소가 독립적이라고 가정하고 가정하고 \n",
247 | "\n",
248 | "루크라는 이름을 가진 사람은 백혈병에 걸린다라는 판독 방법을 백만명에게 다음과 같은 혼동행렬을 얻을 수 있다. "
249 | ]
250 | },
251 | {
252 | "cell_type": "markdown",
253 | "metadata": {},
254 | "source": [
255 | "
"
256 | ]
257 | },
258 | {
259 | "cell_type": "markdown",
260 | "metadata": {},
261 | "source": [
262 | "이제 이 혼동행렬을 사용해서 모델의 성능에 대한 다양한 지표를 계산할 수 있다. \n",
263 | "\n",
264 | "예) 정확한 예측의 비율을 의미하는 정확도를 다음과 같이 계산할 수 있다 "
265 | ]
266 | },
267 | {
268 | "cell_type": "code",
269 | "execution_count": null,
270 | "metadata": {
271 | "collapsed": true
272 | },
273 | "outputs": [],
274 | "source": []
275 | },
276 | {
277 | "cell_type": "code",
278 | "execution_count": null,
279 | "metadata": {
280 | "collapsed": true
281 | },
282 | "outputs": [],
283 | "source": []
284 | },
285 | {
286 | "cell_type": "code",
287 | "execution_count": null,
288 | "metadata": {
289 | "collapsed": true
290 | },
291 | "outputs": [],
292 | "source": [
293 | "# correctness\n",
294 | "def accuracy(tp, fp, fn, tn):\n",
295 | " correct = tp + tn\n",
296 | " total = tp + fp + fn + tn\n",
297 | " return correct / total"
298 | ]
299 | },
300 | {
301 | "cell_type": "markdown",
302 | "metadata": {},
303 | "source": []
304 | },
305 | {
306 | "cell_type": "code",
307 | "execution_count": null,
308 | "metadata": {
309 | "collapsed": true
310 | },
311 | "outputs": [],
312 | "source": []
313 | },
314 | {
315 | "cell_type": "code",
316 | "execution_count": 2,
317 | "metadata": {
318 | "collapsed": false
319 | },
320 | "outputs": [
321 | {
322 | "ename": "SyntaxError",
323 | "evalue": "'return' outside function (, line 49)",
324 | "output_type": "error",
325 | "traceback": [
326 | "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m49\u001b[0m\n\u001b[0;31m return results\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m 'return' outside function\n"
327 | ]
328 | }
329 | ],
330 | "source": [
331 | "\n",
332 | "\n",
333 | "def precision(tp, fp, fn, tn):\n",
334 | " return tp / (tp + fp)\n",
335 | "\n",
336 | "def recall(tp, fp, fn, tn):\n",
337 | " return tp / (tp + fn)\n",
338 | "\n",
339 | "def f1_score(tp, fp, fn, tn):\n",
340 | " p = precision(tp, fp, fn, tn)\n",
341 | " r = recall(tp, fp, fn, tn)\n",
342 | "\n",
343 | " return 2 * p * r / (p + r)\n",
344 | "\n",
345 | "if __name__ == \"__main__\":\n",
346 | "\n",
347 | " print(\"accuracy(70, 4930, 13930, 981070)\", accuracy(70, 4930, 13930, 981070))\n",
348 | " print(\"precision(70, 4930, 13930, 981070)\", precision(70, 4930, 13930, 981070))\n",
349 | " print(\"recall(70, 4930, 13930, 981070)\", recall(70, 4930, 13930, 981070))\n",
350 | " print(\"f1_score(70, 4930, 13930, 981070)\", f1_score(70, 4930, 13930, 981070))\n",
351 | " return results"
352 | ]
353 | },
354 | {
355 | "cell_type": "code",
356 | "execution_count": null,
357 | "metadata": {
358 | "collapsed": true
359 | },
360 | "outputs": [],
361 | "source": []
362 | },
363 | {
364 | "cell_type": "code",
365 | "execution_count": null,
366 | "metadata": {
367 | "collapsed": true
368 | },
369 | "outputs": [],
370 | "source": []
371 | }
372 | ],
373 | "metadata": {
374 | "anaconda-cloud": {},
375 | "kernelspec": {
376 | "display_name": "Python [Root]",
377 | "language": "python",
378 | "name": "Python [Root]"
379 | },
380 | "language_info": {
381 | "codemirror_mode": {
382 | "name": "ipython",
383 | "version": 2
384 | },
385 | "file_extension": ".py",
386 | "mimetype": "text/x-python",
387 | "name": "python",
388 | "nbconvert_exporter": "python",
389 | "pygments_lexer": "ipython2",
390 | "version": "2.7.12"
391 | }
392 | },
393 | "nbformat": 4,
394 | "nbformat_minor": 0
395 | }
396 |
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/11 machine learning/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/11 machine learning/1.png
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/11 machine learning/11 machine learning.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {
6 | "collapsed": false
7 | },
8 | "source": [
9 | "# 11 기계학습 "
10 | ]
11 | },
12 | {
13 | "cell_type": "markdown",
14 | "metadata": {},
15 | "source": [
16 | "## 11.1 모델링"
17 | ]
18 | },
19 | {
20 | "cell_type": "markdown",
21 | "metadata": {},
22 | "source": [
23 | "모델이란? 모델은 다양한 변수 간의 수학적(혹은 확률적) 관계를 표현한 것이다. \n",
24 | "\n",
25 | "\n",
26 | "예) 소셜 네트워킹을 이용한 수익을 창출하고자 할 때 사용자의 수나 사용자 당 광고 수익 혹은 직원 수 같은 입력 변수로 \n",
27 | "\n",
28 | "차후 몇 년 동안의 연간 수익을 예측하는 비즈니스 모델을 만들곤 한다. \n",
29 | "\n",
30 | "요리책의 경우 먹는 사람의 수나 배고픈 정도 같은 입력 변수로 재료의 양을 결정하는 모델을 사용한다. "
31 | ]
32 | },
33 | {
34 | "cell_type": "markdown",
35 | "metadata": {},
36 | "source": [
37 | "## 11.2 기계학습이란?"
38 | ]
39 | },
40 | {
41 | "cell_type": "markdown",
42 | "metadata": {},
43 | "source": [
44 | "데이터를 통해 모델을 만들고 사용하는 것으로 학습에 사용될 데이터의 정답이 포함되어 있는 지도 학습과 포함되어 있지 않은 비지도 학습을 살펴볼 것이다. \n",
45 | "\n",
46 | "많이 사용하는 분야\n",
47 | "\n",
48 | "이메일이 스팸메일인지 아닌지\n",
49 | "\n",
50 | "신용카드 사기 예측\n",
51 | "\n",
52 | "쇼핑 고객이 클릭할 확률이 높은 광고 예측\n",
53 | "\n",
54 | "슈퍼볼에서 우승할 미식 축구팀 예측\n",
55 | "\n",
56 | "아주 단순한 상황에서도 우리가 사용할 수 있는 모델은 무수히 많다. 일반적으로는 파라미터가 있는 모델을 고른 후 데이터를 통해 파라미터의 최적값을 찾으려고 한다. \n",
57 | "\n",
58 | "예) 키와 몸무게는 선형함수로\n",
59 | " 환자의 병은 의사결정나무로 \n"
60 | ]
61 | },
62 | {
63 | "cell_type": "markdown",
64 | "metadata": {},
65 | "source": [
66 | "## 오버피팅과 언더피팅 "
67 | ]
68 | },
69 | {
70 | "cell_type": "markdown",
71 | "metadata": {
72 | "collapsed": true
73 | },
74 | "source": [
75 | "기계학습의 일반적인 문제는 오버피팅이다. 오버피팅이란 만들어진 모델의 성능이 학습 데이터에서는 좋지만 기존에 관측한 적이 없는 새로운 데이터에서는 좋지 않은 경우를 의미한다. \n",
76 | "\n",
77 | "이러한 현상은 데이터의 잡음까지 학습되거나 원하는 결과를 예측해 주는 요소가 아닌 요소들이 학습되기 때문에 발생한다. \n",
78 | "\n",
79 | "언터피팅은 보통 모델의 성능이 학습 데이터에서도 좋지 않은 경우를 의미한다. 보통 언더피팅이 발생하면 해당 모델은 문제에 적합하지 않다는 것을 의미하며 새로운 모델을 찾아봐야 한다. "
80 | ]
81 | },
82 | {
83 | "cell_type": "markdown",
84 | "metadata": {
85 | "collapsed": true
86 | },
87 | "source": [
88 | "
"
89 | ]
90 | },
91 | {
92 | "cell_type": "markdown",
93 | "metadata": {
94 | "collapsed": true
95 | },
96 | "source": [
97 | "파란색 가로줄은 degree가 0인 다항 함수(상수 함수) 중 표본 데이터에 가장 적합한 함수를 나타낸다. \n",
98 | "\n",
99 | "학습 데이터에 상수 함수를 적용하면 심각한 언더피팅이 발생.\n",
100 | "\n",
101 | "빨간색 표본 데이터에 가장 적합한 빨간색 9차 함수(파라미터10개)는 정확하게 모든 학습 데이터를 통과하지지만 심각한 오버피팅이 발생\n",
102 | "\n",
103 | "초록색이 가장 적합"
104 | ]
105 | },
106 | {
107 | "cell_type": "markdown",
108 | "metadata": {
109 | "collapsed": true
110 | },
111 | "source": [
112 | "가장 적합한 방법은 모델을 나누는 것이다. 예를 들어 전체 데이터의 2/3로 모델을 학습시키고 나머지 1/3로 모델의 성능을 평가한다. "
113 | ]
114 | },
115 | {
116 | "cell_type": "code",
117 | "execution_count": 17,
118 | "metadata": {
119 | "collapsed": true
120 | },
121 | "outputs": [],
122 | "source": [
123 | "# data splitting \n",
124 | "from collections import Counter\n",
125 | "import math, random\n",
126 | "\n",
127 | "def split_data(data, prob):\n",
128 | " \"\"\"split data into fractions [prob, 1 - prob]\"\"\"\n",
129 | " results = [], []\n",
130 | " for row in data:\n",
131 | " results[0 if random.random() < prob else 1].append(row)\n",
132 | " return results\n",
133 | "\n",
134 | " "
135 | ]
136 | },
137 | {
138 | "cell_type": "markdown",
139 | "metadata": {
140 | "collapsed": true
141 | },
142 | "source": [
143 | "대부분의 경우 입력 변수로 행렬 x 출력 변수로 벡터 y가 주어질 것이다. 이 때 traning data나 test data에 x나 y가 쌍을 이뤄서 들어갈 수 있도록 해야 한다. "
144 | ]
145 | },
146 | {
147 | "cell_type": "code",
148 | "execution_count": 18,
149 | "metadata": {
150 | "collapsed": true
151 | },
152 | "outputs": [],
153 | "source": [
154 | "def train_test_split(x, y, test_pct):\n",
155 | " data = list(zip(x, y)) # pair corresponding values\n",
156 | " train, test = split_data(data, 1 - test_pct) # split the dataset of pairs\n",
157 | " x_train, y_train = list(zip(*train)) # magical un-zip trick\n",
158 | " x_test, y_test = list(zip(*test))\n",
159 | " return x_train, x_test, y_train, y_test "
160 | ]
161 | },
162 | {
163 | "cell_type": "markdown",
164 | "metadata": {},
165 | "source": [
166 | "이 때 다음과 같이 모델을 학습하고 성능을 평가할 수 있다. "
167 | ]
168 | },
169 | {
170 | "cell_type": "markdown",
171 | "metadata": {},
172 | "source": [
173 | "만약 모델이 학습 데이터에서 오버피팅됐다면 (왁벽히 별개인) 평가 데이터에서 모델의 성능은 좋지 않을 것이다. \n",
174 | "== 평가 데이터에 대한 성능이 좋은 모델은 오버피팅되지 않았다고 볼 수 있다. "
175 | ]
176 | },
177 | {
178 | "cell_type": "markdown",
179 | "metadata": {
180 | "collapsed": true
181 | },
182 | "source": [
183 | "## 1.1.4 정확도 "
184 | ]
185 | },
186 | {
187 | "cell_type": "markdown",
188 | "metadata": {
189 | "collapsed": true
190 | },
191 | "source": [
192 | "이 메일은 스팸 메일인가? 저 지원자를 채용해야 하는가에 대한 모델을 만든다고 할 때 4가지 가능성이 있다. "
193 | ]
194 | },
195 | {
196 | "cell_type": "markdown",
197 | "metadata": {},
198 | "source": [
199 | "
"
200 | ]
201 | },
202 | {
203 | "cell_type": "markdown",
204 | "metadata": {
205 | "collapsed": true
206 | },
207 | "source": [
208 | "
"
209 | ]
210 | },
211 | {
212 | "cell_type": "markdown",
213 | "metadata": {
214 | "collapsed": true
215 | },
216 | "source": [
217 | "출처:http://www.nature.com/nrneph/journal/v10/n4/fig_tab/nrneph.2013.281_F1.html"
218 | ]
219 | },
220 | {
221 | "cell_type": "markdown",
222 | "metadata": {
223 | "collapsed": true
224 | },
225 | "source": [
226 | "이름이 Luke인 아이가 백혈병이 걸릴 확률을 계산해 보자. "
227 | ]
228 | },
229 | {
230 | "cell_type": "markdown",
231 | "metadata": {},
232 | "source": [
233 | "Confusion table을 이용하여 백혈병에 걸릴 확률을 생각해 보자. 최근 동향을 보면 신생아 천명 중 5명에게 Luke라는 이름을 지어준다. \n",
234 | "\n",
235 | "그리고 사람이 살면서 백혈병에 걸릴 확률은 1.4%이므로 14명이 백혈병에 걸린다. \n",
236 | "\n",
237 | "만약에 이 두 가지 요소가 독립적이라고 가정하고 가정하고 \n",
238 | "\n",
239 | "루크라는 이름을 가진 사람은 백혈병에 걸린다라는 판독 방법을 백만명에게 다음과 같은 혼동행렬을 얻을 수 있다. "
240 | ]
241 | },
242 | {
243 | "cell_type": "markdown",
244 | "metadata": {},
245 | "source": [
246 | "
"
247 | ]
248 | },
249 | {
250 | "cell_type": "markdown",
251 | "metadata": {},
252 | "source": [
253 | "이제 이 혼동행렬을 사용해서 모델의 성능에 대한 다양한 지표를 계산할 수 있다. \n",
254 | "\n",
255 | "예) 정확한 예측의 비율을 의미하는 정확도를 다음과 같이 계산할 수 있다 "
256 | ]
257 | },
258 | {
259 | "cell_type": "code",
260 | "execution_count": 19,
261 | "metadata": {
262 | "collapsed": true
263 | },
264 | "outputs": [],
265 | "source": [
266 | "# correctness\n",
267 | "def accuracy(tp, fp, fn, tn):\n",
268 | " correct = tp + tn\n",
269 | " total = tp + fp + fn + tn\n",
270 | " return correct / total\n"
271 | ]
272 | },
273 | {
274 | "cell_type": "code",
275 | "execution_count": 20,
276 | "metadata": {
277 | "collapsed": false
278 | },
279 | "outputs": [
280 | {
281 | "name": "stdout",
282 | "output_type": "stream",
283 | "text": [
284 | "('accuracy(70, 4930, 13930, 981070)', 0)\n"
285 | ]
286 | }
287 | ],
288 | "source": [
289 | "print(\"accuracy(70, 4930, 13930, 981070)\", accuracy(70, 4930, 13930, 981070))"
290 | ]
291 | },
292 | {
293 | "cell_type": "markdown",
294 | "metadata": {},
295 | "source": [
296 | "#0.98114"
297 | ]
298 | },
299 | {
300 | "cell_type": "markdown",
301 | "metadata": {},
302 | "source": [
303 | "상당히 높은 정확도로 계산되었다. 하지만 이 판독 방법은 확실히 좋은 방법이 아니기 때문에 계산된 결과에 크게 신경쓰지 말자. \n",
304 | "보통 모델의 성능을 평가하기 위해 정밀도(precision)와 재현율(recall)을 사용한다. 정밀도는 양성으로 예측된 결과의 정확도를 의미한다. "
305 | ]
306 | },
307 | {
308 | "cell_type": "code",
309 | "execution_count": 21,
310 | "metadata": {
311 | "collapsed": false
312 | },
313 | "outputs": [
314 | {
315 | "name": "stdout",
316 | "output_type": "stream",
317 | "text": [
318 | "('precision(70, 4930, 13930, 981070)', 0)\n"
319 | ]
320 | }
321 | ],
322 | "source": [
323 | "def precision(tp, fp, fn, tn):\n",
324 | " return tp / (tp + fp)\n",
325 | "\n",
326 | "print(\"precision(70, 4930, 13930, 981070)\", precision(70, 4930, 13930, 981070))\n",
327 | "\n"
328 | ]
329 | },
330 | {
331 | "cell_type": "markdown",
332 | "metadata": {},
333 | "source": [
334 | "#0.014"
335 | ]
336 | },
337 | {
338 | "cell_type": "markdown",
339 | "metadata": {},
340 | "source": [
341 | "그리고 재현율은 실제 양성 중 모델이 정확하게 양성으로 예측한 비율을 의미한다. "
342 | ]
343 | },
344 | {
345 | "cell_type": "code",
346 | "execution_count": 22,
347 | "metadata": {
348 | "collapsed": false
349 | },
350 | "outputs": [
351 | {
352 | "name": "stdout",
353 | "output_type": "stream",
354 | "text": [
355 | "('recall(70, 4930, 13930, 981070)', 0)\n"
356 | ]
357 | }
358 | ],
359 | "source": [
360 | "def recall(tp, fp, fn, tn):\n",
361 | " return tp / (tp + fn)\n",
362 | "\n",
363 | "print(\"recall(70, 4930, 13930, 981070)\", recall(70, 4930, 13930, 981070))"
364 | ]
365 | },
366 | {
367 | "cell_type": "markdown",
368 | "metadata": {},
369 | "source": [
370 | "#0.005"
371 | ]
372 | },
373 | {
374 | "cell_type": "markdown",
375 | "metadata": {},
376 | "source": [
377 | "정밀도와 재현율이 굉장히 낮은 것을 확인할 수 있으며 이 결과로 판독 방법이 형편없다는 것을 알 수 있다. \n",
378 | "\n",
379 | "때로는 정밀도와 재현율을 결합해서 다음과 같이 정의된 다음과 같이 정의된 F1점수를 사용하기도 한다. "
380 | ]
381 | },
382 | {
383 | "cell_type": "code",
384 | "execution_count": 23,
385 | "metadata": {
386 | "collapsed": false
387 | },
388 | "outputs": [
389 | {
390 | "ename": "IndentationError",
391 | "evalue": "expected an indented block (, line 9)",
392 | "output_type": "error",
393 | "traceback": [
394 | "\u001b[0;36m File \u001b[0;32m\"\"\u001b[0;36m, line \u001b[0;32m9\u001b[0m\n\u001b[0;31m print(\"f1_score(70, 4930, 13930, 981070)\", f1_score(70, 4930, 13930, 981070))\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mIndentationError\u001b[0m\u001b[0;31m:\u001b[0m expected an indented block\n"
395 | ]
396 | }
397 | ],
398 | "source": [
399 | "def f1_score(tp, fp, fn, tn):\n",
400 | " p = precision(tp, fp, fn, tn)\n",
401 | " r = recall(tp, fp, fn, tn)\n",
402 | "\n",
403 | " return 2 * p * r / (p + r)\n",
404 | "\n",
405 | "if __name__ == \"__main__\":\n",
406 | " \n",
407 | "print(\"f1_score(70, 4930, 13930, 981070)\", f1_score(70, 4930, 13930, 981070))\n",
408 | " \n",
409 | " \n",
410 | " "
411 | ]
412 | },
413 | {
414 | "cell_type": "markdown",
415 | "metadata": {
416 | "collapsed": true
417 | },
418 | "source": [
419 | "\n",
420 | "## 11.5 Bias-variance 트레이드오프\n"
421 | ]
422 | },
423 | {
424 | "cell_type": "markdown",
425 | "metadata": {},
426 | "source": [
427 | "만약 모델의 bias가 매우 심하다면, 새로은 변수를 추가하는 것도 하나의 해결책일 것이다. \n",
428 | "\n",
429 | "11.3오버피팅과 언더피팅에서 봤듯이 상수 함수를 1차 함수로 바꾸면 모델의 성능이 상당히 개선되는 것을 확인할 수 있었다. \n",
430 | "\n",
431 | "반대로 모델의 variance 이 너무 높다면 모델의 변수를 줄이거나 더 많은 데이터를 구해서 모델을 다시 학습시키면 된다. \n",
432 | "\n",
433 | "반대로 모델의 variance 가 너무 높다면 모델의 변수를 줄이거나 (가능하다면) 더 많은 데이터를 구해서 모델을 다시 학습시키면 된다. \n"
434 | ]
435 | },
436 | {
437 | "cell_type": "markdown",
438 | "metadata": {},
439 | "source": [
440 | "오버피팅 문제는 편향(Bias)과 분산(variance)의 트레이드오프로 볼 수도 있다. \n",
441 | "\n",
442 | "두 수치는 모두 모델을 더 큰 모집단에서 추출한 다양한 학습 데이터로 모델을 다시 학습시키면 어떠한 변화가 발생하는지 설명해 준다.\n",
443 | "\n",
444 | "예를 들어 11.3 오버피팅과 언더피팅에서 다루었던 상수 함수는 거의 모든 학습 데이터에서 큰 오류를 범할 것이다.\n",
445 | "\n",
446 | "즉 상수 함수가 상당히 bias가 되었다고 볼 수 있다. 하지만 임의의 두 학습 데이터에서는 비슷한 모델이 만들어질 것이다. \n",
447 | "\n",
448 | "즉, variance는 낮다는 것을 의미한다. Bias가 높고 variance가 낮다면 언더피팅을 의미한다. "
449 | ]
450 | },
451 | {
452 | "cell_type": "markdown",
453 | "metadata": {},
454 | "source": [
455 | "만약 모델의 Bias가 매우 심하다면(즉 학습 데이터에서도 모델의 성능이 좋지 않다면) 새로운 변수를 추가하는 것도 하나의 해결책일 것이다. \n",
456 | "\n",
457 | "오버피팅와 언더피팅에서 보았듯이 상수 함수를 1차 함수로 바꾸면 모델의 성능이 상당히 개선되는 것을 확인할 수 있었다. \n",
458 | "\n",
459 | "반대로 모델의 variance이 너무 높다면 모델의 변수를 줄이거나 더 많은 데이터를 구해서 모델을 다시 학습시키면 된다."
460 | ]
461 | },
462 | {
463 | "cell_type": "markdown",
464 | "metadata": {},
465 | "source": [
466 | "그림11-2는 9차 함수를 데이터 개수가 다른 다양한 학습 데이터로 학습시킨 결과를 보여 주고 있다. \n",
467 | "\n",
468 | "이전에 살펴봤던 것처럼 10개의 데이터로 학습된 함수는 굴곡이 심한 것을 확인할 수 있다. \n",
469 | "\n",
470 | "하지만 100개의 데이터로 학습된 함수의 경우 오버피팅이 감소한 것을 확인할 수 있으면 \n",
471 | "\n",
472 | "1,000개의 데이터로 학습된 함수는 거의 1차 함수의 모양과 동일하다는 것을 알 수 있다. "
473 | ]
474 | },
475 | {
476 | "cell_type": "markdown",
477 | "metadata": {},
478 | "source": [
479 | "
"
480 | ]
481 | },
482 | {
483 | "cell_type": "markdown",
484 | "metadata": {},
485 | "source": [
486 | "모델의 복잡성이 동일한 상태에서 데이터가 더욱 많아진다면 모델을 데이터에 오버피팅시키는 것은 더욱 더 어려워진다. \n",
487 | "\n",
488 | "반대로 데이터의 수가 늘어나도 bias는 줄어들지 않는다. \n",
489 | "\n",
490 | "만약 데이터의 패턴을 잡아내기에 모델의 특징이 부족하다면 아무리 많은 데이터를 추가해도 도움이 되지 않는다. \n"
491 | ]
492 | },
493 | {
494 | "cell_type": "markdown",
495 | "metadata": {},
496 | "source": [
497 | "## 11.6 특성 추출 및 선택"
498 | ]
499 | },
500 | {
501 | "cell_type": "markdown",
502 | "metadata": {},
503 | "source": [
504 | "데이터의 특성이란 모델의 모든 입력 변수를 의미한다. \n",
505 | "\n",
506 | "예) 사람의 경력으로 연봉을 예측하고 싶다면, 경력은 특성이 된다.\n",
507 | "\n",
508 | "데이터가 복잡해질수록 신기한 일이 일어난다. 예를 들어 이메일이 스팸메일인지 아닌지를 예측해 주는 필터를 만들고 있다고 해보자. \n",
509 | "\n",
510 | "대부분의 모델은 수많은 글자로 구성된 이메일 원본을 어떨게 처리해야 할지 모를 것이다. 필터를 만들기 위해서는 다음과 같은 특징을 추출해야 할 것이다. \n"
511 | ]
512 | },
513 | {
514 | "cell_type": "markdown",
515 | "metadata": {},
516 | "source": [
517 | "이메일에 비아그라라는 단어가 포함되어 있는가?\n",
518 | "\n",
519 | "d가 몇 번 나왔는가\n",
520 | "\n",
521 | "보낸 사람의 이메일 도메인은 무엇인가?\n",
522 | "\n"
523 | ]
524 | },
525 | {
526 | "cell_type": "code",
527 | "execution_count": null,
528 | "metadata": {
529 | "collapsed": true
530 | },
531 | "outputs": [],
532 | "source": []
533 | }
534 | ],
535 | "metadata": {
536 | "anaconda-cloud": {},
537 | "kernelspec": {
538 | "display_name": "Python [Root]",
539 | "language": "python",
540 | "name": "Python [Root]"
541 | },
542 | "language_info": {
543 | "codemirror_mode": {
544 | "name": "ipython",
545 | "version": 2
546 | },
547 | "file_extension": ".py",
548 | "mimetype": "text/x-python",
549 | "name": "python",
550 | "nbconvert_exporter": "python",
551 | "pygments_lexer": "ipython2",
552 | "version": "2.7.12"
553 | }
554 | },
555 | "nbformat": 4,
556 | "nbformat_minor": 0
557 | }
558 |
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/11 machine learning/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/11 machine learning/2.png
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/11 machine learning/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/11 machine learning/3.png
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/11 machine learning/_DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/11 machine learning/_DS_Store
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/11 machine learning/luke.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/11 machine learning/luke.png
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/11 machine learning/true.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/11 machine learning/true.jpg
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/NYDW Bandit Presentation.ppsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/NYDW Bandit Presentation.ppsx
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/NatureOfCode/Oscillation-Nature Of Code.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# 진동(Oscillation)\n",
8 | "\n",
9 | "* ease-in 또는 ease-out 진동 패턴을 만들 때 사용할 수 있는 사인 함수와 코사인 함수\n",
10 | "\n",
11 | "\n",
12 | "* 용수철 및 진자 운동 등에 대한 계산\n",
13 | "\n",
14 | "## 각도\n",
15 | "\n",
16 | "### Degree\n",
17 | "\n",
18 | "* Degree 또는 Radian이 있음\n",
19 | "* Degree는 한바퀴 도는 것을 360도로 하여, 각도를 표현하는 것. 직각은 90도\n",
20 | "\n",
21 | "\n",
22 | "* 다음은 45도로 돌은 사각형\n",
23 | "\n",
24 | "\n",
25 | "### Radian\n",
26 | "\n",
27 | "* 1라디안은 '호의 길이'와 '반지름'의 길이가 같아지는 시점의 각도\n",
28 | "* 180도 = $\\pi$라디안, 360도 = $2\\pi$, 90도 = $\\frac{\\pi}{2}$\n",
29 | "\n",
30 | "\n",
31 | "* Radian과 Degree 변환 공식\n",
32 | "\n",
33 | "$$\n",
34 | "Radian = 2 \\pi (degree / 360)\n",
35 | "$$\n",
36 | "\n",
37 | "* Processing에서는 $\\pi$는 'PI'라고 그냥 쓰면 됨"
38 | ]
39 | },
40 | {
41 | "cell_type": "markdown",
42 | "metadata": {},
43 | "source": [
44 | "## 회전 운동 (Angular Motion)\n",
45 | "\n",
46 | "* position = position + velocity $\\times$ time\n",
47 | "* velocity = velocity + acceleration $\\times$ time\n",
48 | "* degree = degree + angular velocity $\\times$ time\n",
49 | "* angular velocity = angular velocity + angular acceleration $\\times$ time"
50 | ]
51 | },
52 | {
53 | "cell_type": "markdown",
54 | "metadata": {},
55 | "source": [
56 | "## 삼각법\n",
57 | "\n",
58 | "* Sine, Cosine, Tangent\n",
59 | "\n",
60 | "\n"
61 | ]
62 | },
63 | {
64 | "cell_type": "markdown",
65 | "metadata": {},
66 | "source": [
67 | "* sin = opposite / hypotenuse\n",
68 | "* cos = adjacent / hypotenuse\n",
69 | "* tan = opposite / adjacent\n"
70 | ]
71 | },
72 | {
73 | "cell_type": "markdown",
74 | "metadata": {},
75 | "source": [
76 | "## 이동 방향의 목적지\n",
77 | "\n",
78 | "\n",
79 | "\n",
80 | "* 원의 경우는 회전에 대해서 고려할 필요가 없습니다. 어느 방향을 보든 동일하기 때문입니다.\n",
81 | "* 하지만 그 외의 물체의 경우는 아닙니다. 그러므로 물체의 표시 방향(각도)를 구해야 합니다.\n",
82 | "$$\n",
83 | "angle = \\arctan \\left( \\frac{velocity_{y}}{velocity_{x}} \\right)\n",
84 | "$$\n",
85 | "* atan2를 사용하면 부호 등의 문제를 넘어갈 수 있습니다."
86 | ]
87 | },
88 | {
89 | "cell_type": "markdown",
90 | "metadata": {},
91 | "source": [
92 | "## 극 좌표계와 직교 좌표계\n",
93 | "\n",
94 | "* x와 y좌표계를 가지고 물체의 위치를 표시하는 좌표계를 직교 좌표계(Cartesian Coordinate)\n",
95 | "* 이를 반지름(r)과 각도($\\theta$)로 표시하는 좌표계를 극 좌표계(Polar Coordinate)\n",
96 | "* 하지만 프로세싱에서는 극 좌표계를 이해하지 못 함\n",
97 | "\n",
98 | "\n",
99 | "$$\n",
100 | "\\sin(\\theta) = \\frac{y}{r} \\rightarrow y = r \\sin(\\theta) \\\\\n",
101 | "\\cos(\\theta) = \\frac{x}{r} \\rightarrow y = r \\cos(\\theta) \n",
102 | "$$"
103 | ]
104 | },
105 | {
106 | "cell_type": "markdown",
107 | "metadata": {},
108 | "source": [
109 | "## 진동의 진폭과 주기 (Oscillation Amplitude and Period)\n",
110 | "\n",
111 | "\n",
112 | "\n",
113 | "* 이런 형태의 곡선을 진동이라고 부름\n",
114 | "\n",
115 | "* Simple Harmonic Motion 단순 조화 운동 : 단순히 왔다 갔다 하는 운동\n",
116 | "* 진폭(amplitude) : 움직임의 중심과 가장 멀리 이동했을 때의 거리\n",
117 | "* 주기(period) : 한 번 완전히 진동하는데 걸리는 시간\n",
118 | "\n",
119 | "* 위 그래프에서는 높낮이가 진폭에 해당, $2 \\pi$까지 한 바퀴 도는 거 주기\n",
120 | "\n",
121 | "* 프로세싱에서는 millis라는 것을 이용하여 시간을 알 수 있지만, 여기서는 프레임 단위로...\n",
122 | "\n",
123 | "* 진동수 : 진동수는 단위 시간당 진동한 횟수를 의미 : 1 / period"
124 | ]
125 | },
126 | {
127 | "cell_type": "markdown",
128 | "metadata": {},
129 | "source": [
130 | "## 각속도와 진동(Oscillation with Angular Velocity)"
131 | ]
132 | },
133 | {
134 | "cell_type": "markdown",
135 | "metadata": {},
136 | "source": [
137 | "## 각속도와 진동(Oscillation with Angular Velocity)\n",
138 | "\n",
139 | "* 각속도와 각가속도를 이용하여 에니메이션하기\n",
140 | "\n",
141 | "```\n",
142 | "angle += aVelocity;\n",
143 | "float x = amplitude * cos(angle);\n",
144 | "```\n"
145 | ]
146 | },
147 | {
148 | "cell_type": "markdown",
149 | "metadata": {},
150 | "source": [
151 | "## 파동(Waves)\n",
152 | "\n",
153 | "* 파동 패턴은 물 같은 매끄러운 표면은 물론이고 인체 또는 생명체의 기관을 디자인하는 데도 사용합니다.\n"
154 | ]
155 | },
156 | {
157 | "cell_type": "markdown",
158 | "metadata": {},
159 | "source": [
160 | "## 삼각법과 힘: 진자\n",
161 | "\n",
162 | "* 2차원 추를 만들고 이를 이용하여 표현\n",
163 | "\n",
164 | "\n",
165 | "\n",
166 | ""
167 | ]
168 | },
169 | {
170 | "cell_type": "markdown",
171 | "metadata": {},
172 | "source": [
173 | "* $F_{p} = F_{g} \\sin(\\theta)$\n",
174 | "* 진자의 각속도는 어떻게 될까?\n"
175 | ]
176 | },
177 | {
178 | "cell_type": "markdown",
179 | "metadata": {},
180 | "source": [
181 | "## 용수철 힘(Spring Forces)\n",
182 | "\n",
183 | "\n",
184 | "\n",
185 | "* 용수철의 힘은 용수철이 늘어나는 길이와 정비례한다.\n",
186 | "* $F=-kx$\n",
187 | "\n",
188 | "\n",
189 | "\n",
190 | "* k는 용수철의 탄성을 나타내는 상수입니다. 스프링의 탄성이 강하면 높고, 약하면 낮습니다.\n",
191 | "* x는 용수철의 변위(기본 길이와 정지 시점에서의 길이의 차이)를 나타냅니다. 이때 기본 길이는 원래 용수철이 평형 상태(그냥 두었을 때)의 길이를 나타냅니다.\n",
192 | "\n",
193 | "\n",
194 | "\n",
195 | "\n",
196 | "\n"
197 | ]
198 | },
199 | {
200 | "cell_type": "code",
201 | "execution_count": null,
202 | "metadata": {
203 | "collapsed": true
204 | },
205 | "outputs": [],
206 | "source": []
207 | }
208 | ],
209 | "metadata": {
210 | "kernelspec": {
211 | "display_name": "Python 2",
212 | "language": "python",
213 | "name": "python2"
214 | },
215 | "language_info": {
216 | "codemirror_mode": {
217 | "name": "ipython",
218 | "version": 2
219 | },
220 | "file_extension": ".py",
221 | "mimetype": "text/x-python",
222 | "name": "python",
223 | "nbconvert_exporter": "python",
224 | "pygments_lexer": "ipython2",
225 | "version": "2.7.12"
226 | }
227 | },
228 | "nbformat": 4,
229 | "nbformat_minor": 0
230 | }
231 |
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/NatureOfCode/물리엔진라이브러리.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/NatureOfCode/물리엔진라이브러리.pptx
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/NatureOfCode/세포오토마톤.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/NatureOfCode/세포오토마톤.pptx
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/NatureOfCode/파티클 시스템.pptx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/NatureOfCode/파티클 시스템.pptx
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/밑바닥/[밑바닥]선형대수_0730_1.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/밑바닥/[밑바닥]선형대수_0730_1.pdf
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/밑바닥/data science from scratch/ data science from scratch 1 .ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "#밑바닥부터 시작하는 데이터 과학\n",
8 | "###복잡복작의 평범함 발제자 송영숙"
9 | ]
10 | },
11 | {
12 | "cell_type": "markdown",
13 | "metadata": {},
14 | "source": [
15 | "데이터 과학 THE DATA SCIENCE VENN DIAGRAM\n",
16 | "\n",
17 | "http://drewconway.com/zia/2013/3/26/the-data-science-venn-diagram"
18 | ]
19 | },
20 | {
21 | "cell_type": "markdown",
22 | "metadata": {},
23 | "source": [
24 | "
"
25 | ]
26 | },
27 | {
28 | "cell_type": "markdown",
29 | "metadata": {},
30 | "source": [
31 | "
"
32 | ]
33 | },
34 | {
35 | "cell_type": "markdown",
36 | "metadata": {},
37 | "source": [
38 | "파이썬 다운로드: www.python.org \n",
39 | "\n",
40 | "아나콘다 다운로드: https://www.continuum.io/downloads\n",
41 | "\n",
42 | "파이참 다운로드: https://pypi.python.org/pypi/pip\n",
43 | "\n",
44 | "pip 다운로드: https://pypi.python.org/pypi/pip\n",
45 | "\n",
46 | "ipython notebook: https://jupyter.org/"
47 | ]
48 | },
49 | {
50 | "cell_type": "markdown",
51 | "metadata": {},
52 | "source": [
53 | "책 참고사이트\n",
54 | "https://github.com/Insight-book/data-science-from-scratch/blob/master/links.md\n",
55 | "\n",
56 | "https://github.com/insight-book/data-science-from-scratch\n"
57 | ]
58 | },
59 | {
60 | "cell_type": "code",
61 | "execution_count": 47,
62 | "metadata": {
63 | "collapsed": true
64 | },
65 | "outputs": [],
66 | "source": [
67 | "from __future__ import division # 나눈 값이 정수로 나오지 않다록 하는 역할을 한다. 파이썬 3점대에서는 필요없는 한 줄이다.\n",
68 | "from matplotlib import pyplot as plt"
69 | ]
70 | },
71 | {
72 | "cell_type": "markdown",
73 | "metadata": {},
74 | "source": [
75 | "#1.3 동기부여를 위한 상상: 데이텀 주식회사에 입사했다고 생각하자\n",
76 | "\n",
77 | "##1.3.1 핵심 인물 찾기\n"
78 | ]
79 | },
80 | {
81 | "cell_type": "markdown",
82 | "metadata": {
83 | "collapsed": true
84 | },
85 | "source": [
86 | "다음과 같은 dict 형태에 id와 name이 있는 데이터를 받았다"
87 | ]
88 | },
89 | {
90 | "cell_type": "code",
91 | "execution_count": 48,
92 | "metadata": {
93 | "collapsed": false
94 | },
95 | "outputs": [],
96 | "source": [
97 | "users = [\n",
98 | " { \"id\": 0, \"name\": \"Hero\" },\n",
99 | " { \"id\": 1, \"name\": \"Dunn\" },\n",
100 | " { \"id\": 2, \"name\": \"Sue\" },\n",
101 | " { \"id\": 3, \"name\": \"Chi\" },\n",
102 | " { \"id\": 4, \"name\": \"Thor\" },\n",
103 | " { \"id\": 5, \"name\": \"Clive\" },\n",
104 | " { \"id\": 6, \"name\": \"Hicks\" },\n",
105 | " { \"id\": 7, \"name\": \"Devin\" },\n",
106 | " { \"id\": 8, \"name\": \"Kate\" },\n",
107 | " { \"id\": 9, \"name\": \"Klein\" },\n",
108 | " { \"id\": 10, \"name\": \"Jen\" }\n",
109 | "]"
110 | ]
111 | },
112 | {
113 | "cell_type": "markdown",
114 | "metadata": {},
115 | "source": [
116 | "그리고 id의 쌍으로 구성된 친구 관계 데이터도 있다. \n",
117 | "\n"
118 | ]
119 | },
120 | {
121 | "cell_type": "code",
122 | "execution_count": 49,
123 | "metadata": {
124 | "collapsed": true
125 | },
126 | "outputs": [],
127 | "source": [
128 | "friendships = [(0, 1), (0, 2), (1, 2), (1, 3), (2, 3), (3, 4),\n",
129 | " (4, 5), (5, 6), (5, 7), (6, 8), (7, 8), (8, 9)]"
130 | ]
131 | },
132 | {
133 | "cell_type": "markdown",
134 | "metadata": {},
135 | "source": [
136 | " 
"
137 | ]
138 | },
139 | {
140 | "cell_type": "markdown",
141 | "metadata": {},
142 | "source": [
143 | "이제 각 사용자데이터에 해당 사용자의 친구 목록을 추가하고 싶다고 해보자.\n",
144 | "그럴 때 먼저 각 사용자의 친구관계(friends) 속성에 빈 list 를 할당한다. "
145 | ]
146 | },
147 | {
148 | "cell_type": "code",
149 | "execution_count": 50,
150 | "metadata": {
151 | "collapsed": true
152 | },
153 | "outputs": [],
154 | "source": [
155 | "for user in users:\n",
156 | " user[\"friends\"] = []\n"
157 | ]
158 | },
159 | {
160 | "cell_type": "markdown",
161 | "metadata": {},
162 | "source": [
163 | "그리고 친구관계(friends) 데이터를 이용해 각 list 를 채워 넣는다. "
164 | ]
165 | },
166 | {
167 | "cell_type": "code",
168 | "execution_count": 51,
169 | "metadata": {
170 | "collapsed": true
171 | },
172 | "outputs": [],
173 | "source": [
174 | "for i, j in friendships:\n",
175 | " # this works because users[i] is the user whose id is i\n",
176 | " users[i][\"friends\"].append(users[j]) # i를 j의 친구로 추가\n",
177 | " users[j][\"friends\"].append(users[i]) # j를 i의 친구로 추가\n"
178 | ]
179 | },
180 | {
181 | "cell_type": "markdown",
182 | "metadata": {},
183 | "source": [
184 | "이렇게 각 사용자의 친구 목록을 만들면 네트워크 상에서 각 사용자의 평균 연결 수는 몇인가?와 같이 네트워크의 특성에 관한 질문에 답할 수 있다. 이 질문에 답하기 위해 먼저 모든 friends list의 길이를 더해서 총 연결 수를 구해보자. "
185 | ]
186 | },
187 | {
188 | "cell_type": "code",
189 | "execution_count": 52,
190 | "metadata": {
191 | "collapsed": true
192 | },
193 | "outputs": [],
194 | "source": [
195 | "def number_of_friends(user):\n",
196 | " \"\"\" _user_ 의 친구는 몇 명일까?\"\"\"\n",
197 | " return len(user[\"friends\"]) # 각 friends list의 길이\n",
198 | "\n",
199 | "total_connections = sum(number_of_friends(user)\n",
200 | " for user in users) # 24\n"
201 | ]
202 | },
203 | {
204 | "cell_type": "markdown",
205 | "metadata": {},
206 | "source": [
207 | "이제 단순히 이 숫자를 이용해 사용자의 수로 나누면 된다."
208 | ]
209 | },
210 | {
211 | "cell_type": "code",
212 | "execution_count": 53,
213 | "metadata": {
214 | "collapsed": true
215 | },
216 | "outputs": [],
217 | "source": [
218 | "num_users = len(users)\n",
219 | "avg_connections = total_connections / num_users # 2.4"
220 | ]
221 | },
222 | {
223 | "cell_type": "markdown",
224 | "metadata": {},
225 | "source": [
226 | "다음으로 연결 수가 가장 많은 사람, 즉 친구가 가장 많은 사람이 누군지 알아보자. 사용자의 수가 많지 않으므로 친구가 제일 많은 사람에서 제일 적은 사람 순으로 사용자들을 정열해 보자. "
227 | ]
228 | },
229 | {
230 | "cell_type": "code",
231 | "execution_count": 54,
232 | "metadata": {
233 | "collapsed": false
234 | },
235 | "outputs": [
236 | {
237 | "data": {
238 | "text/plain": [
239 | "[(1, 3),\n",
240 | " (2, 3),\n",
241 | " (3, 3),\n",
242 | " (5, 3),\n",
243 | " (8, 3),\n",
244 | " (0, 2),\n",
245 | " (4, 2),\n",
246 | " (6, 2),\n",
247 | " (7, 2),\n",
248 | " (9, 1),\n",
249 | " (10, 0)]"
250 | ]
251 | },
252 | "execution_count": 54,
253 | "metadata": {},
254 | "output_type": "execute_result"
255 | }
256 | ],
257 | "source": [
258 | "#(user_id, number_of_friends로 구성된 list 생성)\n",
259 | "num_friends_by_id = [(user[\"id\"], number_of_friends(user)) for user in users]\n",
260 | "sorted(num_friends_by_id, # 정렬해보자\n",
261 | "key=lambda (user_user_id, num_friends): num_friends, # num_friends를 기준으로\n",
262 | "reverse=True) # 큰 숫자에서 작은 숫자로\n",
263 | "# (user_id, num_friends)의 쌍으로 구성되어 있다. \n",
264 | "# [(1, 3), (2, 3), (3, 3), (5, 3), (8, 3),\n",
265 | "# (0, 2), (4, 2), (6, 2), (7, 2), (9, 1)]"
266 | ]
267 | },
268 | {
269 | "cell_type": "markdown",
270 | "metadata": {},
271 | "source": [
272 | "
"
273 | ]
274 | },
275 | {
276 | "cell_type": "markdown",
277 | "metadata": {},
278 | "source": [
279 | "#1.3.2 데이터 과학자 추천하기"
280 | ]
281 | },
282 | {
283 | "cell_type": "markdown",
284 | "metadata": {},
285 | "source": [
286 | "친구 맺기가 더 활발해 지기 위해 친구추천 기능을 설계해 달라는 요청을 받았다. 친구의 친구의 추천해 주는 것이 좋겠다는 아이디어가 떠 오른다. 각 사용자의 친구에 대한 그 친구의 친구들을 살펴보고 사용자의 모든 친구들에 대해 똑같은 작업을 반복하고 결과를 저장하면 된다. \n",
287 | "foaf == friends_of_friend"
288 | ]
289 | },
290 | {
291 | "cell_type": "code",
292 | "execution_count": 55,
293 | "metadata": {
294 | "collapsed": false
295 | },
296 | "outputs": [],
297 | "source": [
298 | "def friends_of_friend_ids_bad(user):\n",
299 | " return [foaf[\"id\"]\n",
300 | " for friend in user[\"friends\"] # 유저의 친구 개개인에 대해\n",
301 | " for foaf in friend[\"friends\"]] # 그들의 친구들을 찾아준다\n",
302 | "\n"
303 | ]
304 | },
305 | {
306 | "cell_type": "code",
307 | "execution_count": 56,
308 | "metadata": {
309 | "collapsed": false
310 | },
311 | "outputs": [
312 | {
313 | "data": {
314 | "text/plain": [
315 | "{'friends': [{'friends': [{...},\n",
316 | " {'friends': [{...},\n",
317 | " {...},\n",
318 | " {'friends': [{...},\n",
319 | " {...},\n",
320 | " {'friends': [{...},\n",
321 | " {'friends': [{...},\n",
322 | " {'friends': [{...},\n",
323 | " {'friends': [{...},\n",
324 | " {'friends': [{...}, {...}], 'id': 7, 'name': 'Devin'},\n",
325 | " {'friends': [{...}], 'id': 9, 'name': 'Klein'}],\n",
326 | " 'id': 8,\n",
327 | " 'name': 'Kate'}],\n",
328 | " 'id': 6,\n",
329 | " 'name': 'Hicks'},\n",
330 | " {'friends': [{...},\n",
331 | " {'friends': [{'friends': [{...}, {...}],\n",
332 | " 'id': 6,\n",
333 | " 'name': 'Hicks'},\n",
334 | " {...},\n",
335 | " {'friends': [{...}], 'id': 9, 'name': 'Klein'}],\n",
336 | " 'id': 8,\n",
337 | " 'name': 'Kate'}],\n",
338 | " 'id': 7,\n",
339 | " 'name': 'Devin'}],\n",
340 | " 'id': 5,\n",
341 | " 'name': 'Clive'}],\n",
342 | " 'id': 4,\n",
343 | " 'name': 'Thor'}],\n",
344 | " 'id': 3,\n",
345 | " 'name': 'Chi'}],\n",
346 | " 'id': 2,\n",
347 | " 'name': 'Sue'},\n",
348 | " {'friends': [{...},\n",
349 | " {'friends': [{...}, {...}, {...}], 'id': 2, 'name': 'Sue'},\n",
350 | " {'friends': [{...},\n",
351 | " {'friends': [{...},\n",
352 | " {'friends': [{...},\n",
353 | " {'friends': [{...},\n",
354 | " {'friends': [{...}, {...}], 'id': 7, 'name': 'Devin'},\n",
355 | " {'friends': [{...}], 'id': 9, 'name': 'Klein'}],\n",
356 | " 'id': 8,\n",
357 | " 'name': 'Kate'}],\n",
358 | " 'id': 6,\n",
359 | " 'name': 'Hicks'},\n",
360 | " {'friends': [{...},\n",
361 | " {'friends': [{'friends': [{...}, {...}], 'id': 6, 'name': 'Hicks'},\n",
362 | " {...},\n",
363 | " {'friends': [{...}], 'id': 9, 'name': 'Klein'}],\n",
364 | " 'id': 8,\n",
365 | " 'name': 'Kate'}],\n",
366 | " 'id': 7,\n",
367 | " 'name': 'Devin'}],\n",
368 | " 'id': 5,\n",
369 | " 'name': 'Clive'}],\n",
370 | " 'id': 4,\n",
371 | " 'name': 'Thor'}],\n",
372 | " 'id': 3,\n",
373 | " 'name': 'Chi'}],\n",
374 | " 'id': 1,\n",
375 | " 'name': 'Dunn'},\n",
376 | " {'friends': [{...},\n",
377 | " {'friends': [{...},\n",
378 | " {...},\n",
379 | " {'friends': [{...},\n",
380 | " {...},\n",
381 | " {'friends': [{...},\n",
382 | " {'friends': [{...},\n",
383 | " {'friends': [{...},\n",
384 | " {'friends': [{...},\n",
385 | " {'friends': [{...}, {...}], 'id': 7, 'name': 'Devin'},\n",
386 | " {'friends': [{...}], 'id': 9, 'name': 'Klein'}],\n",
387 | " 'id': 8,\n",
388 | " 'name': 'Kate'}],\n",
389 | " 'id': 6,\n",
390 | " 'name': 'Hicks'},\n",
391 | " {'friends': [{...},\n",
392 | " {'friends': [{'friends': [{...}, {...}],\n",
393 | " 'id': 6,\n",
394 | " 'name': 'Hicks'},\n",
395 | " {...},\n",
396 | " {'friends': [{...}], 'id': 9, 'name': 'Klein'}],\n",
397 | " 'id': 8,\n",
398 | " 'name': 'Kate'}],\n",
399 | " 'id': 7,\n",
400 | " 'name': 'Devin'}],\n",
401 | " 'id': 5,\n",
402 | " 'name': 'Clive'}],\n",
403 | " 'id': 4,\n",
404 | " 'name': 'Thor'}],\n",
405 | " 'id': 3,\n",
406 | " 'name': 'Chi'}],\n",
407 | " 'id': 1,\n",
408 | " 'name': 'Dunn'},\n",
409 | " {'friends': [{'friends': [{...}, {...}, {...}], 'id': 1, 'name': 'Dunn'},\n",
410 | " {...},\n",
411 | " {'friends': [{...},\n",
412 | " {'friends': [{...},\n",
413 | " {'friends': [{...},\n",
414 | " {'friends': [{...},\n",
415 | " {'friends': [{...}, {...}], 'id': 7, 'name': 'Devin'},\n",
416 | " {'friends': [{...}], 'id': 9, 'name': 'Klein'}],\n",
417 | " 'id': 8,\n",
418 | " 'name': 'Kate'}],\n",
419 | " 'id': 6,\n",
420 | " 'name': 'Hicks'},\n",
421 | " {'friends': [{...},\n",
422 | " {'friends': [{'friends': [{...}, {...}], 'id': 6, 'name': 'Hicks'},\n",
423 | " {...},\n",
424 | " {'friends': [{...}], 'id': 9, 'name': 'Klein'}],\n",
425 | " 'id': 8,\n",
426 | " 'name': 'Kate'}],\n",
427 | " 'id': 7,\n",
428 | " 'name': 'Devin'}],\n",
429 | " 'id': 5,\n",
430 | " 'name': 'Clive'}],\n",
431 | " 'id': 4,\n",
432 | " 'name': 'Thor'}],\n",
433 | " 'id': 3,\n",
434 | " 'name': 'Chi'}],\n",
435 | " 'id': 2,\n",
436 | " 'name': 'Sue'}],\n",
437 | " 'id': 0,\n",
438 | " 'name': 'Hero'}"
439 | ]
440 | },
441 | "execution_count": 56,
442 | "metadata": {},
443 | "output_type": "execute_result"
444 | }
445 | ],
446 | "source": [
447 | "users[0]"
448 | ]
449 | },
450 | {
451 | "cell_type": "markdown",
452 | "metadata": {},
453 | "source": [
454 | "Hero도 자신의 친구의 친구이므로 사용자가 0 (자기자신 포함)이 두 번 포함되어 있다. 그리고 이미 Hero와 친구인 사용자 1과 2도 포함되어 있는 것을 볼 수 있다. Chi(id 3)는 두 명의 친구와 친구이기 때문에 두 번 포함되어 있다. "
455 | ]
456 | },
457 | {
458 | "cell_type": "code",
459 | "execution_count": 57,
460 | "metadata": {
461 | "collapsed": false
462 | },
463 | "outputs": [
464 | {
465 | "name": "stdout",
466 | "output_type": "stream",
467 | "text": [
468 | "[1, 2]\n",
469 | "[0, 2, 3]\n",
470 | "[0, 1, 3]\n"
471 | ]
472 | }
473 | ],
474 | "source": [
475 | "print [friend[\"id\"] for friend in users[0][\"friends\"]] # [1, 2]\n",
476 | "print [friend[\"id\"] for friend in users[1][\"friends\"]] # [0, 2, 3]\n",
477 | "print [friend[\"id\"] for friend in users[2][\"friends\"]] # [0, 1, 3]"
478 | ]
479 | },
480 | {
481 | "cell_type": "markdown",
482 | "metadata": {},
483 | "source": [
484 | "사용자들이 이미 여러분의 친구들로 연결되어 있다는 점이 흥미롭다. 그렇다면 이번에는 서로가 함께 하는 친구가 몇 명인지 세어볼까? 동시에 사용자가 이미 아는 사람을 제외하는 함수를 만들자"
485 | ]
486 | },
487 | {
488 | "cell_type": "code",
489 | "execution_count": 58,
490 | "metadata": {
491 | "collapsed": false
492 | },
493 | "outputs": [
494 | {
495 | "name": "stdout",
496 | "output_type": "stream",
497 | "text": [
498 | "Counter({0: 2, 5: 1})\n"
499 | ]
500 | }
501 | ],
502 | "source": [
503 | "from collections import Counter # 별도로 import해 주어야 함\n",
504 | "\n",
505 | "def not_the_same(user, other_user):\n",
506 | " \"\"\"two users are not the same if they have different ids\"\"\"\n",
507 | " return user[\"id\"] != other_user[\"id\"]\n",
508 | "\n",
509 | "def not_friends(user, other_user):\n",
510 | " \"\"\"other_user is not a friend if he's not in user[\"friends\"];\n",
511 | " that is, if he's not_the_same as all the people in user[\"friends\"]\"\"\"\n",
512 | " return all(not_the_same(friend, other_user)\n",
513 | " for friend in user[\"friends\"])\n",
514 | "\n",
515 | "def friends_of_friend_ids(user):\n",
516 | " return Counter(foaf[\"id\"]\n",
517 | " for friend in user[\"friends\"] # 사용자의 친구 개개인에 대해\n",
518 | " for foaf in friend[\"friends\"] # 그들의 친구들을 세어 보고\n",
519 | " if not_the_same(user, foaf) # 그중에서 자신과\n",
520 | " and not_friends(user, foaf)) # 사용자의 친구가 아닌 사람은 제외\n",
521 | "\n",
522 | "print friends_of_friend_ids(users[3]) # Counter({0: 2, 5: 1})\n"
523 | ]
524 | },
525 | {
526 | "cell_type": "markdown",
527 | "metadata": {},
528 | "source": [
529 | "이제 Chi(id: 3)는 Hero(id: 0)와 함께 아는 친구가 두 명이고 Chive(id: 5)와 함께 아는 친구가 한 명이라는 것을 알 수 있다.\n"
530 | ]
531 | },
532 | {
533 | "cell_type": "markdown",
534 | "metadata": {},
535 | "source": [
536 | "데이터를 꾸준히 보다 보니 데이터 과학자의 직감에 따라 비슷한 관심사를 가지 ㄴ사람을 소개 받으면 기분이 좋을 것 같다는 생각이 든다.(도메인 전문성) 당신은 주변 직원 몇 명에게 물어 보고 나서 관심사 데이터(interests)를 손에 넣었다. 이 데이터는 사용자 고유 번호 id와 관심사(interest)의 쌍으로 구성되어 있다."
537 | ]
538 | },
539 | {
540 | "cell_type": "code",
541 | "execution_count": 59,
542 | "metadata": {
543 | "collapsed": true
544 | },
545 | "outputs": [],
546 | "source": [
547 | "interests = [\n",
548 | " (0, \"Hadoop\"), (0, \"Big Data\"), (0, \"HBase\"), (0, \"Java\"),\n",
549 | " (0, \"Spark\"), (0, \"Storm\"), (0, \"Cassandra\"),\n",
550 | " (1, \"NoSQL\"), (1, \"MongoDB\"), (1, \"Cassandra\"), (1, \"HBase\"),\n",
551 | " (1, \"Postgres\"), (2, \"Python\"), (2, \"scikit-learn\"), (2, \"scipy\"),\n",
552 | " (2, \"numpy\"), (2, \"statsmodels\"), (2, \"pandas\"), (3, \"R\"), (3, \"Python\"),\n",
553 | " (3, \"statistics\"), (3, \"regression\"), (3, \"probability\"),\n",
554 | " (4, \"machine learning\"), (4, \"regression\"), (4, \"decision trees\"),\n",
555 | " (4, \"libsvm\"), (5, \"Python\"), (5, \"R\"), (5, \"Java\"), (5, \"C++\"),\n",
556 | " (5, \"Haskell\"), (5, \"programming languages\"), (6, \"statistics\"),\n",
557 | " (6, \"probability\"), (6, \"mathematics\"), (6, \"theory\"),\n",
558 | " (7, \"machine learning\"), (7, \"scikit-learn\"), (7, \"Mahout\"),\n",
559 | " (7, \"neural networks\"), (8, \"neural networks\"), (8, \"deep learning\"),\n",
560 | " (8, \"Big Data\"), (8, \"artificial intelligence\"), (9, \"Hadoop\"),\n",
561 | " (9, \"Java\"), (9, \"MapReduce\"), (9, \"Big Data\")\n",
562 | "]\n"
563 | ]
564 | },
565 | {
566 | "cell_type": "markdown",
567 | "metadata": {},
568 | "source": [
569 | "예를 들어 Hero(id:0)와 Kate(id: 8)는 함께 아는 친구가 한 명도 없지만 빅테이터라는 공통된 관심사를 갖고 있다. \n",
570 | "특정 관심사를 공유하는 사용자들을 찾아 주는 함수를 만드는 것도 그리 어렵지 않다."
571 | ]
572 | },
573 | {
574 | "cell_type": "code",
575 | "execution_count": 60,
576 | "metadata": {
577 | "collapsed": true
578 | },
579 | "outputs": [],
580 | "source": [
581 | "def data_scientists_who_like(target_interest):\n",
582 | " return [user_id\n",
583 | " for user_id, user_interest in interests\n",
584 | " if user_interest == target_interest]\n"
585 | ]
586 | },
587 | {
588 | "cell_type": "markdown",
589 | "metadata": {},
590 | "source": [
591 | "그러나 이 코드는 호출할 때마다 관심사 데이터를 매번 처음부터 끝까지 훑어야 한다는 단점이 있다. 사용자 수가 많고 그들의 관심사가 많다면(또는 데이터를 여러 번 훑을거라면) 각 관심사에 대한 사용자 인텍스를 만드는 것이 나을지 모른다. "
592 | ]
593 | },
594 | {
595 | "cell_type": "code",
596 | "execution_count": 61,
597 | "metadata": {
598 | "collapsed": true
599 | },
600 | "outputs": [],
601 | "source": [
602 | "from collections import defaultdict\n",
603 | "\n",
604 | "# keys가 interests, values가 사용자 id\n",
605 | "user_ids_by_interest = defaultdict(list)\n",
606 | "\n",
607 | "for user_id, interest in interests:\n",
608 | " user_ids_by_interest[interest].append(user_id)\n",
609 | "\n",
610 | "# keys가 사용자 ids, values가 관심사\n",
611 | "interests_by_user_id = defaultdict(list)\n",
612 | "\n",
613 | "for user_id, interest in interests:\n",
614 | " interests_by_user_id[user_id].append(interest)\n"
615 | ]
616 | },
617 | {
618 | "cell_type": "markdown",
619 | "metadata": {},
620 | "source": [
621 | "이제 특정한 사용자가 주어졌을 때 사용자와 가장 유사한 관심사를 가진 사람이 누구인지 다음의 3단계로 알 수 있다. \n",
622 | "\n",
623 | "-해당 사용자의 관심사들을 훑는다.\n",
624 | "-각 관심사를 가진 다른 사용자들이 누구인지 찾아본다.\n",
625 | "-다른 사용자들이 몇 번이나 등장하는지 센다."
626 | ]
627 | },
628 | {
629 | "cell_type": "code",
630 | "execution_count": 62,
631 | "metadata": {
632 | "collapsed": true
633 | },
634 | "outputs": [],
635 | "source": [
636 | "\n",
637 | "def most_common_interests_with(user_id):\n",
638 | " return Counter(interested_user_id\n",
639 | " for interest in interests_by_user[\"user_id\"]\n",
640 | " for interested_user_id in users_by_interest[interest]\n",
641 | " if interested_user_id != user_id)\n"
642 | ]
643 | },
644 | {
645 | "cell_type": "markdown",
646 | "metadata": {},
647 | "source": [
648 | "함께 아는 친구와 공통된 관심사 정보를 동시에 이용하면 데이터 과학자 추천 시스템의 성능을 더욱 높을 수 있을 것이다. "
649 | ]
650 | },
651 | {
652 | "cell_type": "markdown",
653 | "metadata": {},
654 | "source": [
655 | "1.3.3. 연봉과 경력"
656 | ]
657 | },
658 | {
659 | "cell_type": "markdown",
660 | "metadata": {},
661 | "source": [
662 | "연봉과 근속기간 시각화 "
663 | ]
664 | },
665 | {
666 | "cell_type": "code",
667 | "execution_count": 64,
668 | "metadata": {
669 | "collapsed": true
670 | },
671 | "outputs": [],
672 | "source": [
673 | "salaries_and_tenures = [(83000, 8.7), (88000, 8.1),\n",
674 | " (48000, 0.7), (76000, 6),\n",
675 | " (69000, 6.5), (76000, 7.5),\n",
676 | " (60000, 2.5), (83000, 10),\n",
677 | " (48000, 1.9), (63000, 4.2)]"
678 | ]
679 | },
680 | {
681 | "cell_type": "code",
682 | "execution_count": 68,
683 | "metadata": {
684 | "collapsed": true
685 | },
686 | "outputs": [],
687 | "source": [
688 | "import matplotlib.pyplot as plt\n",
689 | "%matplotlib inline"
690 | ]
691 | },
692 | {
693 | "cell_type": "code",
694 | "execution_count": 69,
695 | "metadata": {
696 | "collapsed": false
697 | },
698 | "outputs": [
699 | {
700 | "data": {
701 | "text/plain": [
702 | ""
703 | ]
704 | },
705 | "execution_count": 69,
706 | "metadata": {},
707 | "output_type": "execute_result"
708 | },
709 | {
710 | "data": {
711 | "image/png": "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\ngg==\n",
712 | "text/plain": [
713 | ""
714 | ]
715 | },
716 | "metadata": {},
717 | "output_type": "display_data"
718 | }
719 | ],
720 | "source": [
721 | "x,y = zip(*salaries_and_tenures)\n",
722 | "plt.scatter(x,y)"
723 | ]
724 | },
725 | {
726 | "cell_type": "markdown",
727 | "metadata": {},
728 | "source": [
729 | "감사합니다. "
730 | ]
731 | },
732 | {
733 | "cell_type": "markdown",
734 | "metadata": {},
735 | "source": [
736 | "마크다운 팁: 표 만들기 http://www.tablesgenerator.com/markdown_tables\n",
737 | "파이썬 한글처리: http://amornatura.tistory.com/104"
738 | ]
739 | }
740 | ],
741 | "metadata": {
742 | "kernelspec": {
743 | "display_name": "Python 2",
744 | "language": "python",
745 | "name": "python2"
746 | },
747 | "language_info": {
748 | "codemirror_mode": {
749 | "name": "ipython",
750 | "version": 2
751 | },
752 | "file_extension": ".py",
753 | "mimetype": "text/x-python",
754 | "name": "python",
755 | "nbconvert_exporter": "python",
756 | "pygments_lexer": "ipython2",
757 | "version": "2.7.10"
758 | }
759 | },
760 | "nbformat": 4,
761 | "nbformat_minor": 0
762 | }
763 |
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/밑바닥/data science from scratch/.ipynb_checkpoints/ data science from scratch 1 -checkpoint.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "#밑바닥부터 시작하는 데이터 과학\n",
8 | "###복잡복작의 평범함 발제자 송영숙"
9 | ]
10 | },
11 | {
12 | "cell_type": "markdown",
13 | "metadata": {},
14 | "source": [
15 | "데이터 과학 THE DATA SCIENCE VENN DIAGRAM\n",
16 | "\n",
17 | "http://drewconway.com/zia/2013/3/26/the-data-science-venn-diagram"
18 | ]
19 | },
20 | {
21 | "cell_type": "markdown",
22 | "metadata": {},
23 | "source": [
24 | "
"
25 | ]
26 | },
27 | {
28 | "cell_type": "markdown",
29 | "metadata": {},
30 | "source": [
31 | "
"
32 | ]
33 | },
34 | {
35 | "cell_type": "markdown",
36 | "metadata": {},
37 | "source": [
38 | "파이썬 다운로드: www.python.org \n",
39 | "\n",
40 | "아나콘다 다운로드: https://www.continuum.io/downloads\n",
41 | "\n",
42 | "파이참 다운로드: https://pypi.python.org/pypi/pip\n",
43 | "\n",
44 | "pip 다운로드: https://pypi.python.org/pypi/pip\n",
45 | "\n",
46 | "ipython notebook: https://jupyter.org/"
47 | ]
48 | },
49 | {
50 | "cell_type": "markdown",
51 | "metadata": {},
52 | "source": [
53 | "책 참고사이트\n",
54 | "https://github.com/Insight-book/data-science-from-scratch/blob/master/links.md\n",
55 | "\n",
56 | "https://github.com/insight-book/data-science-from-scratch\n"
57 | ]
58 | },
59 | {
60 | "cell_type": "code",
61 | "execution_count": 47,
62 | "metadata": {
63 | "collapsed": true
64 | },
65 | "outputs": [],
66 | "source": [
67 | "from __future__ import division # 나눈 값이 정수로 나오지 않다록 하는 역할을 한다. 파이썬 3점대에서는 필요없는 한 줄이다.\n",
68 | "from matplotlib import pyplot as plt"
69 | ]
70 | },
71 | {
72 | "cell_type": "markdown",
73 | "metadata": {},
74 | "source": [
75 | "#1.3 동기부여를 위한 상상: 데이텀 주식회사에 입사했다고 생각하자\n",
76 | "\n",
77 | "##1.3.1 핵심 인물 찾기\n"
78 | ]
79 | },
80 | {
81 | "cell_type": "markdown",
82 | "metadata": {
83 | "collapsed": true
84 | },
85 | "source": [
86 | "다음과 같은 dict 형태에 id와 name이 있는 데이터를 받았다"
87 | ]
88 | },
89 | {
90 | "cell_type": "code",
91 | "execution_count": 48,
92 | "metadata": {
93 | "collapsed": false
94 | },
95 | "outputs": [],
96 | "source": [
97 | "users = [\n",
98 | " { \"id\": 0, \"name\": \"Hero\" },\n",
99 | " { \"id\": 1, \"name\": \"Dunn\" },\n",
100 | " { \"id\": 2, \"name\": \"Sue\" },\n",
101 | " { \"id\": 3, \"name\": \"Chi\" },\n",
102 | " { \"id\": 4, \"name\": \"Thor\" },\n",
103 | " { \"id\": 5, \"name\": \"Clive\" },\n",
104 | " { \"id\": 6, \"name\": \"Hicks\" },\n",
105 | " { \"id\": 7, \"name\": \"Devin\" },\n",
106 | " { \"id\": 8, \"name\": \"Kate\" },\n",
107 | " { \"id\": 9, \"name\": \"Klein\" },\n",
108 | " { \"id\": 10, \"name\": \"Jen\" }\n",
109 | "]"
110 | ]
111 | },
112 | {
113 | "cell_type": "markdown",
114 | "metadata": {},
115 | "source": [
116 | "그리고 id의 쌍으로 구성된 친구 관계 데이터도 있다. \n",
117 | "\n"
118 | ]
119 | },
120 | {
121 | "cell_type": "code",
122 | "execution_count": 49,
123 | "metadata": {
124 | "collapsed": true
125 | },
126 | "outputs": [],
127 | "source": [
128 | "friendships = [(0, 1), (0, 2), (1, 2), (1, 3), (2, 3), (3, 4),\n",
129 | " (4, 5), (5, 6), (5, 7), (6, 8), (7, 8), (8, 9)]"
130 | ]
131 | },
132 | {
133 | "cell_type": "markdown",
134 | "metadata": {},
135 | "source": [
136 | " 
"
137 | ]
138 | },
139 | {
140 | "cell_type": "markdown",
141 | "metadata": {},
142 | "source": [
143 | "이제 각 사용자데이터에 해당 사용자의 친구 목록을 추가하고 싶다고 해보자.\n",
144 | "그럴 때 먼저 각 사용자의 친구관계(friends) 속성에 빈 list 를 할당한다. "
145 | ]
146 | },
147 | {
148 | "cell_type": "code",
149 | "execution_count": 50,
150 | "metadata": {
151 | "collapsed": true
152 | },
153 | "outputs": [],
154 | "source": [
155 | "for user in users:\n",
156 | " user[\"friends\"] = []\n"
157 | ]
158 | },
159 | {
160 | "cell_type": "markdown",
161 | "metadata": {},
162 | "source": [
163 | "그리고 친구관계(friends) 데이터를 이용해 각 list 를 채워 넣는다. "
164 | ]
165 | },
166 | {
167 | "cell_type": "code",
168 | "execution_count": 51,
169 | "metadata": {
170 | "collapsed": true
171 | },
172 | "outputs": [],
173 | "source": [
174 | "for i, j in friendships:\n",
175 | " # this works because users[i] is the user whose id is i\n",
176 | " users[i][\"friends\"].append(users[j]) # i를 j의 친구로 추가\n",
177 | " users[j][\"friends\"].append(users[i]) # j를 i의 친구로 추가\n"
178 | ]
179 | },
180 | {
181 | "cell_type": "markdown",
182 | "metadata": {},
183 | "source": [
184 | "이렇게 각 사용자의 친구 목록을 만들면 네트워크 상에서 각 사용자의 평균 연결 수는 몇인가?와 같이 네트워크의 특성에 관한 질문에 답할 수 있다. 이 질문에 답하기 위해 먼저 모든 friends list의 길이를 더해서 총 연결 수를 구해보자. "
185 | ]
186 | },
187 | {
188 | "cell_type": "code",
189 | "execution_count": 52,
190 | "metadata": {
191 | "collapsed": true
192 | },
193 | "outputs": [],
194 | "source": [
195 | "def number_of_friends(user):\n",
196 | " \"\"\" _user_ 의 친구는 몇 명일까?\"\"\"\n",
197 | " return len(user[\"friends\"]) # 각 friends list의 길이\n",
198 | "\n",
199 | "total_connections = sum(number_of_friends(user)\n",
200 | " for user in users) # 24\n"
201 | ]
202 | },
203 | {
204 | "cell_type": "markdown",
205 | "metadata": {},
206 | "source": [
207 | "이제 단순히 이 숫자를 이용해 사용자의 수로 나누면 된다."
208 | ]
209 | },
210 | {
211 | "cell_type": "code",
212 | "execution_count": 53,
213 | "metadata": {
214 | "collapsed": true
215 | },
216 | "outputs": [],
217 | "source": [
218 | "num_users = len(users)\n",
219 | "avg_connections = total_connections / num_users # 2.4"
220 | ]
221 | },
222 | {
223 | "cell_type": "markdown",
224 | "metadata": {},
225 | "source": [
226 | "다음으로 연결 수가 가장 많은 사람, 즉 친구가 가장 많은 사람이 누군지 알아보자. 사용자의 수가 많지 않으므로 친구가 제일 많은 사람에서 제일 적은 사람 순으로 사용자들을 정열해 보자. "
227 | ]
228 | },
229 | {
230 | "cell_type": "code",
231 | "execution_count": 54,
232 | "metadata": {
233 | "collapsed": false
234 | },
235 | "outputs": [
236 | {
237 | "data": {
238 | "text/plain": [
239 | "[(1, 3),\n",
240 | " (2, 3),\n",
241 | " (3, 3),\n",
242 | " (5, 3),\n",
243 | " (8, 3),\n",
244 | " (0, 2),\n",
245 | " (4, 2),\n",
246 | " (6, 2),\n",
247 | " (7, 2),\n",
248 | " (9, 1),\n",
249 | " (10, 0)]"
250 | ]
251 | },
252 | "execution_count": 54,
253 | "metadata": {},
254 | "output_type": "execute_result"
255 | }
256 | ],
257 | "source": [
258 | "#(user_id, number_of_friends로 구성된 list 생성)\n",
259 | "num_friends_by_id = [(user[\"id\"], number_of_friends(user)) for user in users]\n",
260 | "sorted(num_friends_by_id, # 정렬해보자\n",
261 | "key=lambda (user_user_id, num_friends): num_friends, # num_friends를 기준으로\n",
262 | "reverse=True) # 큰 숫자에서 작은 숫자로\n",
263 | "# (user_id, num_friends)의 쌍으로 구성되어 있다. \n",
264 | "# [(1, 3), (2, 3), (3, 3), (5, 3), (8, 3),\n",
265 | "# (0, 2), (4, 2), (6, 2), (7, 2), (9, 1)]"
266 | ]
267 | },
268 | {
269 | "cell_type": "markdown",
270 | "metadata": {},
271 | "source": [
272 | "
"
273 | ]
274 | },
275 | {
276 | "cell_type": "markdown",
277 | "metadata": {},
278 | "source": [
279 | "#1.3.2 데이터 과학자 추천하기"
280 | ]
281 | },
282 | {
283 | "cell_type": "markdown",
284 | "metadata": {},
285 | "source": [
286 | "친구 맺기가 더 활발해 지기 위해 친구추천 기능을 설계해 달라는 요청을 받았다. 친구의 친구의 추천해 주는 것이 좋겠다는 아이디어가 떠 오른다. 각 사용자의 친구에 대한 그 친구의 친구들을 살펴보고 사용자의 모든 친구들에 대해 똑같은 작업을 반복하고 결과를 저장하면 된다. \n",
287 | "foaf == friends_of_friend"
288 | ]
289 | },
290 | {
291 | "cell_type": "code",
292 | "execution_count": 55,
293 | "metadata": {
294 | "collapsed": false
295 | },
296 | "outputs": [],
297 | "source": [
298 | "def friends_of_friend_ids_bad(user):\n",
299 | " return [foaf[\"id\"]\n",
300 | " for friend in user[\"friends\"] # 유저의 친구 개개인에 대해\n",
301 | " for foaf in friend[\"friends\"]] # 그들의 친구들을 찾아준다\n",
302 | "\n"
303 | ]
304 | },
305 | {
306 | "cell_type": "code",
307 | "execution_count": 56,
308 | "metadata": {
309 | "collapsed": false
310 | },
311 | "outputs": [
312 | {
313 | "data": {
314 | "text/plain": [
315 | "{'friends': [{'friends': [{...},\n",
316 | " {'friends': [{...},\n",
317 | " {...},\n",
318 | " {'friends': [{...},\n",
319 | " {...},\n",
320 | " {'friends': [{...},\n",
321 | " {'friends': [{...},\n",
322 | " {'friends': [{...},\n",
323 | " {'friends': [{...},\n",
324 | " {'friends': [{...}, {...}], 'id': 7, 'name': 'Devin'},\n",
325 | " {'friends': [{...}], 'id': 9, 'name': 'Klein'}],\n",
326 | " 'id': 8,\n",
327 | " 'name': 'Kate'}],\n",
328 | " 'id': 6,\n",
329 | " 'name': 'Hicks'},\n",
330 | " {'friends': [{...},\n",
331 | " {'friends': [{'friends': [{...}, {...}],\n",
332 | " 'id': 6,\n",
333 | " 'name': 'Hicks'},\n",
334 | " {...},\n",
335 | " {'friends': [{...}], 'id': 9, 'name': 'Klein'}],\n",
336 | " 'id': 8,\n",
337 | " 'name': 'Kate'}],\n",
338 | " 'id': 7,\n",
339 | " 'name': 'Devin'}],\n",
340 | " 'id': 5,\n",
341 | " 'name': 'Clive'}],\n",
342 | " 'id': 4,\n",
343 | " 'name': 'Thor'}],\n",
344 | " 'id': 3,\n",
345 | " 'name': 'Chi'}],\n",
346 | " 'id': 2,\n",
347 | " 'name': 'Sue'},\n",
348 | " {'friends': [{...},\n",
349 | " {'friends': [{...}, {...}, {...}], 'id': 2, 'name': 'Sue'},\n",
350 | " {'friends': [{...},\n",
351 | " {'friends': [{...},\n",
352 | " {'friends': [{...},\n",
353 | " {'friends': [{...},\n",
354 | " {'friends': [{...}, {...}], 'id': 7, 'name': 'Devin'},\n",
355 | " {'friends': [{...}], 'id': 9, 'name': 'Klein'}],\n",
356 | " 'id': 8,\n",
357 | " 'name': 'Kate'}],\n",
358 | " 'id': 6,\n",
359 | " 'name': 'Hicks'},\n",
360 | " {'friends': [{...},\n",
361 | " {'friends': [{'friends': [{...}, {...}], 'id': 6, 'name': 'Hicks'},\n",
362 | " {...},\n",
363 | " {'friends': [{...}], 'id': 9, 'name': 'Klein'}],\n",
364 | " 'id': 8,\n",
365 | " 'name': 'Kate'}],\n",
366 | " 'id': 7,\n",
367 | " 'name': 'Devin'}],\n",
368 | " 'id': 5,\n",
369 | " 'name': 'Clive'}],\n",
370 | " 'id': 4,\n",
371 | " 'name': 'Thor'}],\n",
372 | " 'id': 3,\n",
373 | " 'name': 'Chi'}],\n",
374 | " 'id': 1,\n",
375 | " 'name': 'Dunn'},\n",
376 | " {'friends': [{...},\n",
377 | " {'friends': [{...},\n",
378 | " {...},\n",
379 | " {'friends': [{...},\n",
380 | " {...},\n",
381 | " {'friends': [{...},\n",
382 | " {'friends': [{...},\n",
383 | " {'friends': [{...},\n",
384 | " {'friends': [{...},\n",
385 | " {'friends': [{...}, {...}], 'id': 7, 'name': 'Devin'},\n",
386 | " {'friends': [{...}], 'id': 9, 'name': 'Klein'}],\n",
387 | " 'id': 8,\n",
388 | " 'name': 'Kate'}],\n",
389 | " 'id': 6,\n",
390 | " 'name': 'Hicks'},\n",
391 | " {'friends': [{...},\n",
392 | " {'friends': [{'friends': [{...}, {...}],\n",
393 | " 'id': 6,\n",
394 | " 'name': 'Hicks'},\n",
395 | " {...},\n",
396 | " {'friends': [{...}], 'id': 9, 'name': 'Klein'}],\n",
397 | " 'id': 8,\n",
398 | " 'name': 'Kate'}],\n",
399 | " 'id': 7,\n",
400 | " 'name': 'Devin'}],\n",
401 | " 'id': 5,\n",
402 | " 'name': 'Clive'}],\n",
403 | " 'id': 4,\n",
404 | " 'name': 'Thor'}],\n",
405 | " 'id': 3,\n",
406 | " 'name': 'Chi'}],\n",
407 | " 'id': 1,\n",
408 | " 'name': 'Dunn'},\n",
409 | " {'friends': [{'friends': [{...}, {...}, {...}], 'id': 1, 'name': 'Dunn'},\n",
410 | " {...},\n",
411 | " {'friends': [{...},\n",
412 | " {'friends': [{...},\n",
413 | " {'friends': [{...},\n",
414 | " {'friends': [{...},\n",
415 | " {'friends': [{...}, {...}], 'id': 7, 'name': 'Devin'},\n",
416 | " {'friends': [{...}], 'id': 9, 'name': 'Klein'}],\n",
417 | " 'id': 8,\n",
418 | " 'name': 'Kate'}],\n",
419 | " 'id': 6,\n",
420 | " 'name': 'Hicks'},\n",
421 | " {'friends': [{...},\n",
422 | " {'friends': [{'friends': [{...}, {...}], 'id': 6, 'name': 'Hicks'},\n",
423 | " {...},\n",
424 | " {'friends': [{...}], 'id': 9, 'name': 'Klein'}],\n",
425 | " 'id': 8,\n",
426 | " 'name': 'Kate'}],\n",
427 | " 'id': 7,\n",
428 | " 'name': 'Devin'}],\n",
429 | " 'id': 5,\n",
430 | " 'name': 'Clive'}],\n",
431 | " 'id': 4,\n",
432 | " 'name': 'Thor'}],\n",
433 | " 'id': 3,\n",
434 | " 'name': 'Chi'}],\n",
435 | " 'id': 2,\n",
436 | " 'name': 'Sue'}],\n",
437 | " 'id': 0,\n",
438 | " 'name': 'Hero'}"
439 | ]
440 | },
441 | "execution_count": 56,
442 | "metadata": {},
443 | "output_type": "execute_result"
444 | }
445 | ],
446 | "source": [
447 | "users[0]"
448 | ]
449 | },
450 | {
451 | "cell_type": "markdown",
452 | "metadata": {},
453 | "source": [
454 | "Hero도 자신의 친구의 친구이므로 사용자가 0 (자기자신 포함)이 두 번 포함되어 있다. 그리고 이미 Hero와 친구인 사용자 1과 2도 포함되어 있는 것을 볼 수 있다. Chi(id 3)는 두 명의 친구와 친구이기 때문에 두 번 포함되어 있다. "
455 | ]
456 | },
457 | {
458 | "cell_type": "code",
459 | "execution_count": 57,
460 | "metadata": {
461 | "collapsed": false
462 | },
463 | "outputs": [
464 | {
465 | "name": "stdout",
466 | "output_type": "stream",
467 | "text": [
468 | "[1, 2]\n",
469 | "[0, 2, 3]\n",
470 | "[0, 1, 3]\n"
471 | ]
472 | }
473 | ],
474 | "source": [
475 | "print [friend[\"id\"] for friend in users[0][\"friends\"]] # [1, 2]\n",
476 | "print [friend[\"id\"] for friend in users[1][\"friends\"]] # [0, 2, 3]\n",
477 | "print [friend[\"id\"] for friend in users[2][\"friends\"]] # [0, 1, 3]"
478 | ]
479 | },
480 | {
481 | "cell_type": "markdown",
482 | "metadata": {},
483 | "source": [
484 | "사용자들이 이미 여러분의 친구들로 연결되어 있다는 점이 흥미롭다. 그렇다면 이번에는 서로가 함께 하는 친구가 몇 명인지 세어볼까? 동시에 사용자가 이미 아는 사람을 제외하는 함수를 만들자"
485 | ]
486 | },
487 | {
488 | "cell_type": "code",
489 | "execution_count": 58,
490 | "metadata": {
491 | "collapsed": false
492 | },
493 | "outputs": [
494 | {
495 | "name": "stdout",
496 | "output_type": "stream",
497 | "text": [
498 | "Counter({0: 2, 5: 1})\n"
499 | ]
500 | }
501 | ],
502 | "source": [
503 | "from collections import Counter # 별도로 import해 주어야 함\n",
504 | "\n",
505 | "def not_the_same(user, other_user):\n",
506 | " \"\"\"two users are not the same if they have different ids\"\"\"\n",
507 | " return user[\"id\"] != other_user[\"id\"]\n",
508 | "\n",
509 | "def not_friends(user, other_user):\n",
510 | " \"\"\"other_user is not a friend if he's not in user[\"friends\"];\n",
511 | " that is, if he's not_the_same as all the people in user[\"friends\"]\"\"\"\n",
512 | " return all(not_the_same(friend, other_user)\n",
513 | " for friend in user[\"friends\"])\n",
514 | "\n",
515 | "def friends_of_friend_ids(user):\n",
516 | " return Counter(foaf[\"id\"]\n",
517 | " for friend in user[\"friends\"] # 사용자의 친구 개개인에 대해\n",
518 | " for foaf in friend[\"friends\"] # 그들의 친구들을 세어 보고\n",
519 | " if not_the_same(user, foaf) # 그중에서 자신과\n",
520 | " and not_friends(user, foaf)) # 사용자의 친구가 아닌 사람은 제외\n",
521 | "\n",
522 | "print friends_of_friend_ids(users[3]) # Counter({0: 2, 5: 1})\n"
523 | ]
524 | },
525 | {
526 | "cell_type": "markdown",
527 | "metadata": {},
528 | "source": [
529 | "이제 Chi(id: 3)는 Hero(id: 0)와 함께 아는 친구가 두 명이고 Chive(id: 5)와 함께 아는 친구가 한 명이라는 것을 알 수 있다.\n"
530 | ]
531 | },
532 | {
533 | "cell_type": "markdown",
534 | "metadata": {},
535 | "source": [
536 | "데이터를 꾸준히 보다 보니 데이터 과학자의 직감에 따라 비슷한 관심사를 가지 ㄴ사람을 소개 받으면 기분이 좋을 것 같다는 생각이 든다.(도메인 전문성) 당신은 주변 직원 몇 명에게 물어 보고 나서 관심사 데이터(interests)를 손에 넣었다. 이 데이터는 사용자 고유 번호 id와 관심사(interest)의 쌍으로 구성되어 있다."
537 | ]
538 | },
539 | {
540 | "cell_type": "code",
541 | "execution_count": 59,
542 | "metadata": {
543 | "collapsed": true
544 | },
545 | "outputs": [],
546 | "source": [
547 | "interests = [\n",
548 | " (0, \"Hadoop\"), (0, \"Big Data\"), (0, \"HBase\"), (0, \"Java\"),\n",
549 | " (0, \"Spark\"), (0, \"Storm\"), (0, \"Cassandra\"),\n",
550 | " (1, \"NoSQL\"), (1, \"MongoDB\"), (1, \"Cassandra\"), (1, \"HBase\"),\n",
551 | " (1, \"Postgres\"), (2, \"Python\"), (2, \"scikit-learn\"), (2, \"scipy\"),\n",
552 | " (2, \"numpy\"), (2, \"statsmodels\"), (2, \"pandas\"), (3, \"R\"), (3, \"Python\"),\n",
553 | " (3, \"statistics\"), (3, \"regression\"), (3, \"probability\"),\n",
554 | " (4, \"machine learning\"), (4, \"regression\"), (4, \"decision trees\"),\n",
555 | " (4, \"libsvm\"), (5, \"Python\"), (5, \"R\"), (5, \"Java\"), (5, \"C++\"),\n",
556 | " (5, \"Haskell\"), (5, \"programming languages\"), (6, \"statistics\"),\n",
557 | " (6, \"probability\"), (6, \"mathematics\"), (6, \"theory\"),\n",
558 | " (7, \"machine learning\"), (7, \"scikit-learn\"), (7, \"Mahout\"),\n",
559 | " (7, \"neural networks\"), (8, \"neural networks\"), (8, \"deep learning\"),\n",
560 | " (8, \"Big Data\"), (8, \"artificial intelligence\"), (9, \"Hadoop\"),\n",
561 | " (9, \"Java\"), (9, \"MapReduce\"), (9, \"Big Data\")\n",
562 | "]\n"
563 | ]
564 | },
565 | {
566 | "cell_type": "markdown",
567 | "metadata": {},
568 | "source": [
569 | "예를 들어 Hero(id:0)와 Kate(id: 8)는 함께 아는 친구가 한 명도 없지만 빅테이터라는 공통된 관심사를 갖고 있다. \n",
570 | "특정 관심사를 공유하는 사용자들을 찾아 주는 함수를 만드는 것도 그리 어렵지 않다."
571 | ]
572 | },
573 | {
574 | "cell_type": "code",
575 | "execution_count": 60,
576 | "metadata": {
577 | "collapsed": true
578 | },
579 | "outputs": [],
580 | "source": [
581 | "def data_scientists_who_like(target_interest):\n",
582 | " return [user_id\n",
583 | " for user_id, user_interest in interests\n",
584 | " if user_interest == target_interest]\n"
585 | ]
586 | },
587 | {
588 | "cell_type": "markdown",
589 | "metadata": {},
590 | "source": [
591 | "그러나 이 코드는 호출할 때마다 관심사 데이터를 매번 처음부터 끝까지 훑어야 한다는 단점이 있다. 사용자 수가 많고 그들의 관심사가 많다면(또는 데이터를 여러 번 훑을거라면) 각 관심사에 대한 사용자 인텍스를 만드는 것이 나을지 모른다. "
592 | ]
593 | },
594 | {
595 | "cell_type": "code",
596 | "execution_count": 61,
597 | "metadata": {
598 | "collapsed": true
599 | },
600 | "outputs": [],
601 | "source": [
602 | "from collections import defaultdict\n",
603 | "\n",
604 | "# keys가 interests, values가 사용자 id\n",
605 | "user_ids_by_interest = defaultdict(list)\n",
606 | "\n",
607 | "for user_id, interest in interests:\n",
608 | " user_ids_by_interest[interest].append(user_id)\n",
609 | "\n",
610 | "# keys가 사용자 ids, values가 관심사\n",
611 | "interests_by_user_id = defaultdict(list)\n",
612 | "\n",
613 | "for user_id, interest in interests:\n",
614 | " interests_by_user_id[user_id].append(interest)\n"
615 | ]
616 | },
617 | {
618 | "cell_type": "markdown",
619 | "metadata": {},
620 | "source": [
621 | "이제 특정한 사용자가 주어졌을 때 사용자와 가장 유사한 관심사를 가진 사람이 누구인지 다음의 3단계로 알 수 있다. \n",
622 | "\n",
623 | "-해당 사용자의 관심사들을 훑는다.\n",
624 | "-각 관심사를 가진 다른 사용자들이 누구인지 찾아본다.\n",
625 | "-다른 사용자들이 몇 번이나 등장하는지 센다."
626 | ]
627 | },
628 | {
629 | "cell_type": "code",
630 | "execution_count": 62,
631 | "metadata": {
632 | "collapsed": true
633 | },
634 | "outputs": [],
635 | "source": [
636 | "\n",
637 | "def most_common_interests_with(user_id):\n",
638 | " return Counter(interested_user_id\n",
639 | " for interest in interests_by_user[\"user_id\"]\n",
640 | " for interested_user_id in users_by_interest[interest]\n",
641 | " if interested_user_id != user_id)\n"
642 | ]
643 | },
644 | {
645 | "cell_type": "markdown",
646 | "metadata": {},
647 | "source": [
648 | "함께 아는 친구와 공통된 관심사 정보를 동시에 이용하면 데이터 과학자 추천 시스템의 성능을 더욱 높을 수 있을 것이다. "
649 | ]
650 | },
651 | {
652 | "cell_type": "markdown",
653 | "metadata": {},
654 | "source": [
655 | "1.3.3. 연봉과 경력"
656 | ]
657 | },
658 | {
659 | "cell_type": "markdown",
660 | "metadata": {},
661 | "source": [
662 | "연봉과 근속기간 시각화 "
663 | ]
664 | },
665 | {
666 | "cell_type": "code",
667 | "execution_count": 64,
668 | "metadata": {
669 | "collapsed": true
670 | },
671 | "outputs": [],
672 | "source": [
673 | "salaries_and_tenures = [(83000, 8.7), (88000, 8.1),\n",
674 | " (48000, 0.7), (76000, 6),\n",
675 | " (69000, 6.5), (76000, 7.5),\n",
676 | " (60000, 2.5), (83000, 10),\n",
677 | " (48000, 1.9), (63000, 4.2)]"
678 | ]
679 | },
680 | {
681 | "cell_type": "code",
682 | "execution_count": 68,
683 | "metadata": {
684 | "collapsed": true
685 | },
686 | "outputs": [],
687 | "source": [
688 | "import matplotlib.pyplot as plt\n",
689 | "%matplotlib inline"
690 | ]
691 | },
692 | {
693 | "cell_type": "code",
694 | "execution_count": 69,
695 | "metadata": {
696 | "collapsed": false
697 | },
698 | "outputs": [
699 | {
700 | "data": {
701 | "text/plain": [
702 | ""
703 | ]
704 | },
705 | "execution_count": 69,
706 | "metadata": {},
707 | "output_type": "execute_result"
708 | },
709 | {
710 | "data": {
711 | "image/png": "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\ngg==\n",
712 | "text/plain": [
713 | ""
714 | ]
715 | },
716 | "metadata": {},
717 | "output_type": "display_data"
718 | }
719 | ],
720 | "source": [
721 | "x,y = zip(*salaries_and_tenures)\n",
722 | "plt.scatter(x,y)"
723 | ]
724 | },
725 | {
726 | "cell_type": "markdown",
727 | "metadata": {},
728 | "source": [
729 | "감사합니다. "
730 | ]
731 | },
732 | {
733 | "cell_type": "markdown",
734 | "metadata": {},
735 | "source": [
736 | "마크다운 팁: 표 만들기 http://www.tablesgenerator.com/markdown_tables\n",
737 | "파이썬 한글처리: http://amornatura.tistory.com/104"
738 | ]
739 | }
740 | ],
741 | "metadata": {
742 | "kernelspec": {
743 | "display_name": "Python 2",
744 | "language": "python",
745 | "name": "python2"
746 | },
747 | "language_info": {
748 | "codemirror_mode": {
749 | "name": "ipython",
750 | "version": 2
751 | },
752 | "file_extension": ".py",
753 | "mimetype": "text/x-python",
754 | "name": "python",
755 | "nbconvert_exporter": "python",
756 | "pygments_lexer": "ipython2",
757 | "version": "2.7.10"
758 | }
759 | },
760 | "nbformat": 4,
761 | "nbformat_minor": 0
762 | }
763 |
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/밑바닥/data science from scratch/_DS_Store:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/밑바닥/data science from scratch/_DS_Store
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/밑바닥/data science from scratch/a.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/밑바닥/data science from scratch/a.png
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/밑바닥/data science from scratch/b.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/밑바닥/data science from scratch/b.png
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/밑바닥/data science from scratch/c.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/밑바닥/data science from scratch/c.png
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/밑바닥/data science from scratch/data.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/밑바닥/data science from scratch/data.png
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/송영숙 파이썬 통계 자료/brain_size.csv:
--------------------------------------------------------------------------------
1 | "";"Gender";"FSIQ";"VIQ";"PIQ";"Weight";"Height";"MRI_Count"
2 | "1";"Female";133;132;124;"118";"64.5";816932
3 | "2";"Male";140;150;124;".";"72.5";1001121
4 | "3";"Male";139;123;150;"143";"73.3";1038437
5 | "4";"Male";133;129;128;"172";"68.8";965353
6 | "5";"Female";137;132;134;"147";"65.0";951545
7 | "6";"Female";99;90;110;"146";"69.0";928799
8 | "7";"Female";138;136;131;"138";"64.5";991305
9 | "8";"Female";92;90;98;"175";"66.0";854258
10 | "9";"Male";89;93;84;"134";"66.3";904858
11 | "10";"Male";133;114;147;"172";"68.8";955466
12 | "11";"Female";132;129;124;"118";"64.5";833868
13 | "12";"Male";141;150;128;"151";"70.0";1079549
14 | "13";"Male";135;129;124;"155";"69.0";924059
15 | "14";"Female";140;120;147;"155";"70.5";856472
16 | "15";"Female";96;100;90;"146";"66.0";878897
17 | "16";"Female";83;71;96;"135";"68.0";865363
18 | "17";"Female";132;132;120;"127";"68.5";852244
19 | "18";"Male";100;96;102;"178";"73.5";945088
20 | "19";"Female";101;112;84;"136";"66.3";808020
21 | "20";"Male";80;77;86;"180";"70.0";889083
22 | "21";"Male";83;83;86;".";".";892420
23 | "22";"Male";97;107;84;"186";"76.5";905940
24 | "23";"Female";135;129;134;"122";"62.0";790619
25 | "24";"Male";139;145;128;"132";"68.0";955003
26 | "25";"Female";91;86;102;"114";"63.0";831772
27 | "26";"Male";141;145;131;"171";"72.0";935494
28 | "27";"Female";85;90;84;"140";"68.0";798612
29 | "28";"Male";103;96;110;"187";"77.0";1062462
30 | "29";"Female";77;83;72;"106";"63.0";793549
31 | "30";"Female";130;126;124;"159";"66.5";866662
32 | "31";"Female";133;126;132;"127";"62.5";857782
33 | "32";"Male";144;145;137;"191";"67.0";949589
34 | "33";"Male";103;96;110;"192";"75.5";997925
35 | "34";"Male";90;96;86;"181";"69.0";879987
36 | "35";"Female";83;90;81;"143";"66.5";834344
37 | "36";"Female";133;129;128;"153";"66.5";948066
38 | "37";"Male";140;150;124;"144";"70.5";949395
39 | "38";"Female";88;86;94;"139";"64.5";893983
40 | "39";"Male";81;90;74;"148";"74.0";930016
41 | "40";"Male";89;91;89;"179";"75.5";935863
42 |
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/파이썬으로시작하는수학/파이썬으로 풀어보는 수학, 2장.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/파이썬으로시작하는수학/파이썬으로 풀어보는 수학, 2장.docx
--------------------------------------------------------------------------------
/시즌4 발표자료 저장소/황윤연 특강자료/서울시 지하철 호선별 역별 시간대별 승하차 인원 정보.xls:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/simplexcomplexity/complexscience/d679aeb94ff3c5a08864c30f46e2a31317f18780/시즌4 발표자료 저장소/황윤연 특강자료/서울시 지하철 호선별 역별 시간대별 승하차 인원 정보.xls
--------------------------------------------------------------------------------