├── 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 | "![](https://cdn.css-tricks.com/wp-content/uploads/2016/05/ease-in-out.gif)\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 | "![](http://natureofcode.com/book/imgs/chapter03/ch03_01.png)\n", 21 | "\n", 22 | "* 다음은 45도로 돌은 사각형\n", 23 | "![](http://natureofcode.com/book/imgs/chapter03/ch03_02.png)\n", 24 | "\n", 25 | "### Radian\n", 26 | "\n", 27 | "* 1라디안은 '호의 길이'와 '반지름'의 길이가 같아지는 시점의 각도\n", 28 | "* 180도 = $\\pi$라디안, 360도 = $2\\pi$, 90도 = $\\frac{\\pi}{2}$\n", 29 | "![](http://natureofcode.com/book/imgs/chapter03/ch03_03.png)\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 | "![](http://natureofcode.com/book/imgs/chapter03/ch03_04.png)\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 | "![](http://natureofcode.com/book/imgs/chapter03/ch03_06.png)\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 | "![](http://natureofcode.com/book/imgs/chapter03/ch03_08.png)\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 | "![Sin 그래프](http://natureofcode.com/book/imgs/chapter03/ch03_09.png)\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 | "![](http://natureofcode.com/book/imgs/chapter03/ch03_10.png)\n", 165 | "![](http://natureofcode.com/book/imgs/chapter03/ch03_11.png)\n", 166 | "![](http://natureofcode.com/book/imgs/chapter03/ch03_12.png)" 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 | "![](http://natureofcode.com/book/imgs/chapter03/ch03_14.png)\n", 184 | "\n", 185 | "* 용수철의 힘은 용수철이 늘어나는 길이와 정비례한다.\n", 186 | "* $F=-kx$\n", 187 | "\n", 188 | "![](http://natureofcode.com/book/imgs/chapter03/ch03_15.png)\n", 189 | "\n", 190 | "* k는 용수철의 탄성을 나타내는 상수입니다. 스프링의 탄성이 강하면 높고, 약하면 낮습니다.\n", 191 | "* x는 용수철의 변위(기본 길이와 정지 시점에서의 길이의 차이)를 나타냅니다. 이때 기본 길이는 원래 용수철이 평형 상태(그냥 두었을 때)의 길이를 나타냅니다.\n", 192 | "\n", 193 | "![](http://natureofcode.com/book/imgs/chapter03/ch03_16.png)\n", 194 | "\n", 195 | "![](http://natureofcode.com/book/imgs/chapter03/ch03_17.png)\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 --------------------------------------------------------------------------------