├── .idea ├── .gitignore ├── CodesNotes.iml ├── misc.xml ├── modules.xml └── vcs.xml ├── Data_analysis ├── category_features_process_notes.ipynb └── pandas_example.ipynb ├── DeepLearningFromScratch ├── README.md ├── ch03 │ ├── activation_function.py │ ├── mnist_show.py │ ├── neural_net.py │ ├── neuralnet_mnist.py │ ├── neuralnet_mnist_batch.py │ └── sample_weight.pkl ├── common │ ├── __init__.py │ └── functions.py ├── dataset │ ├── __init__.py │ ├── mnist.py │ ├── t10k-images-idx3-ubyte.gz │ ├── t10k-labels-idx1-ubyte.gz │ ├── train-images-idx3-ubyte.gz │ └── train-labels-idx1-ubyte.gz └── images │ ├── relu_function.png │ ├── sig_step_compare.png │ ├── sigmoid_function_image.png │ └── step_function_image.png ├── FluentPython └── 1_Python数据模型.ipynb ├── MachineLearningCodes ├── Loss_functions_practise.py ├── Perfermance_measures.py └── machineLearning_Python │ ├── README.md │ ├── basic_cnn.py │ ├── classify_images.py │ ├── classify_irs.py │ └── nn_iris.py ├── Maths ├── Binary.py ├── __init__.py └── lesson_iterations.py ├── PythonNotes ├── matplotlib_notes.ipynb ├── plane.jpg ├── plane.png └── png2jpg.ipynb ├── Python_100_examples ├── README.md ├── example1.py ├── example2.py ├── example3.py ├── example4.py ├── example5.py ├── example6-7.py └── example8.py ├── Python_cheatsheet ├── String_const_to_variable.py ├── basic_practise.py ├── dict_example.py ├── list_example.py ├── set_example.py ├── statement_example.py ├── string_example.py └── tuple_example.py ├── README.md ├── RecommendSystemStudy ├── .idea │ └── RecommendSystemStudy.iml ├── data_norm.py └── netflix_movies_recommend_system.py ├── hands_on_ml_with_tf_and_sklearn ├── FeatureEngineering.ipynb └── chapter02.ipynb ├── opencv_notes ├── Skewed-text-image.png ├── car.jpg ├── circle.png ├── example.jpg ├── opencv_bg.png ├── opencv_contour_example.png ├── opencv_image_process_tutorial.ipynb ├── pycolor.png └── pytext.png ├── python_tricks_example.ipynb └── tools └── RandomNums.py /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /workspace.xml -------------------------------------------------------------------------------- /.idea/CodesNotes.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Data_analysis/pandas_example.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### pandas 学习代码" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "#### 读取数据" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 1, 20 | "metadata": {}, 21 | "outputs": [], 22 | "source": [ 23 | "import pandas as pd" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "execution_count": 2, 29 | "metadata": {}, 30 | "outputs": [ 31 | { 32 | "data": { 33 | "text/html": [ 34 | "
\n", 35 | "\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 | " \n", 61 | " \n", 62 | " \n", 63 | " \n", 64 | " \n", 65 | " \n", 66 | " \n", 67 | " \n", 68 | " \n", 69 | " \n", 70 | " \n", 71 | " \n", 72 | " \n", 73 | " \n", 74 | " \n", 75 | " \n", 76 | " \n", 77 | " \n", 78 | " \n", 79 | " \n", 80 | " \n", 81 | " \n", 82 | " \n", 83 | " \n", 84 | " \n", 85 | " \n", 86 | " \n", 87 | " \n", 88 | " \n", 89 | " \n", 90 | " \n", 91 | " \n", 92 | " \n", 93 | " \n", 94 | " \n", 95 | " \n", 96 | " \n", 97 | " \n", 98 | " \n", 99 | " \n", 100 | " \n", 101 | " \n", 102 | " \n", 103 | " \n", 104 | " \n", 105 | " \n", 106 | " \n", 107 | " \n", 108 | " \n", 109 | " \n", 110 | " \n", 111 | " \n", 112 | " \n", 113 | " \n", 114 | " \n", 115 | " \n", 116 | " \n", 117 | " \n", 118 | " \n", 119 | " \n", 120 | " \n", 121 | " \n", 122 | " \n", 123 | " \n", 124 | " \n", 125 | " \n", 126 | " \n", 127 | " \n", 128 | " \n", 129 | " \n", 130 | " \n", 131 | " \n", 132 | " \n", 133 | "
nameagescorereboundsassiststealsblock
0kk2332.15.13.41.20.9
1sc2430.15.57.11.80.5
2ta2527.23.32.10.91.0
3js2627.88.910.11.41.2
4jn2733.04.212.31.10.9
5iw2825.14.25.11.20.3
6dcc2922.05.58.11.30.8
\n", 134 | "
" 135 | ], 136 | "text/plain": [ 137 | " name age score rebounds assist steals block\n", 138 | "0 kk 23 32.1 5.1 3.4 1.2 0.9\n", 139 | "1 sc 24 30.1 5.5 7.1 1.8 0.5\n", 140 | "2 ta 25 27.2 3.3 2.1 0.9 1.0\n", 141 | "3 js 26 27.8 8.9 10.1 1.4 1.2\n", 142 | "4 jn 27 33.0 4.2 12.3 1.1 0.9\n", 143 | "5 iw 28 25.1 4.2 5.1 1.2 0.3\n", 144 | "6 dcc 29 22.0 5.5 8.1 1.3 0.8" 145 | ] 146 | }, 147 | "execution_count": 2, 148 | "metadata": {}, 149 | "output_type": "execute_result" 150 | } 151 | ], 152 | "source": [ 153 | "# 正常读取文件\n", 154 | "df = pd.read_csv('./ba.csv')\n", 155 | "df" 156 | ] 157 | }, 158 | { 159 | "cell_type": "code", 160 | "execution_count": 3, 161 | "metadata": {}, 162 | "outputs": [ 163 | { 164 | "data": { 165 | "text/html": [ 166 | "
\n", 167 | "\n", 180 | "\n", 181 | " \n", 182 | " \n", 183 | " \n", 184 | " \n", 185 | " \n", 186 | " \n", 187 | " \n", 188 | " \n", 189 | " \n", 190 | " \n", 191 | " \n", 192 | " \n", 193 | " \n", 194 | " \n", 195 | " \n", 196 | " \n", 197 | " \n", 198 | " \n", 199 | " \n", 200 | " \n", 201 | " \n", 202 | " \n", 203 | " \n", 204 | " \n", 205 | " \n", 206 | " \n", 207 | " \n", 208 | " \n", 209 | " \n", 210 | " \n", 211 | " \n", 212 | " \n", 213 | " \n", 214 | " \n", 215 | " \n", 216 | " \n", 217 | " \n", 218 | " \n", 219 | " \n", 220 | " \n", 221 | " \n", 222 | " \n", 223 | " \n", 224 | " \n", 225 | " \n", 226 | " \n", 227 | " \n", 228 | " \n", 229 | " \n", 230 | " \n", 231 | " \n", 232 | " \n", 233 | " \n", 234 | " \n", 235 | " \n", 236 | " \n", 237 | " \n", 238 | " \n", 239 | " \n", 240 | " \n", 241 | " \n", 242 | " \n", 243 | " \n", 244 | " \n", 245 | "
nameagescorereboundsassiststealsblock
0kk2332.15.13.41.20.9
1sc2430.15.57.11.80.5
2ta2527.23.32.10.91.0
3js2627.88.910.11.41.2
4jn2733.04.212.31.10.9
\n", 246 | "
" 247 | ], 248 | "text/plain": [ 249 | " name age score rebounds assist steals block\n", 250 | "0 kk 23 32.1 5.1 3.4 1.2 0.9\n", 251 | "1 sc 24 30.1 5.5 7.1 1.8 0.5\n", 252 | "2 ta 25 27.2 3.3 2.1 0.9 1.0\n", 253 | "3 js 26 27.8 8.9 10.1 1.4 1.2\n", 254 | "4 jn 27 33.0 4.2 12.3 1.1 0.9" 255 | ] 256 | }, 257 | "execution_count": 3, 258 | "metadata": {}, 259 | "output_type": "execute_result" 260 | } 261 | ], 262 | "source": [ 263 | "# 仅读取前5行数据\n", 264 | "df2 = pd.read_csv('./ba.csv', nrows=5)\n", 265 | "df2" 266 | ] 267 | }, 268 | { 269 | "cell_type": "code", 270 | "execution_count": 5, 271 | "metadata": {}, 272 | "outputs": [ 273 | { 274 | "data": { 275 | "text/plain": [ 276 | "float64 5\n", 277 | "object 1\n", 278 | "int64 1\n", 279 | "dtype: int64" 280 | ] 281 | }, 282 | "execution_count": 5, 283 | "metadata": {}, 284 | "output_type": "execute_result" 285 | } 286 | ], 287 | "source": [ 288 | "# 查看每列数据类型的分布\n", 289 | "df.dtypes.value_counts()" 290 | ] 291 | }, 292 | { 293 | "cell_type": "code", 294 | "execution_count": 6, 295 | "metadata": {}, 296 | "outputs": [ 297 | { 298 | "data": { 299 | "text/html": [ 300 | "
\n", 301 | "\n", 314 | "\n", 315 | " \n", 316 | " \n", 317 | " \n", 318 | " \n", 319 | " \n", 320 | " \n", 321 | " \n", 322 | " \n", 323 | " \n", 324 | " \n", 325 | " \n", 326 | " \n", 327 | " \n", 328 | " \n", 329 | " \n", 330 | " \n", 331 | " \n", 332 | " \n", 333 | " \n", 334 | " \n", 335 | " \n", 336 | " \n", 337 | " \n", 338 | " \n", 339 | " \n", 340 | " \n", 341 | " \n", 342 | " \n", 343 | " \n", 344 | " \n", 345 | " \n", 346 | " \n", 347 | " \n", 348 | " \n", 349 | " \n", 350 | " \n", 351 | " \n", 352 | " \n", 353 | " \n", 354 | " \n", 355 | " \n", 356 | " \n", 357 | " \n", 358 | " \n", 359 | " \n", 360 | " \n", 361 | " \n", 362 | " \n", 363 | " \n", 364 | " \n", 365 | " \n", 366 | " \n", 367 | " \n", 368 | " \n", 369 | " \n", 370 | " \n", 371 | " \n", 372 | " \n", 373 | " \n", 374 | " \n", 375 | " \n", 376 | " \n", 377 | " \n", 378 | " \n", 379 | " \n", 380 | " \n", 381 | " \n", 382 | " \n", 383 | " \n", 384 | " \n", 385 | " \n", 386 | " \n", 387 | " \n", 388 | " \n", 389 | " \n", 390 | " \n", 391 | "
agescorereboundsassiststealsblock
02332.15.13.41.20.9
12430.15.57.11.80.5
22527.23.32.10.91.0
32627.88.910.11.41.2
42733.04.212.31.10.9
52825.14.25.11.20.3
62922.05.58.11.30.8
\n", 392 | "
" 393 | ], 394 | "text/plain": [ 395 | " age score rebounds assist steals block\n", 396 | "0 23 32.1 5.1 3.4 1.2 0.9\n", 397 | "1 24 30.1 5.5 7.1 1.8 0.5\n", 398 | "2 25 27.2 3.3 2.1 0.9 1.0\n", 399 | "3 26 27.8 8.9 10.1 1.4 1.2\n", 400 | "4 27 33.0 4.2 12.3 1.1 0.9\n", 401 | "5 28 25.1 4.2 5.1 1.2 0.3\n", 402 | "6 29 22.0 5.5 8.1 1.3 0.8" 403 | ] 404 | }, 405 | "execution_count": 6, 406 | "metadata": {}, 407 | "output_type": "execute_result" 408 | } 409 | ], 410 | "source": [ 411 | "# 选择特定类型,select_dtypes\n", 412 | "df3 = df.select_dtypes(include=['int64', 'float64'])\n", 413 | "df3" 414 | ] 415 | }, 416 | { 417 | "cell_type": "markdown", 418 | "metadata": {}, 419 | "source": [ 420 | "### 创建 dataframe\n", 421 | "\n", 422 | "https://stackoverflow.com/questions/18837262/convert-python-dict-into-a-dataframe" 423 | ] 424 | }, 425 | { 426 | "cell_type": "code", 427 | "execution_count": 3, 428 | "metadata": {}, 429 | "outputs": [ 430 | { 431 | "data": { 432 | "text/html": [ 433 | "
\n", 434 | "\n", 447 | "\n", 448 | " \n", 449 | " \n", 450 | " \n", 451 | " \n", 452 | " \n", 453 | " \n", 454 | " \n", 455 | " \n", 456 | " \n", 457 | " \n", 458 | " \n", 459 | " \n", 460 | " \n", 461 | " \n", 462 | " \n", 463 | " \n", 464 | " \n", 465 | " \n", 466 | " \n", 467 | " \n", 468 | " \n", 469 | " \n", 470 | " \n", 471 | " \n", 472 | " \n", 473 | " \n", 474 | " \n", 475 | " \n", 476 | " \n", 477 | " \n", 478 | " \n", 479 | " \n", 480 | "
accountjanfebmar
0Jones150200140
1Alpha200210215
2Blue509095
\n", 481 | "
" 482 | ], 483 | "text/plain": [ 484 | " account jan feb mar\n", 485 | "0 Jones 150 200 140\n", 486 | "1 Alpha 200 210 215\n", 487 | "2 Blue 50 90 95" 488 | ] 489 | }, 490 | "execution_count": 3, 491 | "metadata": {}, 492 | "output_type": "execute_result" 493 | } 494 | ], 495 | "source": [ 496 | "# dict,默认方式\n", 497 | "sales = [{'account': 'Jones', 'jan': 150, 'feb': 200, 'mar': 140},\n", 498 | " {'account': 'Alpha', 'jan': 200, 'feb': 210, 'mar': 215},\n", 499 | " {'account': 'Blue', 'jan': 50, 'feb': 90, 'mar': 95}]\n", 500 | "df = pd.DataFrame(sales)\n", 501 | "df" 502 | ] 503 | }, 504 | { 505 | "cell_type": "code", 506 | "execution_count": 5, 507 | "metadata": {}, 508 | "outputs": [ 509 | { 510 | "data": { 511 | "text/html": [ 512 | "
\n", 513 | "\n", 526 | "\n", 527 | " \n", 528 | " \n", 529 | " \n", 530 | " \n", 531 | " \n", 532 | " \n", 533 | " \n", 534 | " \n", 535 | " \n", 536 | " \n", 537 | " \n", 538 | " \n", 539 | " \n", 540 | " \n", 541 | " \n", 542 | " \n", 543 | " \n", 544 | " \n", 545 | " \n", 546 | " \n", 547 | " \n", 548 | " \n", 549 | " \n", 550 | " \n", 551 | " \n", 552 | " \n", 553 | " \n", 554 | " \n", 555 | " \n", 556 | " \n", 557 | " \n", 558 | " \n", 559 | "
accountjanfebmar
0Jones150200140
1Alpha200210215
2Blue509095
\n", 560 | "
" 561 | ], 562 | "text/plain": [ 563 | " account jan feb mar\n", 564 | "0 Jones 150 200 140\n", 565 | "1 Alpha 200 210 215\n", 566 | "2 Blue 50 90 95" 567 | ] 568 | }, 569 | "execution_count": 5, 570 | "metadata": {}, 571 | "output_type": "execute_result" 572 | } 573 | ], 574 | "source": [ 575 | "# from_dict\n", 576 | "sales = {'account': ['Jones', 'Alpha', 'Blue'], \n", 577 | " 'jan': [150, 200, 50], \n", 578 | " 'feb': [200, 210, 90], \n", 579 | " 'mar': [140, 215, 95]}\n", 580 | "df = pd.DataFrame.from_dict(sales)\n", 581 | "df" 582 | ] 583 | }, 584 | { 585 | "cell_type": "code", 586 | "execution_count": 6, 587 | "metadata": {}, 588 | "outputs": [ 589 | { 590 | "data": { 591 | "text/html": [ 592 | "
\n", 593 | "\n", 606 | "\n", 607 | " \n", 608 | " \n", 609 | " \n", 610 | " \n", 611 | " \n", 612 | " \n", 613 | " \n", 614 | " \n", 615 | " \n", 616 | " \n", 617 | " \n", 618 | " \n", 619 | " \n", 620 | " \n", 621 | " \n", 622 | " \n", 623 | " \n", 624 | " \n", 625 | " \n", 626 | " \n", 627 | " \n", 628 | " \n", 629 | " \n", 630 | " \n", 631 | " \n", 632 | " \n", 633 | " \n", 634 | " \n", 635 | " \n", 636 | " \n", 637 | " \n", 638 | " \n", 639 | "
accountjanfebmar
0Jones150200140
1Alpha200210215
2Blue509095
\n", 640 | "
" 641 | ], 642 | "text/plain": [ 643 | " account jan feb mar\n", 644 | "0 Jones 150 200 140\n", 645 | "1 Alpha 200 210 215\n", 646 | "2 Blue 50 90 95" 647 | ] 648 | }, 649 | "execution_count": 6, 650 | "metadata": {}, 651 | "output_type": "execute_result" 652 | } 653 | ], 654 | "source": [ 655 | "# list,采用函数 from_records\n", 656 | "sales = [('Jones', 150, 200, 140),\n", 657 | " ('Alpha', 200, 210, 215),\n", 658 | " ('Blue', 50, 90, 95)]\n", 659 | "labels = ['account', 'jan', 'feb', 'mar']\n", 660 | "df = pd.DataFrame.from_records(sales, columns=labels)\n", 661 | "df" 662 | ] 663 | }, 664 | { 665 | "cell_type": "code", 666 | "execution_count": 7, 667 | "metadata": {}, 668 | "outputs": [ 669 | { 670 | "name": "stderr", 671 | "output_type": "stream", 672 | "text": [ 673 | "/Users/luocai/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:6: FutureWarning: from_items is deprecated. Please use DataFrame.from_dict(dict(items), ...) instead. DataFrame.from_dict(OrderedDict(items)) may be used to preserve the key order.\n", 674 | " \n" 675 | ] 676 | }, 677 | { 678 | "data": { 679 | "text/html": [ 680 | "
\n", 681 | "\n", 694 | "\n", 695 | " \n", 696 | " \n", 697 | " \n", 698 | " \n", 699 | " \n", 700 | " \n", 701 | " \n", 702 | " \n", 703 | " \n", 704 | " \n", 705 | " \n", 706 | " \n", 707 | " \n", 708 | " \n", 709 | " \n", 710 | " \n", 711 | " \n", 712 | " \n", 713 | " \n", 714 | " \n", 715 | " \n", 716 | " \n", 717 | " \n", 718 | " \n", 719 | " \n", 720 | " \n", 721 | " \n", 722 | " \n", 723 | " \n", 724 | " \n", 725 | " \n", 726 | " \n", 727 | "
Jonesjanfebmar
0Jones150200140
1Alpha200210215
2Blue509095
\n", 728 | "
" 729 | ], 730 | "text/plain": [ 731 | " Jones jan feb mar\n", 732 | "0 Jones 150 200 140\n", 733 | "1 Alpha 200 210 215\n", 734 | "2 Blue 50 90 95" 735 | ] 736 | }, 737 | "execution_count": 7, 738 | "metadata": {}, 739 | "output_type": "execute_result" 740 | } 741 | ], 742 | "source": [ 743 | "# from_items\n", 744 | "sales = [('Jones', ['Jones', 'Alpha', 'Blue']),\n", 745 | " ('jan', [150, 200, 50]),\n", 746 | " ('feb', [200, 210, 90]),\n", 747 | " ('mar', [140, 215, 95])]\n", 748 | "df = pd.DataFrame.from_items(sales)\n", 749 | "df" 750 | ] 751 | }, 752 | { 753 | "cell_type": "code", 754 | "execution_count": null, 755 | "metadata": {}, 756 | "outputs": [], 757 | "source": [] 758 | } 759 | ], 760 | "metadata": { 761 | "kernelspec": { 762 | "display_name": "Python 3", 763 | "language": "python", 764 | "name": "python3" 765 | }, 766 | "language_info": { 767 | "codemirror_mode": { 768 | "name": "ipython", 769 | "version": 3 770 | }, 771 | "file_extension": ".py", 772 | "mimetype": "text/x-python", 773 | "name": "python", 774 | "nbconvert_exporter": "python", 775 | "pygments_lexer": "ipython3", 776 | "version": "3.7.4" 777 | } 778 | }, 779 | "nbformat": 4, 780 | "nbformat_minor": 4 781 | } 782 | -------------------------------------------------------------------------------- /DeepLearningFromScratch/README.md: -------------------------------------------------------------------------------- 1 | ### 深度学习入门--基于Python的理论和实现 2 | 3 | 《深度学习入门--基于Python的理论和实现》的代码练习 4 | 5 | 6 | -------------------------------------------------------------------------------- /DeepLearningFromScratch/ch03/activation_function.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*-coding:utf-8 -*- 3 | """ 4 | 阶跃函数的简单实现 5 | """ 6 | import numpy as np 7 | import matplotlib.pylab as plt 8 | 9 | 10 | def step_function(x): 11 | ''' 12 | 阶跃函数 13 | :param x: 14 | :return: 15 | ''' 16 | return np.array(x > 0, dtype=np.int) 17 | 18 | 19 | def sigmoid(x): 20 | ''' 21 | sigmoid 激活函数 22 | :param x: 23 | :return: 24 | ''' 25 | return 1 / (1 + np.exp(-x)) 26 | 27 | 28 | def relu(x): 29 | ''' 30 | ReLU 激活函数 31 | :param x: 32 | :return: 33 | ''' 34 | return np.maximum(0, x) 35 | 36 | 37 | def activation_function_show(func_name): 38 | # 简单生成一个范围是 -5.0 到 5.0,步长是 0.1 的 Numpy 数组, 总共 100 个数 39 | x = np.arange(-5.0, 5.0, 0.1) 40 | if func_name == 'step': 41 | y = step_function(x) 42 | elif func_name == 'sigmoid': 43 | y = sigmoid(x) 44 | elif func_name == 'relu': 45 | y = relu(x) 46 | else: 47 | raise ValueError('Invalid Function name!') 48 | # 画图展示阶跃函数 49 | plt.plot(x, y) 50 | # 指定 y 轴的范围 51 | if not func_name == 'relu': 52 | plt.ylim(-0.1, 1.1) 53 | plt.show() 54 | 55 | 56 | def sig_step_compare(): 57 | x = np.arange(-5.0, 5.0, 0.1) 58 | y1 = step_function(x) 59 | y2 = sigmoid(x) 60 | plt.plot(x, y1) 61 | # 指定采用 sigmoid 函数图形的颜色和线类型分别是 红色和虚线 62 | plt.plot(x, y2, 'r--') 63 | plt.ylim(-0.1, 1.1) 64 | plt.show() 65 | 66 | 67 | if __name__ == '__main__': 68 | func_names = ['step', 'sigmoid', 'relu'] 69 | activation_function_show(func_names[2]) 70 | # sig_step_compare() 71 | -------------------------------------------------------------------------------- /DeepLearningFromScratch/ch03/mnist_show.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*-coding:utf-8 -*- 3 | """ 4 | show mnist dataset 5 | """ 6 | import sys, os 7 | sys.path.append(os.pardir) 8 | from dataset.mnist import load_mnist 9 | import numpy as np 10 | from PIL import Image 11 | 12 | 13 | def img_show(img): 14 | pil_img = Image.fromarray(np.uint8(img)) 15 | pil_img.show() 16 | 17 | 18 | (x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False) 19 | 20 | # 输出各个数据的形状 21 | print(x_train.shape) # (60000, 784) 22 | print(t_train.shape) # (60000,) 23 | print(x_test.shape) # (10000, 784) 24 | print(t_test.shape) # (10000) 25 | 26 | img = x_train[0] 27 | label = t_train[0] 28 | print('label=', label) # 5 29 | # image shape: (784,) 30 | print('image shape:', img.shape) 31 | # 将图像形状调整回原来的形状 32 | img = img.reshape(28, 28) 33 | # after reshape, image shape: (28, 28) 34 | print('after reshape, image shape:', img.shape) 35 | img_show(img) 36 | -------------------------------------------------------------------------------- /DeepLearningFromScratch/ch03/neural_net.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*-coding:utf-8 -*- 3 | """ 4 | 5 | """ 6 | import numpy as np 7 | import sys, os 8 | 9 | # 为了导入父目录的文件而进行的设定 10 | sys.path.append(os.pardir) 11 | from common.functions import sigmoid, identity_function, softmax 12 | 13 | 14 | def init_network(): 15 | network = {} 16 | network['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]]) 17 | network['b1'] = np.array([0.1, 0.2, 0.3]) 18 | network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]]) 19 | network['b2'] = np.array([0.1, 0.2]) 20 | network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]]) 21 | network['b3'] = np.array([0.1, 0.2]) 22 | 23 | return network 24 | 25 | 26 | def forword(network, x): 27 | W1, W2, W3 = network['W1'], network['W2'], network['W3'] 28 | b1, b2, b3 = network['b1'], network['b2'], network['b3'] 29 | 30 | a1 = np.dot(x, W1) + b1 31 | z1 = sigmoid(a1) 32 | a2 = np.dot(z1, W2) + b2 33 | z2 = sigmoid(a2) 34 | a3 = np.dot(z2, W3) + b3 35 | y = identity_function(a3) 36 | 37 | return y 38 | 39 | 40 | if __name__ == '__main__': 41 | network = init_network() 42 | x = np.array([1.0, 0.5]) 43 | y = forword(network, x) 44 | # y= [0.31682708 0.69627909] 45 | print('y=', y) 46 | y_softmax = softmax(y) 47 | # softmax= [0.40625907 0.59374093] 48 | print('softmax=', y_softmax) 49 | -------------------------------------------------------------------------------- /DeepLearningFromScratch/ch03/neuralnet_mnist.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*-coding:utf-8 -*- 3 | """ 4 | inference with a simple neural network and use mnist dataset 5 | """ 6 | import sys, os 7 | 8 | sys.path.append(os.pardir) 9 | from dataset.mnist import load_mnist 10 | import numpy as np 11 | import pickle 12 | from common.functions import sigmoid, softmax 13 | import time 14 | 15 | 16 | def get_data(): 17 | (x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=True, one_hot_label=False) 18 | return x_test, t_test 19 | 20 | 21 | def init_network(): 22 | with open("sample_weight.pkl", 'rb') as f: 23 | network = pickle.load(f) 24 | 25 | return network 26 | 27 | 28 | def predict(network, x): 29 | W1, W2, W3 = network['W1'], network['W2'], network['W3'] 30 | b1, b2, b3 = network['b1'], network['b2'], network['b3'] 31 | 32 | a1 = np.dot(x, W1) + b1 33 | z1 = sigmoid(a1) 34 | a2 = np.dot(z1, W2) + b2 35 | z2 = sigmoid(a2) 36 | a3 = np.dot(z2, W3) + b3 37 | y = softmax(a3) 38 | 39 | return y 40 | 41 | 42 | x, label = get_data() 43 | network = init_network() 44 | 45 | accuracy_cnt = 0 46 | start_time = time.time() 47 | for i in range(len(x)): 48 | y = predict(network, x[i]) 49 | # 获取概率最高的元素的索引, 也就是输出类别 50 | idx = np.argmax(y) 51 | if idx == label[i]: 52 | accuracy_cnt += 1 53 | # total time: 0.4882946014404297 54 | print('total time: ', time.time() - start_time) 55 | # Accuracy: 0.9352 56 | print('Accuracy: ' + str(float(accuracy_cnt) / len(x))) 57 | -------------------------------------------------------------------------------- /DeepLearningFromScratch/ch03/neuralnet_mnist_batch.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*-coding:utf-8 -*- 3 | """ 4 | inference with a simple neural network and use mnist dataset 5 | """ 6 | import sys, os 7 | 8 | sys.path.append(os.pardir) 9 | from dataset.mnist import load_mnist 10 | import numpy as np 11 | import pickle 12 | from common.functions import sigmoid, softmax 13 | import time 14 | 15 | 16 | def get_data(): 17 | (x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=True, one_hot_label=False) 18 | return x_test, t_test 19 | 20 | 21 | def init_network(): 22 | with open("sample_weight.pkl", 'rb') as f: 23 | network = pickle.load(f) 24 | 25 | return network 26 | 27 | 28 | def predict(network, x): 29 | W1, W2, W3 = network['W1'], network['W2'], network['W3'] 30 | b1, b2, b3 = network['b1'], network['b2'], network['b3'] 31 | 32 | a1 = np.dot(x, W1) + b1 33 | z1 = sigmoid(a1) 34 | a2 = np.dot(z1, W2) + b2 35 | z2 = sigmoid(a2) 36 | a3 = np.dot(z2, W3) + b3 37 | y = softmax(a3) 38 | 39 | return y 40 | 41 | 42 | x, label = get_data() 43 | network = init_network() 44 | 45 | accuracy_cnt = 0 46 | # 设置批数量 47 | batch_size = 100 48 | mnist_numbers = len(x) 49 | start_time = time.time() 50 | for i in range(0, mnist_numbers, batch_size): 51 | x_batch = x[i:i + batch_size] 52 | y_batch = predict(network, x_batch) 53 | labels = np.argmax(y_batch, axis=1) 54 | accuracy_cnt += np.sum(labels == label[i:i + batch_size]) 55 | # total time: 0.07218790054321289 56 | print('total time: ', time.time() - start_time) 57 | # Accuracy: 0.9352 58 | print('Accuracy: ' + str(float(accuracy_cnt) / len(x))) 59 | -------------------------------------------------------------------------------- /DeepLearningFromScratch/ch03/sample_weight.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/DeepLearningFromScratch/ch03/sample_weight.pkl -------------------------------------------------------------------------------- /DeepLearningFromScratch/common/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*-coding:utf-8 -*- 3 | """ 4 | 5 | """ -------------------------------------------------------------------------------- /DeepLearningFromScratch/common/functions.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*-coding:utf-8 -*- 3 | """ 4 | common functions 5 | """ 6 | import numpy as np 7 | 8 | 9 | def identity_function(x): 10 | return x 11 | 12 | 13 | def step_function(x): 14 | return np.array(x > 0, dtype=np.int) 15 | 16 | 17 | def sigmoid(x): 18 | return 1 / (1 + np.exp(-x)) 19 | 20 | 21 | def sigmoid_grad(x): 22 | return (1.0 - sigmoid(x)) * sigmoid(x) 23 | 24 | 25 | def relu(x): 26 | return np.maximum(0, x) 27 | 28 | 29 | def softmax(x): 30 | if x.ndim == 2: 31 | x = x.T 32 | x = x - np.max(x, axis=0) 33 | y = np.exp(x) / np.sum(np.exp(x), axis=0) 34 | return y.T 35 | # 防止溢出 36 | x = x - np.max(x) 37 | return np.exp(x) / np.sum(np.exp(x)) 38 | -------------------------------------------------------------------------------- /DeepLearningFromScratch/dataset/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*-coding:utf-8 -*- 3 | """ 4 | """ -------------------------------------------------------------------------------- /DeepLearningFromScratch/dataset/mnist.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*-coding:utf-8 -*- 3 | """ 4 | """ 5 | try: 6 | import urllib.request 7 | except ImportError: 8 | raise ImportError('You should use Python 3.x') 9 | import os.path 10 | import gzip 11 | import pickle 12 | import os 13 | import numpy as np 14 | 15 | url_base = 'http://yann.lecun.com/exdb/mnist/' 16 | key_file = { 17 | 'train_img': 'train-images-idx3-ubyte.gz', 18 | 'train_label': 'train-labels-idx1-ubyte.gz', 19 | 'test_img': 't10k-images-idx3-ubyte.gz', 20 | 'test_label': 't10k-labels-idx1-ubyte.gz' 21 | } 22 | 23 | dataset_dir = os.path.dirname(os.path.abspath(__file__)) 24 | save_file = dataset_dir + "/mnist.pkl" 25 | 26 | train_num = 60000 27 | test_num = 10000 28 | img_dim = (1, 28, 28) 29 | img_size = 784 30 | 31 | 32 | def _download(file_name): 33 | file_path = dataset_dir + "/" + file_name 34 | 35 | if os.path.exists(file_path): 36 | return 37 | 38 | print("Downloading " + file_name + " ... ") 39 | urllib.request.urlretrieve(url_base + file_name, file_path) 40 | print("Done") 41 | 42 | 43 | def download_mnist(): 44 | for v in key_file.values(): 45 | _download(v) 46 | 47 | 48 | def _load_label(file_name): 49 | file_path = dataset_dir + "/" + file_name 50 | 51 | print("Converting " + file_name + " to NumPy Array ...") 52 | with gzip.open(file_path, 'rb') as f: 53 | labels = np.frombuffer(f.read(), np.uint8, offset=8) 54 | print("Done") 55 | 56 | return labels 57 | 58 | 59 | def _load_img(file_name): 60 | file_path = dataset_dir + "/" + file_name 61 | 62 | print("Converting " + file_name + " to NumPy Array ...") 63 | with gzip.open(file_path, 'rb') as f: 64 | data = np.frombuffer(f.read(), np.uint8, offset=16) 65 | data = data.reshape(-1, img_size) 66 | print("Done") 67 | 68 | return data 69 | 70 | 71 | def _convert_numpy(): 72 | dataset = {} 73 | dataset['train_img'] = _load_img(key_file['train_img']) 74 | dataset['train_label'] = _load_label(key_file['train_label']) 75 | dataset['test_img'] = _load_img(key_file['test_img']) 76 | dataset['test_label'] = _load_label(key_file['test_label']) 77 | 78 | return dataset 79 | 80 | 81 | def init_mnist(): 82 | download_mnist() 83 | dataset = _convert_numpy() 84 | print("Creating pickle file ...") 85 | with open(save_file, 'wb') as f: 86 | pickle.dump(dataset, f, -1) 87 | print("Done!") 88 | 89 | 90 | def _change_one_hot_label(X): 91 | T = np.zeros((X.size, 10)) 92 | for idx, row in enumerate(T): 93 | row[X[idx]] = 1 94 | 95 | return T 96 | 97 | 98 | def load_mnist(normalize=True, flatten=True, one_hot_label=False): 99 | """读入MNIST数据集 100 | 101 | Parameters 102 | ---------- 103 | normalize : 将图像的像素值正规化为0.0~1.0 104 | one_hot_label : 105 | one_hot_label为True的情况下,标签作为one-hot数组返回 106 | one-hot数组是指[0,0,1,0,0,0,0,0,0,0]这样的数组 107 | flatten : 是否将图像展开为一维数组 108 | 109 | Returns 110 | ------- 111 | (训练图像, 训练标签), (测试图像, 测试标签) 112 | """ 113 | if not os.path.exists(save_file): 114 | init_mnist() 115 | 116 | with open(save_file, 'rb') as f: 117 | dataset = pickle.load(f) 118 | 119 | if normalize: 120 | for key in ('train_img', 'test_img'): 121 | dataset[key] = dataset[key].astype(np.float32) 122 | dataset[key] /= 255.0 123 | 124 | if one_hot_label: 125 | dataset['train_label'] = _change_one_hot_label(dataset['train_label']) 126 | dataset['test_label'] = _change_one_hot_label(dataset['test_label']) 127 | 128 | if not flatten: 129 | for key in ('train_img', 'test_img'): 130 | dataset[key] = dataset[key].reshape(-1, 1, 28, 28) 131 | 132 | return (dataset['train_img'], dataset['train_label']), (dataset['test_img'], dataset['test_label']) 133 | 134 | 135 | if __name__ == '__main__': 136 | init_mnist() 137 | -------------------------------------------------------------------------------- /DeepLearningFromScratch/dataset/t10k-images-idx3-ubyte.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/DeepLearningFromScratch/dataset/t10k-images-idx3-ubyte.gz -------------------------------------------------------------------------------- /DeepLearningFromScratch/dataset/t10k-labels-idx1-ubyte.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/DeepLearningFromScratch/dataset/t10k-labels-idx1-ubyte.gz -------------------------------------------------------------------------------- /DeepLearningFromScratch/dataset/train-images-idx3-ubyte.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/DeepLearningFromScratch/dataset/train-images-idx3-ubyte.gz -------------------------------------------------------------------------------- /DeepLearningFromScratch/dataset/train-labels-idx1-ubyte.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/DeepLearningFromScratch/dataset/train-labels-idx1-ubyte.gz -------------------------------------------------------------------------------- /DeepLearningFromScratch/images/relu_function.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/DeepLearningFromScratch/images/relu_function.png -------------------------------------------------------------------------------- /DeepLearningFromScratch/images/sig_step_compare.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/DeepLearningFromScratch/images/sig_step_compare.png -------------------------------------------------------------------------------- /DeepLearningFromScratch/images/sigmoid_function_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/DeepLearningFromScratch/images/sigmoid_function_image.png -------------------------------------------------------------------------------- /DeepLearningFromScratch/images/step_function_image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/DeepLearningFromScratch/images/step_function_image.png -------------------------------------------------------------------------------- /FluentPython/1_Python数据模型.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 第一章 Python 数据模型" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "### 1.1 一摞有序的纸牌\n", 15 | "\n", 16 | "介绍如何实现 __getitem__ 和 __len__ 两个特殊方法" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 8, 22 | "metadata": {}, 23 | "outputs": [], 24 | "source": [ 25 | "import collections\n", 26 | "# 用 nametuple 构建一个类来表示纸牌\n", 27 | "Card = collections.namedtuple('Card', ['rank', 'suit'])\n", 28 | "\n", 29 | "class FrenchDeck:\n", 30 | " ranks = [str(n) for n in range(2, 11)] + list('JQKA')\n", 31 | " suits = 'spades diamonds clubs hearts'.split()\n", 32 | " \n", 33 | " def __init__(self):\n", 34 | " self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks]\n", 35 | " \n", 36 | " def __len__(self):\n", 37 | " return len(self._cards)\n", 38 | " \n", 39 | " def __getitem__(self, position):\n", 40 | " return self._cards[position]" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 9, 46 | "metadata": {}, 47 | "outputs": [ 48 | { 49 | "data": { 50 | "text/plain": [ 51 | "Card(rank='7', suit='diamonds')" 52 | ] 53 | }, 54 | "execution_count": 9, 55 | "metadata": {}, 56 | "output_type": "execute_result" 57 | } 58 | ], 59 | "source": [ 60 | "# 测试 Card\n", 61 | "beer_card = Card('7', 'diamonds')\n", 62 | "beer_card" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 10, 68 | "metadata": {}, 69 | "outputs": [ 70 | { 71 | "data": { 72 | "text/plain": [ 73 | "52" 74 | ] 75 | }, 76 | "execution_count": 10, 77 | "metadata": {}, 78 | "output_type": "execute_result" 79 | } 80 | ], 81 | "source": [ 82 | "# 测试 FrenchDeck\n", 83 | "deck = FrenchDeck()\n", 84 | "len(deck)" 85 | ] 86 | }, 87 | { 88 | "cell_type": "code", 89 | "execution_count": 11, 90 | "metadata": {}, 91 | "outputs": [ 92 | { 93 | "name": "stdout", 94 | "output_type": "stream", 95 | "text": [ 96 | "Card(rank='2', suit='spades') Card(rank='A', suit='hearts')\n" 97 | ] 98 | } 99 | ], 100 | "source": [ 101 | "# 抽取卡牌\n", 102 | "print(deck[0], deck[-1])" 103 | ] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "execution_count": 12, 108 | "metadata": {}, 109 | "outputs": [ 110 | { 111 | "data": { 112 | "text/plain": [ 113 | "Card(rank='2', suit='diamonds')" 114 | ] 115 | }, 116 | "execution_count": 12, 117 | "metadata": {}, 118 | "output_type": "execute_result" 119 | } 120 | ], 121 | "source": [ 122 | "# 随机抽取,结合 random.choice\n", 123 | "from random import choice\n", 124 | "\n", 125 | "choice(deck)" 126 | ] 127 | }, 128 | { 129 | "cell_type": "code", 130 | "execution_count": 13, 131 | "metadata": {}, 132 | "outputs": [ 133 | { 134 | "name": "stdout", 135 | "output_type": "stream", 136 | "text": [ 137 | "[Card(rank='2', suit='spades'), Card(rank='3', suit='spades'), Card(rank='4', suit='spades')]\n", 138 | "[Card(rank='A', suit='spades'), Card(rank='A', suit='diamonds'), Card(rank='A', suit='clubs'), Card(rank='A', suit='hearts')]\n" 139 | ] 140 | } 141 | ], 142 | "source": [ 143 | "# 切片\n", 144 | "print(deck[:3])\n", 145 | "print(deck[12::13])" 146 | ] 147 | }, 148 | { 149 | "cell_type": "code", 150 | "execution_count": 31, 151 | "metadata": {}, 152 | "outputs": [ 153 | { 154 | "name": "stdout", 155 | "output_type": "stream", 156 | "text": [ 157 | "Card(rank='2', suit='spades')\n" 158 | ] 159 | } 160 | ], 161 | "source": [ 162 | "# 可迭代的读取\n", 163 | "for card in deck:\n", 164 | " print(card)\n", 165 | " break" 166 | ] 167 | }, 168 | { 169 | "cell_type": "code", 170 | "execution_count": 32, 171 | "metadata": {}, 172 | "outputs": [ 173 | { 174 | "name": "stdout", 175 | "output_type": "stream", 176 | "text": [ 177 | "Card(rank='A', suit='hearts')\n" 178 | ] 179 | } 180 | ], 181 | "source": [ 182 | "# 反向迭代\n", 183 | "for card in reversed(deck):\n", 184 | " print(card)\n", 185 | " break" 186 | ] 187 | }, 188 | { 189 | "cell_type": "code", 190 | "execution_count": 22, 191 | "metadata": {}, 192 | "outputs": [], 193 | "source": [ 194 | "# 制定排序的规则\n", 195 | "suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0)\n", 196 | "\n", 197 | "def spades_high(card):\n", 198 | " rank_value = FrenchDeck.ranks.index(card.rank)\n", 199 | " return rank_value * len(suit_values) + suit_values[card.suit]" 200 | ] 201 | }, 202 | { 203 | "cell_type": "code", 204 | "execution_count": 33, 205 | "metadata": {}, 206 | "outputs": [ 207 | { 208 | "name": "stdout", 209 | "output_type": "stream", 210 | "text": [ 211 | "Card(rank='2', suit='clubs')\n" 212 | ] 213 | } 214 | ], 215 | "source": [ 216 | "# 对卡牌进行升序排序\n", 217 | "for card in sorted(deck, key=spades_high):\n", 218 | " print(card)\n", 219 | " break" 220 | ] 221 | }, 222 | { 223 | "cell_type": "markdown", 224 | "metadata": {}, 225 | "source": [ 226 | "### 1.2.1 模拟数值类型\n", 227 | "\n", 228 | "利用特殊方法,让自定义类通过 + 号(或者其他运算符)进行运算" 229 | ] 230 | }, 231 | { 232 | "cell_type": "code", 233 | "execution_count": 25, 234 | "metadata": {}, 235 | "outputs": [], 236 | "source": [ 237 | "# 一个简单的二维向量类\n", 238 | "from math import hypot\n", 239 | "\n", 240 | "class Vector:\n", 241 | " def __init__(self, x=0, y=0):\n", 242 | " self.x = x\n", 243 | " self.y = y\n", 244 | " \n", 245 | " def __repr__(self):\n", 246 | " return 'Vector(%r, %r)' % (self.x, self.y)\n", 247 | " \n", 248 | " def __abs__(self):\n", 249 | " return hypot(self.x, self.y)\n", 250 | " \n", 251 | " def __bool__(self):\n", 252 | " return bool(abs(self))\n", 253 | " \n", 254 | " def __add__(self, other):\n", 255 | " x = self.x + other.x\n", 256 | " y = self.y + other.y\n", 257 | " return Vector(x, y)\n", 258 | " \n", 259 | " def __mul__(self, scalar):\n", 260 | " return Vector(self.x * scalar, self.y * scalar)" 261 | ] 262 | }, 263 | { 264 | "cell_type": "code", 265 | "execution_count": 26, 266 | "metadata": {}, 267 | "outputs": [ 268 | { 269 | "data": { 270 | "text/plain": [ 271 | "Vector(4, 5)" 272 | ] 273 | }, 274 | "execution_count": 26, 275 | "metadata": {}, 276 | "output_type": "execute_result" 277 | } 278 | ], 279 | "source": [ 280 | "# 测试例子\n", 281 | "v1 = Vector(2, 4)\n", 282 | "v2 = Vector(2, 1)\n", 283 | "v1+v2" 284 | ] 285 | }, 286 | { 287 | "cell_type": "code", 288 | "execution_count": 27, 289 | "metadata": {}, 290 | "outputs": [ 291 | { 292 | "data": { 293 | "text/plain": [ 294 | "5.0" 295 | ] 296 | }, 297 | "execution_count": 27, 298 | "metadata": {}, 299 | "output_type": "execute_result" 300 | } 301 | ], 302 | "source": [ 303 | "v3 = Vector(3, 4)\n", 304 | "abs(v3)" 305 | ] 306 | }, 307 | { 308 | "cell_type": "code", 309 | "execution_count": 28, 310 | "metadata": {}, 311 | "outputs": [ 312 | { 313 | "data": { 314 | "text/plain": [ 315 | "Vector(9, 12)" 316 | ] 317 | }, 318 | "execution_count": 28, 319 | "metadata": {}, 320 | "output_type": "execute_result" 321 | } 322 | ], 323 | "source": [ 324 | "v3 * 3" 325 | ] 326 | }, 327 | { 328 | "cell_type": "code", 329 | "execution_count": null, 330 | "metadata": {}, 331 | "outputs": [], 332 | "source": [] 333 | }, 334 | { 335 | "cell_type": "code", 336 | "execution_count": null, 337 | "metadata": {}, 338 | "outputs": [], 339 | "source": [] 340 | }, 341 | { 342 | "cell_type": "code", 343 | "execution_count": null, 344 | "metadata": {}, 345 | "outputs": [], 346 | "source": [] 347 | } 348 | ], 349 | "metadata": { 350 | "kernelspec": { 351 | "display_name": "Python 3", 352 | "language": "python", 353 | "name": "python3" 354 | }, 355 | "language_info": { 356 | "codemirror_mode": { 357 | "name": "ipython", 358 | "version": 3 359 | }, 360 | "file_extension": ".py", 361 | "mimetype": "text/x-python", 362 | "name": "python", 363 | "nbconvert_exporter": "python", 364 | "pygments_lexer": "ipython3", 365 | "version": "3.7.4" 366 | } 367 | }, 368 | "nbformat": 4, 369 | "nbformat_minor": 4 370 | } 371 | -------------------------------------------------------------------------------- /MachineLearningCodes/Loss_functions_practise.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/1/23 23:09 5 | @Author : cai 6 | 7 | practise for different loss function 8 | """ 9 | import numpy as np 10 | 11 | 12 | def rmse(predictions, targets): 13 | # 真实值和预测值的误差 14 | differences = predictions - targets 15 | differences_squared = differences ** 2 16 | mean_of_differences_squared = differences_squared.mean() 17 | # 取平方根 18 | rmse_val = np.sqrt(mean_of_differences_squared) 19 | return rmse_val 20 | 21 | 22 | def mae(predictions, targets): 23 | differences = predictions - targets 24 | absolute_differences = np.absolute(differences) 25 | mean_absolute_differences = absolute_differences.mean() 26 | return mean_absolute_differences 27 | 28 | 29 | def mbe(predictions, targets): 30 | differences = predictions - targets 31 | mean_absolute_differences = differences.mean() 32 | return mean_absolute_differences 33 | 34 | 35 | def hinge_loss(predictions, label): 36 | ''' 37 | hinge_loss = max(0, s_j - s_yi +1) 38 | :param predictions: 39 | :param label: 40 | :return: 41 | ''' 42 | result = 0.0 43 | pred_value = predictions[label] 44 | print('pred_value={}'.format(pred_value)) 45 | for i, val in enumerate(predictions): 46 | if i == label: 47 | continue 48 | tmp = val - pred_value + 1 49 | result += max(0, tmp) 50 | return result 51 | 52 | 53 | def cross_entropy(predictions, targets, epsilon=1e-10): 54 | predictions = np.clip(predictions, epsilon, 1. - epsilon) 55 | N = predictions.shape[0] 56 | ce_loss = -np.sum(np.sum(targets * np.log(predictions + 1e-5))) / N 57 | return ce_loss 58 | 59 | 60 | def loss_test(): 61 | y_hat = np.array([0.000, 0.166, 0.333]) 62 | y_true = np.array([0.000, 0.254, 0.998]) 63 | 64 | print("d is: " + str(["%.8f" % elem for elem in y_hat])) 65 | print("p is: " + str(["%.8f" % elem for elem in y_true])) 66 | rmse_val = rmse(y_hat, y_true) 67 | print("rms error is: " + str(rmse_val)) 68 | mae_val = mae(y_hat, y_true) 69 | print("mae error is: " + str(mae_val)) 70 | 71 | mbe_val = mbe(y_hat, y_true) 72 | print("mbe error is: " + str(mbe_val)) 73 | 74 | image1 = np.array([-0.39, 1.49, 4.21]) 75 | image2 = np.array([-4.61, 3.28, 1.46]) 76 | image3 = np.array([1.03, -2.37, -2.27]) 77 | result1 = hinge_loss(image1, 0) 78 | result2 = hinge_loss(image2, 1) 79 | result3 = hinge_loss(image3, 2) 80 | print('image1,hinge loss={}'.format(result1)) 81 | print('image2,hinge loss={}'.format(result2)) 82 | print('image3,hinge loss={}'.format(result3)) 83 | 84 | predictions = np.array([[0.25, 0.25, 0.25, 0.25], 85 | [0.01, 0.01, 0.01, 0.96]]) 86 | targets = np.array([[0, 0, 0, 1], 87 | [0, 0, 0, 1]]) 88 | cross_entropy_loss = cross_entropy(predictions, targets) 89 | print("Cross entropy loss is: " + str(cross_entropy_loss)) 90 | 91 | 92 | if __name__ == '__main__': 93 | loss_test() 94 | print('finish!') 95 | 96 | -------------------------------------------------------------------------------- /MachineLearningCodes/Perfermance_measures.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/3/14 23:12 5 | @Author : cai 6 | 7 | 模型的性能度量,二分类 8 | 模型评估方法,划分数据集 9 | """ 10 | from sklearn.model_selection import train_test_split 11 | from sklearn.datasets import load_iris 12 | from sklearn.neighbors import KNeighborsClassifier 13 | from sklearn.cross_validation import cross_val_score 14 | from sklearn.model_selection import StratifiedKFold 15 | from sklearn.base import clone 16 | 17 | 18 | # ======================================= 19 | # 性能度量方法 20 | # ======================================= 21 | 22 | def accuracy(y_true, y_pred): 23 | return sum(y == y_p for y, y_p in zip(y_true, y_pred)) / len(y_true) 24 | 25 | 26 | def error(y_true, y_pred): 27 | return sum(y != y_p for y, y_p in zip(y_true, y_pred)) / len(y_true) 28 | 29 | 30 | def precision(y_true, y_pred): 31 | true_positive = sum(y and y_p for y, y_p in zip(y_true, y_pred)) 32 | predicted_positive = sum(y_pred) 33 | return true_positive / predicted_positive 34 | 35 | 36 | def recall(y_true, y_pred): 37 | true_positive = sum(y and y_p for y, y_p in zip(y_true, y_pred)) 38 | real_positive = sum(y_true) 39 | return true_positive / real_positive 40 | 41 | 42 | def true_negative_rate(y_true, y_pred): 43 | true_negative = sum(1 - (yi or yi_hat) for yi, yi_hat in zip(y_true, y_pred)) 44 | actual_negative = len(y_true) - sum(y_true) 45 | return true_negative / actual_negative 46 | 47 | 48 | def roc(y, y_hat_prob): 49 | thresholds = sorted(set(y_hat_prob), reverse=True) 50 | ret = [[0, 0]] 51 | for threshold in thresholds: 52 | y_hat = [int(yi_hat_prob >= threshold) for yi_hat_prob in y_hat_prob] 53 | ret.append([recall(y, y_hat), 1 - true_negative_rate(y, y_hat)]) 54 | return ret 55 | 56 | 57 | def get_auc(y, y_hat_prob): 58 | roc_val = iter(roc(y, y_hat_prob)) 59 | tpr_pre, fpr_pre = next(roc_val) 60 | auc = 0 61 | for tpr, fpr in roc_val: 62 | auc += (tpr + tpr_pre) * (fpr - fpr_pre) / 2 63 | tpr_pre = tpr 64 | fpr_pre = fpr 65 | return auc 66 | 67 | 68 | # ======================================= 69 | # 模型评估方法 70 | # ======================================= 71 | 72 | def hold_out(): 73 | # 加载 Iris 数据集 74 | dataset = load_iris() 75 | # 划分训练集和测试集 76 | (trainX, testX, trainY, testY) = train_test_split(dataset.data, dataset.target, random_state=3, test_size=0.3) 77 | # 建立模型 78 | knn = KNeighborsClassifier() 79 | # 训练模型 80 | knn.fit(trainX, trainY) 81 | # 将准确率打印出 82 | print('hold_out, score:', knn.score(testX, testY)) 83 | 84 | 85 | def cross_validation(cv=10): 86 | # 加载 Iris 数据集 87 | dataset = load_iris() 88 | data = dataset.data 89 | label = dataset.target 90 | # 建立模型 91 | knn = KNeighborsClassifier() 92 | # 使用K折交叉验证模块 93 | scores = cross_val_score(knn, data, label, cv=cv, scoring='accuracy') 94 | print('cross_validation numbers=', cv) 95 | # 将每次的预测准确率打印出 96 | print(scores) 97 | # 将预测准确平均率打印出 98 | print(scores.mean()) 99 | 100 | 101 | def StratifiedKFold_method(n_splits=3): 102 | ''' 103 | 分层采样 104 | :return: 105 | ''' 106 | # 加载 Iris 数据集 107 | dataset = load_iris() 108 | data = dataset.data 109 | label = dataset.target 110 | # 建立模型 111 | knn = KNeighborsClassifier() 112 | print('use StratifiedKFold') 113 | skfolds = StratifiedKFold(n_splits=n_splits, random_state=42) 114 | scores = 0. 115 | for train_index, test_index in skfolds.split(data, label): 116 | clone_clf = clone(knn) 117 | X_train_folds = data[train_index] 118 | y_train_folds = (label[train_index]) 119 | X_test_fold = data[test_index] 120 | y_test_fold = (label[test_index]) 121 | clone_clf.fit(X_train_folds, y_train_folds) 122 | y_pred = clone_clf.predict(X_test_fold) 123 | n_correct = sum(y_pred == y_test_fold) 124 | print(n_correct / len(y_pred)) 125 | scores += n_correct / len(y_pred) 126 | print('mean scores:', scores / n_splits) 127 | 128 | 129 | if __name__ == '__main__': 130 | y_true = [1, 0, 1, 0, 1] 131 | y_pred = [0, 0, 1, 1, 0] 132 | y_hat_prob = [0.9, 0.85, 0.8, 0.7, 0.6] 133 | 134 | acc = accuracy(y_true, y_pred) 135 | err = error(y_true, y_pred) 136 | precisions = precision(y_true, y_pred) 137 | recalls = recall(y_true, y_pred) 138 | print('accuracy=', acc) 139 | print('error=', err) 140 | print('precisions=', precisions) 141 | print('recalls=', recalls) 142 | 143 | roc_list = roc(y_true, y_hat_prob) 144 | auc_val = get_auc(y_true, y_hat_prob) 145 | print('roc_list:', roc_list) 146 | print('auc_val:', auc_val) 147 | 148 | hold_out() 149 | cross_validation() 150 | StratifiedKFold_method() 151 | -------------------------------------------------------------------------------- /MachineLearningCodes/machineLearning_Python/README.md: -------------------------------------------------------------------------------- 1 | 教程来自 https://www.pyimagesearch.com/2019/01/14/machine-learning-in-python/ 2 | 3 | 主要是采用 `scikit-learn` 和 `Keras` 两个库来实现以下几种常见的机器学习算法: 4 | 5 | - KNN 6 | - 朴素贝叶斯 7 | - 逻辑回归 8 | - SVM 9 | - 决策树 10 | - 随机森林 11 | - 感知机 12 | - 多层前向网络 13 | - CNNs 14 | 15 | 实验的数据集是: 16 | 17 | - **Iris(鸢尾花)** 数据集 18 | - **3-scenes 图像数据集**,从 [Modeling the shape of the scene: a holistic representation of the spatial envelope](http://people.csail.mit.edu/torralba/code/spatialenvelope/) 发布的 8 场景数据集采样得到 19 | 20 | 其中,`Iris` 数据集直接通过 `sklearn.datasets()` 导入 `load_iris()` 即可导入,而第二个数据集可以从原文中下载获取。 -------------------------------------------------------------------------------- /MachineLearningCodes/machineLearning_Python/basic_cnn.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/3/16 12:05 5 | @Author : cai 6 | 7 | 教程来自 https://www.pyimagesearch.com/2019/01/14/machine-learning-in-python/ 8 | """ 9 | from keras.models import Sequential 10 | from keras.layers.convolutional import Conv2D 11 | from keras.layers.convolutional import MaxPooling2D 12 | from keras.layers.core import Activation 13 | from keras.layers.core import Flatten 14 | from keras.layers.core import Dense 15 | from keras.optimizers import Adam 16 | from sklearn.preprocessing import LabelBinarizer 17 | from sklearn.model_selection import train_test_split 18 | from sklearn.metrics import classification_report 19 | from PIL import Image 20 | from imutils import paths 21 | import numpy as np 22 | import argparse 23 | import os 24 | 25 | # 配置参数 26 | ap = argparse.ArgumentParser() 27 | ap.add_argument("-d", "--dataset", type=str, default="3scenes", 28 | help="path to directory containing the '3scenes' dataset") 29 | args = vars(ap.parse_args()) 30 | 31 | # 加载数据并提取特征 32 | print("[INFO] extracting image features...") 33 | imagePaths = paths.list_images(args['dataset']) 34 | data = [] 35 | labels = [] 36 | 37 | # 循环遍历所有的图片数据 38 | for imagePath in imagePaths: 39 | # 加载图片,然后调整成 32×32 大小,并做归一化到 [0,1] 40 | image = Image.open(imagePath) 41 | image = np.array(image.resize((32, 32))) / 255.0 42 | data.append(image) 43 | 44 | # 保存图片的标签信息 45 | label = imagePath.split(os.path.sep)[-2] 46 | labels.append(label) 47 | 48 | # 对标签编码,从字符串变为整型 49 | lb = LabelBinarizer() 50 | labels = lb.fit_transform(labels) 51 | 52 | # 划分训练集和测试集 53 | (trainX, testX, trainY, testY) = train_test_split(np.array(data), np.array(labels), test_size=0.25) 54 | 55 | # 定义 CNN 网络模型结构 56 | model = Sequential() 57 | model.add(Conv2D(8, (3, 3), padding="same", input_shape=(32, 32, 3))) 58 | model.add(Activation("relu")) 59 | model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) 60 | model.add(Conv2D(16, (3, 3), padding="same")) 61 | model.add(Activation("relu")) 62 | model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) 63 | model.add(Conv2D(32, (3, 3), padding="same")) 64 | model.add(Activation("relu")) 65 | model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) 66 | model.add(Flatten()) 67 | model.add(Dense(3)) 68 | model.add(Activation("softmax")) 69 | 70 | # 训练模型 71 | print("[INFO] training network...") 72 | opt = Adam(lr=1e-3, decay=1e-3 / 50) 73 | model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) 74 | H = model.fit(trainX, trainY, validation_data=(testX, testY), 75 | epochs=50, batch_size=32) 76 | 77 | # 预测 78 | print("[INFO] evaluating network...") 79 | predictions = model.predict(testX, batch_size=32) 80 | print(classification_report(testY.argmax(axis=1), 81 | predictions.argmax(axis=1), target_names=lb.classes_)) 82 | -------------------------------------------------------------------------------- /MachineLearningCodes/machineLearning_Python/classify_images.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/3/16 12:04 5 | @Author : cai 6 | 7 | 教程来自 https://www.pyimagesearch.com/2019/01/14/machine-learning-in-python/ 8 | """ 9 | from sklearn.neighbors import KNeighborsClassifier 10 | from sklearn.naive_bayes import GaussianNB 11 | from sklearn.linear_model import LogisticRegression 12 | from sklearn.svm import SVC 13 | from sklearn.tree import DecisionTreeClassifier 14 | from sklearn.ensemble import RandomForestClassifier 15 | from sklearn.neural_network import MLPClassifier 16 | from sklearn.preprocessing import LabelEncoder 17 | from sklearn.model_selection import train_test_split 18 | from sklearn.metrics import classification_report 19 | from PIL import Image 20 | from imutils import paths 21 | import numpy as np 22 | import argparse 23 | import os 24 | 25 | 26 | def extract_color_stats(image): 27 | ''' 28 | 将图片分成 RGB 三通道,然后分别计算每个通道的均值和标准差,然后返回 29 | :param image: 30 | :return: 31 | ''' 32 | (R, G, B) = image.split() 33 | features = [np.mean(R), np.mean(G), np.mean(B), np.std(R), np.std(G), np.std(B)] 34 | 35 | return features 36 | 37 | 38 | # 设置参数 39 | ap = argparse.ArgumentParser() 40 | ap.add_argument("-d", "--dataset", type=str, default="3scenes", 41 | help="path to directory containing the '3scenes' dataset") 42 | ap.add_argument("-m", "--model", type=str, default="knn", 43 | help="type of python machine learning model to use") 44 | args = vars(ap.parse_args()) 45 | 46 | # 定义一个保存模型的字典,根据 key 来选择加载哪个模型 47 | models = { 48 | "knn": KNeighborsClassifier(n_neighbors=1), 49 | "naive_bayes": GaussianNB(), 50 | "logit": LogisticRegression(solver="lbfgs", multi_class="auto"), 51 | "svm": SVC(kernel="rbf", gamma="auto"), 52 | "decision_tree": DecisionTreeClassifier(), 53 | "random_forest": RandomForestClassifier(n_estimators=100), 54 | "mlp": MLPClassifier() 55 | } 56 | # 加载数据并提取特征 57 | print("[INFO] extracting image features...") 58 | imagePaths = paths.list_images(args['dataset']) 59 | data = [] 60 | labels = [] 61 | 62 | # 循环遍历所有的图片数据 63 | for imagePath in imagePaths: 64 | # 加载图片,然后计算图片的颜色通道统计信息 65 | image = Image.open(imagePath) 66 | features = extract_color_stats(image) 67 | data.append(features) 68 | 69 | # 保存图片的标签信息 70 | label = imagePath.split(os.path.sep)[-2] 71 | labels.append(label) 72 | 73 | # 对标签进行编码,从字符串变为整数类型 74 | le = LabelEncoder() 75 | labels = le.fit_transform(labels) 76 | 77 | # 进行训练集和测试集的划分,75%数据作为训练集,其余25%作为测试集 78 | (trainX, testX, trainY, testY) = train_test_split(data, labels, random_state=3, test_size=0.25) 79 | # print('trainX numbers={}, testX numbers={}'.format(len(trainX), len(testX))) 80 | 81 | # 训练模型 82 | print("[INFO] using '{}' model".format(args["model"])) 83 | model = models[args["model"]] 84 | model.fit(trainX, trainY) 85 | 86 | # 预测并输出分类结果报告 87 | print("[INFO] evaluating...") 88 | predictions = model.predict(testX) 89 | print(classification_report(testY, predictions, target_names=le.classes_)) 90 | 91 | -------------------------------------------------------------------------------- /MachineLearningCodes/machineLearning_Python/classify_irs.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/3/16 12:04 5 | @Author : cai 6 | 7 | 教程来自 https://www.pyimagesearch.com/2019/01/14/machine-learning-in-python/ 8 | """ 9 | from sklearn.neighbors import KNeighborsClassifier 10 | from sklearn.naive_bayes import GaussianNB 11 | from sklearn.linear_model import LogisticRegression 12 | from sklearn.svm import SVC 13 | from sklearn.tree import DecisionTreeClassifier 14 | from sklearn.ensemble import RandomForestClassifier 15 | from sklearn.neural_network import MLPClassifier 16 | from sklearn.model_selection import train_test_split 17 | from sklearn.metrics import classification_report 18 | from sklearn.datasets import load_iris 19 | import argparse 20 | 21 | # 设置参数 22 | ap = argparse.ArgumentParser() 23 | ap.add_argument("-m", "--model", type=str, default="knn", help="type of python machine learning model to use") 24 | args = vars(ap.parse_args()) 25 | 26 | # 定义一个保存模型的字典,根据 key 来选择加载哪个模型 27 | models = { 28 | "knn": KNeighborsClassifier(n_neighbors=1), 29 | "naive_bayes": GaussianNB(), 30 | "logit": LogisticRegression(solver="lbfgs", multi_class="auto"), 31 | "svm": SVC(kernel="rbf", gamma="auto"), 32 | "decision_tree": DecisionTreeClassifier(), 33 | "random_forest": RandomForestClassifier(n_estimators=100), 34 | "mlp": MLPClassifier() 35 | } 36 | 37 | # 载入 Iris 数据集,然后进行训练集和测试集的划分,75%数据作为训练集,其余25%作为测试集 38 | print("[INFO] loading data...") 39 | dataset = load_iris() 40 | (trainX, testX, trainY, testY) = train_test_split(dataset.data, dataset.target, random_state=3, test_size=0.25) 41 | 42 | # 训练模型 43 | print("[INFO] using '{}' model".format(args["model"])) 44 | model = models[args["model"]] 45 | model.fit(trainX, trainY) 46 | 47 | # 预测并输出一份分类结果报告 48 | print("[INFO] evaluating") 49 | predictions = model.predict(testX) 50 | print(classification_report(testY, predictions, target_names=dataset.target_names)) 51 | 52 | -------------------------------------------------------------------------------- /MachineLearningCodes/machineLearning_Python/nn_iris.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/3/16 12:05 5 | @Author : cai 6 | 7 | 教程来自 https://www.pyimagesearch.com/2019/01/14/machine-learning-in-python/ 8 | """ 9 | from keras.models import Sequential 10 | from keras.layers.core import Dense 11 | from keras.optimizers import SGD 12 | from sklearn.preprocessing import LabelBinarizer 13 | from sklearn.model_selection import train_test_split 14 | from sklearn.metrics import classification_report 15 | from sklearn.datasets import load_iris 16 | 17 | # 载入 Iris 数据集,然后进行训练集和测试集的划分,75%数据作为训练集,其余25%作为测试集 18 | print("[INFO] loading data...") 19 | dataset = load_iris() 20 | (trainX, testX, trainY, testY) = train_test_split(dataset.data, 21 | dataset.target, test_size=0.25) 22 | 23 | # 将标签进行 one-hot 编码 24 | lb = LabelBinarizer() 25 | trainY = lb.fit_transform(trainY) 26 | testY = lb.transform(testY) 27 | 28 | # 利用 Keras 定义网络模型 29 | model = Sequential() 30 | model.add(Dense(3, input_shape=(4,), activation="sigmoid")) 31 | model.add(Dense(3, activation="sigmoid")) 32 | model.add(Dense(3, activation="softmax")) 33 | 34 | # 采用梯度下降训练模型 35 | print('[INFO] training network...') 36 | opt = SGD(lr=0.1, momentum=0.9, decay=0.1 / 250) 37 | model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=["accuracy"]) 38 | H = model.fit(trainX, trainY, validation_data=(testX, testY), epochs=250, batch_size=16) 39 | 40 | # 预测 41 | print('[INFO] evaluating network...') 42 | predictions = model.predict(testX, batch_size=16) 43 | print(classification_report(testY.argmax(axis=1), 44 | predictions.argmax(axis=1), target_names=dataset.target_names)) 45 | -------------------------------------------------------------------------------- /Maths/Binary.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2018/12/22 21:39 5 | @Author : cai 6 | 7 | 二进制相关知识,包括转换为十进制,移位操作和逻辑操作 8 | """ 9 | 10 | 11 | def decimal_to_binary(decimal_val): 12 | ''' 13 | 十进制转为二进制 14 | :param decimal_val: 15 | :return: 16 | ''' 17 | print('transfer %d to binary' % decimal_val) 18 | recursion_result = change(decimal_val) 19 | print('递归实现转换结果:', recursion_result) 20 | 21 | 22 | # 十进制转二进制的方法:除2取余,逆序排列, https://blog.csdn.net/shirley_sweet/article/details/73896279 23 | def change(n): 24 | result = '0' 25 | if n == 0: # 输入为0的情况 26 | return result 27 | else: 28 | result = change(n // 2) # 调用自身 29 | return result + str(n % 2) 30 | 31 | 32 | def binary_to_decimal_func(val): 33 | ''' 34 | 按照定义来实现,即 2^n 的形式 35 | :param val: str 36 | :return: 37 | ''' 38 | print('original val: ', val) 39 | numbers = len(val) 40 | result = 0 41 | for i in range(numbers): 42 | result += int(val[i]) * pow(2, numbers - i - 1) 43 | return result 44 | 45 | 46 | def binary_to_decimal(val): 47 | ''' 48 | 二进制转十进制 49 | :param val: such as 100101 50 | :return: 51 | ''' 52 | # 第一种方法,内建函数--int(),输入值必须是字符串形式 53 | decimal = int(str(val), 2) 54 | print('二进制数为: 0b%d' % val) 55 | print('二进制转换为十进制为:', decimal) 56 | # 第二种实现方法 57 | decimal2 = binary_to_decimal_func(str(val)) 58 | print('第二种转换二进制为十进制:', decimal2) 59 | 60 | 61 | def decimal_to_other_build_function(dec): 62 | ''' 63 | 采用内建函数将十进制转换成二进制、八进制和十六进制 64 | 参考 http://www.runoob.com/python3/python3-conversion-binary-octal-hexadecimal.html 65 | :param dec: 66 | :return: 67 | ''' 68 | print("decimal val:", dec) 69 | print("binary result:", bin(dec)) 70 | print("octal result:", oct(dec)) 71 | print("hexadecimal result:", hex(dec)) 72 | 73 | 74 | def left_shift(val, n): 75 | ''' 76 | 左移操作 77 | :param val: 78 | :param n: 移动的位数 79 | :return: 80 | ''' 81 | 82 | print('二进制数为: 0b%d' % val) 83 | val = int(str(val), 2) 84 | print('十进制数值:', val) 85 | result = val << n 86 | print('left shift %d, result=%s' % (n, result)) 87 | result = bin(int(result)) 88 | print('left shift {}, result={}'.format(n, result)) 89 | 90 | 91 | def right_shift(val, n): 92 | ''' 93 | 右移操作 94 | :param val: 95 | :param n: 96 | :return: 97 | ''' 98 | print('二进制数为: 0b%d' % val) 99 | val = int(str(val), 2) 100 | print('十进制数值:', val) 101 | math_val = val >> n 102 | print('right shift {}, math_val={}'.format(n, math_val)) 103 | result = bin(int(math_val)) 104 | print('left shift {}, result={}'.format(n, result)) 105 | 106 | 107 | def logic_operation(val1, val2): 108 | ''' 109 | 二进制的逻辑运算,与、或、非以及异或操作 110 | :param val1: 111 | :param val2: 112 | :return: 113 | ''' 114 | print('orginal val:{},{}'.format(val1, val2)) 115 | dec_val1 = int(str(val1), 2) 116 | dec_val2 = int(str(val2), 2) 117 | print('decimal val:{},{}'.format(dec_val1, dec_val2)) 118 | and_result = dec_val1 & dec_val2 119 | or_result = dec_val1 | dec_val2 120 | not_result1 = ~dec_val1 121 | not_result2 = ~dec_val2 122 | different_or_result = dec_val1 ^ dec_val2 123 | print('and result:', bin(int(and_result))) 124 | print('or result:', bin(int(or_result))) 125 | print('not result1:', bin(int(not_result1))) 126 | print('not result2:', bin(int(not_result2))) 127 | print('different or result:', bin(int(different_or_result))) 128 | 129 | 130 | if __name__ == '__main__': 131 | dec_val = 53 132 | binary_val = 100101 133 | binary_val2 = 110100 134 | 135 | # print('use build function to transform decimal value') 136 | # decimal_to_other_build_function(dec_val) 137 | # binary_to_decimal(binary_val) 138 | # decimal_to_binary(dec_val) 139 | left_shift(binary_val, 1) 140 | right_shift(binary_val, 1) 141 | logic_operation(binary_val, binary_val2) 142 | -------------------------------------------------------------------------------- /Maths/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2018/12/22 21:38 5 | @Author : cai 6 | """ -------------------------------------------------------------------------------- /Maths/lesson_iterations.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/1/12 18:01 5 | @Author : cai 6 | 7 | 迭代法 8 | """ 9 | 10 | 11 | def get_number_of_wheat(grid): 12 | ''' 13 | \计算放到给定格子数量需要的麦子数量 14 | :param grid: 格子数 15 | :return: 16 | ''' 17 | # f(1) = 1 18 | wheat_numbers = 1 19 | 20 | sums = wheat_numbers 21 | for i in range(2, grid + 1): 22 | wheat_numbers *= 2 23 | sums += wheat_numbers 24 | 25 | print('when grid = %d, wheats numbers = %d' % (grid, sums)) 26 | 27 | return sums 28 | 29 | 30 | def get_square_root(n, threshold, max_try): 31 | ''' 32 | 计算大于 1 的正整数的平方根 33 | :param n: 给定正整数 34 | :param threshold: 误差的阈值 35 | :param max_try: 最大尝试次数 36 | :return: 37 | ''' 38 | if n <= 1: 39 | return -1.0 40 | # interval boundary 区间的左右边界 41 | left = 1.0 42 | right = float(n) 43 | for idx in range(max_try): 44 | # 防止溢出 45 | middle = left + (right - left) / 2 46 | square = middle * middle 47 | # 误差 48 | delta = abs(square / n - 1) 49 | if delta <= threshold: 50 | return middle 51 | else: 52 | if square > n: 53 | right = middle 54 | else: 55 | left = middle 56 | 57 | return -2.0 58 | 59 | 60 | def search_word(dictionary, word): 61 | ''' 62 | 查找匹配单词 63 | :param dictionary: 排序后的字典 64 | :param word:待查找单词 65 | :return: 66 | ''' 67 | if dictionary is None: 68 | return False 69 | if len(dictionary) < 1: 70 | return False 71 | 72 | left = 0 73 | right = len(dictionary) - 1 74 | while left <= right: 75 | middle = int(left + (right - left) / 2) 76 | if dictionary[middle] == word: 77 | return True 78 | else: 79 | if dictionary[middle] > word: 80 | right = middle - 1 81 | else: 82 | left = middle + 1 83 | 84 | return False 85 | 86 | 87 | if __name__ == '__main__': 88 | # print('compute numbers of wheat!') 89 | # numbers_grid = 63 90 | # get_number_of_wheat(numbers_grid) 91 | 92 | # print('get square root') 93 | # square_root = get_square_root(10, 0.000001, 10000) 94 | # if square_root == -1.0: 95 | # print('please input a number > 1') 96 | # elif square_root == -2.0: 97 | # print('cannot find the square root') 98 | # else: 99 | # print('square root==', square_root) 100 | 101 | print('find word in dictionary') 102 | dict_list = ['i', 'am', 'coder'] 103 | dict_list = sorted(dict_list) 104 | print('sorted dict:', dict_list) 105 | word_to_find = 'am' 106 | found = search_word(dict_list, word_to_find) 107 | if found: 108 | print('word "%s" found in dictionary--%s!' % (word_to_find, dict_list)) 109 | else: 110 | print('cannot find the word "%s"' % word_to_find) 111 | 112 | print('finish') 113 | -------------------------------------------------------------------------------- /PythonNotes/plane.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/PythonNotes/plane.jpg -------------------------------------------------------------------------------- /PythonNotes/plane.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/PythonNotes/plane.png -------------------------------------------------------------------------------- /PythonNotes/png2jpg.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### png2jpg" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 4, 13 | "metadata": {}, 14 | "outputs": [], 15 | "source": [ 16 | "import os\n", 17 | "from PIL import Image\n", 18 | "%matplotlib inline\n", 19 | "import matplotlib.pyplot as plt" 20 | ] 21 | }, 22 | { 23 | "cell_type": "code", 24 | "execution_count": 11, 25 | "metadata": {}, 26 | "outputs": [ 27 | { 28 | "name": "stdout", 29 | "output_type": "stream", 30 | "text": [ 31 | "RGBA (1280, 934)\n" 32 | ] 33 | }, 34 | { 35 | "data": { 36 | "text/plain": [ 37 | "" 38 | ] 39 | }, 40 | "execution_count": 11, 41 | "metadata": {}, 42 | "output_type": "execute_result" 43 | }, 44 | { 45 | "data": { 46 | "image/png": "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\n", 47 | "text/plain": [ 48 | "
" 49 | ] 50 | }, 51 | "metadata": { 52 | "needs_background": "light" 53 | }, 54 | "output_type": "display_data" 55 | } 56 | ], 57 | "source": [ 58 | "# 原始的 png 图片\n", 59 | "ori_img = 'plane.png'\n", 60 | "# 读取图片\n", 61 | "img_png = Image.open(ori_img)\n", 62 | "print(img_png.mode, img_png.size)\n", 63 | "plt.imshow(img_png)" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 10, 69 | "metadata": {}, 70 | "outputs": [ 71 | { 72 | "name": "stdout", 73 | "output_type": "stream", 74 | "text": [ 75 | "RGB (1280, 934)\n" 76 | ] 77 | }, 78 | { 79 | "data": { 80 | "text/plain": [ 81 | "" 82 | ] 83 | }, 84 | "execution_count": 10, 85 | "metadata": {}, 86 | "output_type": "execute_result" 87 | }, 88 | { 89 | "data": { 90 | "image/png": "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\n", 91 | "text/plain": [ 92 | "
" 93 | ] 94 | }, 95 | "metadata": { 96 | "needs_background": "light" 97 | }, 98 | "output_type": "display_data" 99 | } 100 | ], 101 | "source": [ 102 | "# 转 jpg\n", 103 | "img_pil = img_png.convert('RGBA')\n", 104 | "x, y = img_pil.size\n", 105 | "img_jpg = Image.new('RGBA', img_pil.size, (255, 255, 255))\n", 106 | "img_jpg.paste(img_pil, (0, 0, x, y), img_pil)\n", 107 | "img_jpg = img_jpg.convert(\"RGB\")\n", 108 | "print(img_jpg.mode, img_jpg.size)\n", 109 | "plt.imshow(img_jpg)" 110 | ] 111 | }, 112 | { 113 | "cell_type": "code", 114 | "execution_count": 8, 115 | "metadata": {}, 116 | "outputs": [], 117 | "source": [ 118 | "img_jpg.save('plane.jpg')" 119 | ] 120 | }, 121 | { 122 | "cell_type": "code", 123 | "execution_count": null, 124 | "metadata": {}, 125 | "outputs": [], 126 | "source": [] 127 | } 128 | ], 129 | "metadata": { 130 | "kernelspec": { 131 | "display_name": "Python 3", 132 | "language": "python", 133 | "name": "python3" 134 | }, 135 | "language_info": { 136 | "codemirror_mode": { 137 | "name": "ipython", 138 | "version": 3 139 | }, 140 | "file_extension": ".py", 141 | "mimetype": "text/x-python", 142 | "name": "python", 143 | "nbconvert_exporter": "python", 144 | "pygments_lexer": "ipython3", 145 | "version": "3.7.4" 146 | } 147 | }, 148 | "nbformat": 4, 149 | "nbformat_minor": 4 150 | } 151 | -------------------------------------------------------------------------------- /Python_100_examples/README.md: -------------------------------------------------------------------------------- 1 | ## Python-100例 练习题 2 | 3 | Python 100例的练习题代码,例题网址:http://www.runoob.com/python/python-100-examples.html 4 | 5 | 6 | 7 | ### Example-1 三位数组合 8 | 9 | > **题目**:有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少? 10 | 11 | #### 思路 12 | 13 | 最简单的方法,就是穷举法了,分别求出在百位、十位、个位上的数字,然后剔除出现重复数字的组合,剩余的就是答案了。 14 | 15 | ### Example-2 企业发放奖金 16 | 17 | > **题目**:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数? 18 | 19 | #### 思路 20 | 21 | 这道题目可以根据每个奖金发放区间来分界,先分别定义两个数组,一个数组是存放每个区间奖金的提成比例,记为`rat`;另一个数组是记录每个发放区间的上边界,表示当超过该边界时候,直接利用上边界乘以该区间的提成比例,例如对于在 10 万元以下的这个区间,就是上边界为 10 万,然后超过后,该区间发放奖金就是`100000*0.1`。 22 | 23 | 然后我们先考虑利润超过 100 万的情况,依次降低利润,对应每种情况。 24 | 25 | ### Example-3 完全平方数 26 | 27 | > **题目**:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 28 | 29 | #### 思路 30 | 31 | 首先我们可以假设这个整数是 `x`,那么根据题目有: 32 | 33 | ``` 34 | x+100 = m**2 (1) 35 | x+100+168 = n**2 (2) 36 | ``` 37 | `m, n `都是正整数,接着就是先根据求解一元二次方程组的做法,可以得到 38 | 39 | ``` 40 | n**2 - n**2 = 168 (3) 41 | ``` 42 | 利用平方差分解上式,有 `(n-m)(n+m)=168`,这个时候,我们再做一个变换: 43 | 44 | ``` 45 | m + n = i (4) 46 | n - m = j (5) 47 | i * j = 168 (6) 48 | ``` 49 | 这个变换,其实只是再设置两个变量 `i,j`,并且根据它们两者相乘是 168,这是一个偶数,由于两个数相乘是偶数,有两种情况,两者都是偶数,或者一个偶数和一个奇数,然后再求解(4)和(5),有: 50 | 51 | ``` 52 | n = (i + j) / 2 (7) 53 | m = (i - j) / 2 (8) 54 | ``` 55 | 根据(7)式子,`i+j `必须是偶数,这样才可以被 2 整除,得到正整数 `n`,这种情况下,结合(4)和(5),可以推导得到 `i,j` 都是大于等于 2 的偶数,又根据(6),可以推导到 `i,j` 的范围是: 56 | 57 | ``` 58 | 1 < j < i < 85 59 | ``` 60 | 这里是假设了 `i > j` 的情况,因为不存在一个偶数的平方就是 `168`,所以假设 `i>j`。 61 | 62 | ### Example-4 判断天数 63 | 64 | > **题目**:输入某年某月某日,判断这一天是这一年的第几天? 65 | 66 | #### 思路 67 | 68 | 判断输入的日期是一年中的第几天,因为一年有12个月,我们可以先考虑计算逐月累计的天数,假设输入的月份是 `m`,那么前 `m-1`个月份的天数是可以计算出来的,比如输入的是 2018 年 3 月 5 日,那么前两个月的天数就是`31+28=59`天,然后再加上输入的天,即 `59+5=64`天。 69 | 70 | 当然,涉及到日期,年份,都需要考虑闰年,闰年的定义如下,来自百度百科 71 | 72 | > **普通闰年**: 能被4整除但不能被100整除的年份为普通闰年。(如2004年就是闰年,1999年不是闰年); 73 | > 74 | > **世纪闰年**: 能被400整除的为世纪闰年。(如2000年是世纪闰年,1900年不是世纪闰年); 75 | 76 | ### Example-5 排序 77 | 78 | > **题目**:输入三个整数 x,y,z,请把这三个数由小到大输出。 79 | 80 | #### 思路 81 | 82 | 考虑令 x 保存最小的数值,即先令 x 分别和 y,z 作比较,通过比较后,x变成最小值,接着 y 和 z 比较,即可完成排序 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | ### Example-6 斐波那契数列 91 | 92 | > **题目**:斐波那契数列 93 | 94 | #### 思路 95 | 96 | 斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、.... 97 | 98 | 数学上的定义如下: 99 | 100 | ``` 101 | n=0: F(0)=0 102 | n=1: F(1)=1 103 | n>=2: F(n)=F(n-1)+F(n-2) 104 | ``` 105 | 106 | 107 | ### Example-7 复制列表 108 | 109 | > **题目**:将一个列表的数据复制到另一个列表 110 | 111 | #### 思路 112 | 113 | 直接采用切片操作,即 `[:]` 114 | 115 | 116 | ### Example-8 乘法口诀 117 | 118 | > **题目**:输出 9*9 乘法口诀 119 | 120 | #### 思路 121 | 122 | 最简单就是通过两层的 for 循环,两个参数,一个控制行,一个控制列,然后注意每行输出个数,即每层循环的起始和结束条件。 123 | 124 | -------------------------------------------------------------------------------- /Python_100_examples/example1.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/1/26 16:45 5 | @Author : cai 6 | 7 | examples come from http://www.runoob.com/python/python-exercise-example1.html 8 | """ 9 | 10 | 11 | # ============== Example 1 ====================================== 12 | # 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少? 13 | # =============================================================== 14 | 15 | def create_three_digits(number_start=1, number_end=4): 16 | ''' 17 | 给定指定数字范围(比如1到4),求可以组成多少个无重复的三位数 18 | :param number_start: 起始数字 19 | :param number_end: 结束数字 20 | :return: 返回数量,以及可能的三位数的列表 21 | ''' 22 | count = 0 23 | result_list = list() 24 | for i in range(number_start, number_end + 1): 25 | for j in range(number_start, number_end + 1): 26 | for k in range(number_start, number_end + 1): 27 | if (i != j) and (i != k) and (j != k): 28 | count += 1 29 | result_list.append(str(i) + str(j) + str(k)) 30 | return count, result_list 31 | 32 | 33 | def create_three_digits2(number_start=1, number_end=4): 34 | ''' 35 | 采用列表推导式实现 36 | :param number_start: 37 | :param number_end: 38 | :return: 39 | ''' 40 | return [str(i) + str(j) + str(k) for i in range(number_start, number_end + 1) for j in 41 | range(number_start, number_end + 1) for k in 42 | range(number_start, number_end + 1) if (i != j) and (i != k) and (j != k)] 43 | 44 | 45 | if __name__ == '__main__': 46 | count, result_list = create_three_digits(number_start=1, number_end=4) 47 | print('valid count={}, and they are:'.format(count)) 48 | for result in result_list: 49 | print(result) 50 | 51 | result2 = create_three_digits2(number_start=1, number_end=4) 52 | print('numbers:', len(result2)) 53 | for result in result2: 54 | print(''.join(str(result[:]))) 55 | -------------------------------------------------------------------------------- /Python_100_examples/example2.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/1/26 22:29 5 | @Author : cai 6 | 7 | examples come from http://www.runoob.com/python/python-exercise-example2.html 8 | """ 9 | 10 | 11 | # ============== Example 2 ====================================== 12 | # 企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%; 13 | # 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%; 14 | # 20万到40万之间时,高于20万元的部分,可提成5%; 15 | # 40万到60万之间时高于40万元的部分,可提成3%; 16 | # 60万到100万之间时,高于60万元的部分,可提成1.5%, 17 | # 高于100万元时,超过100万元的部分按1%提成, 18 | # 从键盘输入当月利润I,求应发放奖金总数? 19 | # 20 | # =============================================================== 21 | 22 | def pay_award(): 23 | profit = int(input('净利润:')) 24 | arr = [1000000, 600000, 400000, 200000, 100000, 0] 25 | rat = [0.01, 0.015, 0.03, 0.05, 0.075, 0.1] 26 | r = 0 27 | for idx in range(0, 6): 28 | if profit > arr[idx]: 29 | # 当前区间的利润 30 | r += (profit - arr[idx]) * rat[idx] 31 | print('current award=', (profit - arr[idx]) * rat[idx]) 32 | # 重置下一个区间起始奖金数量 33 | profit = arr[idx] 34 | return r 35 | 36 | 37 | if __name__ == '__main__': 38 | result = pay_award() 39 | print('award=', result) 40 | -------------------------------------------------------------------------------- /Python_100_examples/example3.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/1/26 22:29 5 | @Author : cai 6 | 7 | examples come from http://www.runoob.com/python/python-exercise-example3.html 8 | """ 9 | 10 | 11 | # ============== Example 3 ====================================== 12 | # 一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少? 13 | # =============================================================== 14 | 15 | def perfect_square(): 16 | for i in range(1, 85): 17 | if 168 % i == 0: 18 | j = 168 / i; 19 | if i > j and (i + j) % 2 == 0 and (i - j) % 2 == 0: 20 | m = (i + j) / 2 21 | n = (i - j) / 2 22 | x = n * n - 100 23 | print(x) 24 | 25 | 26 | def perfect_square2(): 27 | ''' 28 | 列表推导式 29 | :return: 30 | ''' 31 | [print(m ** 2 - 100, end=',') for m in range(1, 169) for n in range(1, 169) if (n ** 2 - m ** 2) == 168] 32 | 33 | 34 | def perfect_square2_loop(): 35 | ''' 36 | for 循环形式 37 | :return: 38 | ''' 39 | for m in range(1, 169): 40 | for n in range(1, 169): 41 | if (n ** 2 - m ** 2) == 168: 42 | print(m ** 2 - 100, end=',') 43 | 44 | 45 | if __name__ == '__main__': 46 | perfect_square() 47 | perfect_square2() 48 | print('\n') 49 | perfect_square2_loop() 50 | -------------------------------------------------------------------------------- /Python_100_examples/example4.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/1/31 17:18 5 | @Author : cai 6 | 7 | examples come from http://www.runoob.com/python/python-exercise-example4.html 8 | """ 9 | 10 | 11 | # ============== Example 4 ====================================== 12 | # 输入某年某月某日,判断这一天是这一年的第几天? 13 | # =============================================================== 14 | 15 | def calculate_days(): 16 | year = int(input('year:\n')) 17 | month = int(input('month:\n')) 18 | day = int(input('day:\n')) 19 | 20 | # 统计前 m-1 个月的天数 21 | months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334] 22 | sums = 0 23 | if 0 < month <= 12: 24 | sums = months[month - 1] 25 | else: 26 | print('Invalid month:', month) 27 | 28 | sums += day 29 | 30 | # 判断闰年 31 | is_leap = False 32 | if (year % 400 == 0) or ((year % 4 == 0) and (year % 100 != 0)): 33 | is_leap = True 34 | if is_leap and month > 2: 35 | sums += 1 36 | return sums 37 | 38 | 39 | if __name__ == '__main__': 40 | days = calculate_days() 41 | print('it is the %dth day' % days) 42 | -------------------------------------------------------------------------------- /Python_100_examples/example5.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/2/16 20:18 5 | @Author : cai 6 | 7 | example come from http://www.runoob.com/python/python-exercise-example5.html 8 | """ 9 | 10 | 11 | # ============== Example 5 ====================================== 12 | # 输入三个整数 x,y,z,请把这三个数由小到大输出。 13 | # =============================================================== 14 | 15 | def sort_numbers_1(): 16 | x = int(input('integer:\n')) 17 | y = int(input('integer:\n')) 18 | z = int(input('integer:\n')) 19 | print('input numbers: x=%d, y=%d, z=%d' % (x, y, z)) 20 | if x > y: 21 | x, y = y, x 22 | if x > z: 23 | x, z = z, x 24 | if y > z: 25 | y, z = z, y 26 | print('sorted: x=%d, y=%d, z=%d' % (x, y, z)) 27 | 28 | # 利用列表的内置函数 sort() 29 | def sort_numbers_2(): 30 | l = [] 31 | for i in range(3): 32 | x = int(input('integer:\n')) 33 | l.append(x) 34 | print('original list:', l) 35 | l.sort() 36 | print('sorted:', l) 37 | 38 | 39 | if __name__ == '__main__': 40 | sort_numbers_1() 41 | sort_numbers_2() 42 | print('finish!') 43 | -------------------------------------------------------------------------------- /Python_100_examples/example6-7.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/2/16 20:36 5 | @Author : cai 6 | 7 | example 6 come from http://www.runoob.com/python/python-exercise-example6.html 8 | example 7 come from http://www.runoob.com/python/python-exercise-example7.html 9 | """ 10 | import time 11 | 12 | 13 | # ============== Example 6 ====================================== 14 | # 斐波那契数列 15 | # =============================================================== 16 | 17 | # 采用迭代循环实现 18 | def fib1(n): 19 | a, b = 1, 1 20 | # n 必须大于等于 2 21 | for i in range(n - 1): 22 | a, b = b, a + b 23 | return a 24 | 25 | 26 | # 递归实现 27 | def fib2(n): 28 | if 0 < n <= 2: 29 | return 1 30 | else: 31 | return fib2(n - 1) + fib2(n - 2) 32 | 33 | 34 | # 输出指定个数的斐波那契数列 35 | def fib_array(n): 36 | if n == 1: 37 | return [1] 38 | if n == 2: 39 | return [1, 1] 40 | fibs = [1, 1] 41 | for i in range(2, n): 42 | fibs.append(fibs[-1] + fibs[-2]) 43 | return fibs 44 | 45 | 46 | # ============== Example 7 ====================================== 47 | # 复制列表 48 | # =============================================================== 49 | 50 | def copy_list(input_list): 51 | print('original list: {}'.format(input_list)) 52 | copyed_list = input_list[:] 53 | print('copyed_list: {}'.format(copyed_list)) 54 | 55 | 56 | if __name__ == '__main__': 57 | start = time.time() 58 | a1 = fib1(30) 59 | print('fib1 cost time: ', time.time() - start) 60 | print('fib1 result=', a1) 61 | start2 = time.time() 62 | a2 = fib2(30) 63 | print('fib2 cost time: ', time.time() - start2) 64 | fibs = fib_array(10) 65 | print('fib2 result=', a2) 66 | print('fib array=', fibs) 67 | 68 | list1 = [3, 2, '1', [1,2]] 69 | copy_list(list1) 70 | 71 | print('finish!') 72 | -------------------------------------------------------------------------------- /Python_100_examples/example8.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/2/27 21:36 5 | @Author : cai 6 | 7 | example 8 come from http://www.runoob.com/python/python-exercise-example8.html 8 | example 9 come from http://www.runoob.com/python/python-exercise-example9.html 9 | example 10 come from http://www.runoob.com/python/python-exercise-example10.html 10 | 11 | """ 12 | import time 13 | 14 | 15 | # ============== Example 8 ====================================== 16 | # 乘法口诀 17 | # =============================================================== 18 | 19 | # 第一种,for 循环实现 20 | def multiplication_table1(): 21 | for i in range(1, 10): 22 | for j in range(1, i + 1): 23 | print('%d*%d=%-2d ' % (i, j, i * j), end='') 24 | print('') 25 | 26 | 27 | # 第二种,一行代码实现 28 | def multiplication_table2(): 29 | print('\n'.join([' '.join(['%s*%s=%-2s' % (y, x, x * y) for y in range(1, x + 1)]) for x in range(1, 10)])) 30 | 31 | 32 | # ============== Example 9 ====================================== 33 | # 暂停一秒输出 34 | # =============================================================== 35 | 36 | def sleep_print(): 37 | print("Start : %s" % time.ctime()) 38 | time.sleep(1) 39 | print("End : %s" % time.ctime()) 40 | 41 | 42 | # ============== Example 10 ====================================== 43 | # 暂停一秒输出,然后格式化当前时间 44 | # =============================================================== 45 | 46 | def sleep_print2(): 47 | print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) 48 | time.sleep(1) 49 | print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) 50 | 51 | if __name__ == '__main__': 52 | # multiplication_table1() 53 | # multiplication_table2() 54 | # sleep_print() 55 | # sleep_print2() 56 | 57 | print('finish') 58 | -------------------------------------------------------------------------------- /Python_cheatsheet/String_const_to_variable.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/3/17 13:58 5 | @Author : cai 6 | 7 | 如何实现字符串常量转变量,相当于动态生成变量 8 | """ 9 | 10 | 11 | lists = ['A', 'B', 'C', 'D'] 12 | 13 | # 解法1,利用 globals() 修改全局变量空间 14 | 15 | for i in lists: 16 | globals()[i] = [] 17 | 18 | # 打印 [] 19 | print(A) 20 | 21 | # 解法2,利用 exce() 22 | for i in lists: 23 | # python3.6 的实现 24 | # exec(f"{i}=[]") 25 | # exec('{} = [1]'.format(i)) 26 | # exec(i +'=[2]') 27 | exec(' '.join([i, '=[3]'])) 28 | 29 | print(B) 30 | 31 | -------------------------------------------------------------------------------- /Python_cheatsheet/basic_practise.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/3/25 22:08 5 | @Author : cai 6 | """ 7 | 8 | # 缩进例子 9 | 10 | # 正确示例 11 | i = 2 12 | if i == 3: 13 | print('true!') 14 | else: 15 | print('False') 16 | 17 | # 错误示例 18 | if i == 3: 19 | print('i:') 20 | print(i) 21 | else: 22 | print('wrong answer!') 23 | print('please check again') 24 | 25 | sentence1 = "I love " + \ 26 | "python" 27 | 28 | sentence2 = ["I", "love", 29 | "python"] 30 | 31 | print('Hello'); 32 | print('world') 33 | 34 | # 等待用户输入 35 | # user_input = input('请输入一个数字:\n') 36 | # print('user_input=', user_input) 37 | 38 | a = 3 39 | b = 2 40 | c = 4 41 | d = 5 42 | # 默认换行 43 | print(a) 44 | print(b) 45 | # 不换行 46 | print(c, end=',') 47 | print(d) 48 | 49 | # 变量赋值 50 | counter = 100 # 赋值整型变量 51 | miles = 1000.0 # 浮点型 52 | name = "John" # 字符串 53 | 54 | print(counter) 55 | print(miles) 56 | print(name) 57 | # 多个变量赋值 58 | n = m = k = 2 59 | cc, mm, nn = 1, 3.2, 'abc' 60 | print('n=m=k=', n, m, k) 61 | print('cc=', cc) 62 | print('mm=', mm) 63 | print('nn=', nn) 64 | 65 | # int 66 | q = 1 67 | # float 68 | w = 2.3 69 | # bool 70 | e = True 71 | # complex 72 | r = 1 + 3j 73 | print(q, w, e, r) # 1 2.3 True (1+3j) 74 | 75 | # 内置的 type() 函数可以用来查询变量所指的对象类型 76 | print(type(q)) # 77 | print(type(w)) # 78 | print(type(e)) # 79 | print(type(r)) # 80 | 81 | # 也可以采用 isinstance() 82 | # isinstance 和 type 的区别在于:type()不会认为子类是一种父类类型,isinstance()会认为子类是一种父类类型 83 | print(isinstance(q, int)) # True 84 | print(isinstance(q, float)) # False 85 | 86 | # 数值运算 87 | # 加 88 | print('2 + 3 =', 2 + 3) # 2 + 3 = 5 89 | # 减 90 | print('3 - 2 =', 3 - 2) # 3 - 2 = 1 91 | # 乘 92 | print('5 * 8 =', 5 * 8) # 5 * 8 = 40 93 | # 除 94 | # 得到浮点数,完整的结果 95 | print('5 / 2 =', 5 / 2) # 5 / 2 = 2.5 96 | # 得到一个整数 97 | print('5 // 2 =', 5 // 2) # 5 // 2 = 2 98 | # 取余 99 | print('5 % 2 =', 5 % 2) # 5 % 2 = 1 100 | # 乘方 101 | print('5 ** 2 =', 5 ** 2) # 5 ** 2 = 25 102 | -------------------------------------------------------------------------------- /Python_cheatsheet/dict_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/4/12 21:24 5 | @Author : luocai 6 | @file : dict_example.py 7 | @concat : 429546420@qq.com 8 | @site : 9 | @software: PyCharm Community Edition 10 | @desc : 11 | 12 | 字典知识点 13 | """ 14 | # 创建字典 3 种方式 15 | # {} 形式 16 | dic1 = {'name': 'python', 'age': 20} 17 | # 内置方法 dict() 18 | dic2 = dict(name='p', age=3) 19 | # 字典推导式 20 | dic3 = {x: x ** 2 for x in {2, 4, 6}} 21 | print('dic1={}'.format(dic1)) 22 | print('dic2={}'.format(dic2)) 23 | print('dic3={}'.format(dic3)) 24 | 25 | # 三个常见的内置方法,keys(), values(), items() 26 | print('keys()方法,dic1.keys()={}'.format(dic1.keys())) 27 | print('values()方法, dic1.values()={}'.format(dic1.values())) 28 | print('items()方法, dic1.items()={}'.format(dic1.items())) 29 | 30 | # 修改和访问 31 | dic1['age'] = 33 32 | dic1.setdefault('sex', 'male') 33 | print('dic1={}'.format(dic1)) 34 | # get() 访问某个键 35 | print('dic1.get(\'age\', 11)={}'.format(dic1.get('age', 11))) 36 | print('访问某个不存在的键,dic1.get(\'score\', 100)={}'.format(dic1.get('score', 100))) 37 | # 删除 38 | del dic1['sex'] 39 | print('del dic1[\'sex\'], dic1={}'.format(dic1)) 40 | dic1.pop('age') 41 | print('dic1.pop(\'age\'), dic1={}'.format(dic1)) 42 | # 清空 43 | dic1.clear() 44 | print('dic1.clear(), dic1={}'.format(dic1)) 45 | # 合并两个字典 46 | print('合并 dic2 和 dic3 前, dic2={}, dic3={}'.format(dic2, dic3)) 47 | dic2.update(dic3) 48 | print('合并后,dic2={}'.format(dic2)) 49 | 50 | # 遍历字典 51 | dic4 = {'a': 1, 'b': 2} 52 | for key, val in dic4.items(): 53 | print('{}: {}'.format(key, val)) 54 | # 不需要采用 keys() 55 | for key in dic4: 56 | print('{}: {}'.format(key, dic4[key])) 57 | 58 | # 判断数据类型是否不可改变 59 | # id() 方法 60 | i = 2 61 | print('i id value=', id(i)) 62 | i += 3 63 | print('i id value=', id(i)) 64 | 65 | l1 = [1, 3] 66 | print('l1 id value=', id(l1)) 67 | l1.append(4) 68 | print('l1 id value=', id(l1)) 69 | 70 | # hash 71 | s = 'abc' 72 | print('s hash value: ', hash(s)) 73 | l2 = ['321', 1] 74 | print('l2 hash value: ', hash(l2)) 75 | 76 | -------------------------------------------------------------------------------- /Python_cheatsheet/list_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/2/17 21:47 5 | @Author : cai 6 | 7 | 列表知识点 8 | """ 9 | 10 | # =============================================================== 11 | # 初始化 12 | # =============================================================== 13 | # 创建空列表,两种方法 14 | list1 = list() 15 | list2 = [] 16 | # 初始化带有数据 17 | list3 = [1, 2, 3] 18 | list4 = ['a', 2, 'nb', [1, 3, 4]] 19 | 20 | print('list1:', list1) 21 | print('list2:', list2) 22 | print('list3:', list3) 23 | print('list4:', list4) 24 | print('len(list4): ', len(list4)) 25 | 26 | # =============================================================== 27 | # 增删查找 28 | # =============================================================== 29 | # 末尾添加元素 30 | print('=====增加元素=====') 31 | list1.append("abc") 32 | print('list1.append("abc"), list1:', list1) 33 | # 末尾添加另一个列表,并合并为一个列表 34 | list1.extend(list3) 35 | print('list1.extend(list3), list1:', list1) 36 | list1.extend((1, 3)) 37 | print('list1.extend((1,3)), list1:', list1) 38 | # 通过 += 添加元素 39 | list2 += [1, 2, 3] 40 | print('list2 += [1, 2, 3], ist2:', list2) 41 | list2 += list4 42 | print('list2 += list4, list2:', list2) 43 | # 在指定位置添加元素,原始位置元素右移一位 44 | list3.insert(0, "a") 45 | print('list3.insert(0, "a"), list3:', list3) 46 | # 末尾位置添加,原来末尾元素依然保持在末尾 47 | list3.insert(-1, "b") 48 | print('list3.insert(-1, "b"), list3:', list3) 49 | print('=====删除元素=====') 50 | # del 删除指定位置元素 51 | del list3[-1] 52 | print('del list3[-1], list3:', list3) 53 | # pop 删除元素 54 | pop_el = list3.pop() 55 | print('list3:', list3) 56 | print('pop element:', pop_el) 57 | # pop 删除指定位置元素 58 | pop_el2 = list3.pop(0) 59 | print('list3:', list3) 60 | print('pop element:', pop_el2) 61 | # remove 根据值删除元素 62 | list3.remove(1) 63 | print('list3:', list3) 64 | # clear 清空列表 65 | list3.clear() 66 | print('clear list3:', list3) 67 | print('=====查询元素=====') 68 | # index 根据数值查询索引 69 | print('list1:', list1) 70 | ind = list1.index(3) 71 | print('list1.index(3),index=', ind) 72 | print('=====访问&修改元素=====') 73 | # 访问列表第一个元素 74 | print('list1[0]: ', list1[0]) 75 | # 访问列表最后一个元素 76 | print('list1[-1]: ', list1[-1]) 77 | # 访问第一个到第三个元素 78 | print('list1[:3]: ', list1[:3]) 79 | # 访问第一个到第三个元素,步长为2 80 | print('list1[:3:2]: ', list1[:3:2]) 81 | # 复制列表 82 | new_list = list1[:] 83 | print('copy list1, new_list:', new_list) 84 | print('=====排序=====') 85 | list5 = [3, 1, 4, 2, 5] 86 | print('list5:', list5) 87 | # use sorted 88 | list6 = sorted(list5) 89 | print('list6=sorted(list5), list5={}, list6={}'.format(list5, list6)) 90 | # use list.sort() 91 | list5.sort() 92 | print('list5.sort(), list5: ', list5) 93 | 94 | # 列表元素也是列表 95 | list8 = [[4, 3], [5, 2], [1, 1]] 96 | list9 = sorted(list8) 97 | print('list9 = sorted(list8), list9=', list9) 98 | # sorted by the second element 99 | list10 = sorted(list8, key=lambda x: x[1]) 100 | print('list10 = sorted(list8, key=lambda x:x[1]), list10=', list10) 101 | list11 = sorted(list8, key=lambda x: (x[1], x[0])) 102 | print('list11 = sorted(list8, key=lambda x:(x[1],x[0])), list11=', list11) 103 | # 列表元素是字符串 104 | list_str = ['abc', 'pat', 'cda', 'nba'] 105 | list_str_1 = sorted(list_str) 106 | print('list_str_1 = sorted(list_str), list_str_1=', list_str_1) 107 | # 根据第二个元素排列 108 | list_str_2 = sorted(list_str, key=lambda x: x[1]) 109 | print('list_str_2 = sorted(list_str, key=lambda x: x[1]), list_str_2=', list_str_2) 110 | # 先根据第三个元素,再根据第一个元素排列 111 | list_str_3 = sorted(list_str, key=lambda x: (x[2], x[0])) 112 | print('list_str_3 = sorted(list_str, key=lambda x: (x[2], x[0])), list_str_3=', list_str_3) 113 | print('===反转列表===') 114 | # 反转列表 115 | list5.reverse() 116 | print('list5.reverse(), list5: ', list5) 117 | list7 = reversed(list5) 118 | print('list7=reversed(list5), list5={}, list7={}'.format(list5, list7)) 119 | # for val in list7: 120 | # print(val) 121 | list7_val = [val for val in list7] 122 | print('采用列表推导式, list7_val=', list7_val) 123 | list_reversed = list5[::-1] 124 | print('list5 = {}\nlist_reversed = list5[::-1], list_reversed = {}'.format(list5, list_reversed)) 125 | 126 | print('===其他===') 127 | # 列表元素求和 128 | list5 = [3, 1, 4, 2, 5] 129 | print('list5:', list5) 130 | sum_list5 = sum(list5) 131 | print('sum_list5=sum(list5), sum_list5=', sum_list5) 132 | # 实现 list_a + list_b 的对应元素相加操作 133 | list_a = [1, 3, 5] 134 | list_b = [2, 4, 6] 135 | sum_pair = [sum(pair) for pair in zip(list_a, list_b)] 136 | print('sum_pair = [sum(pair) for pair in zip(list_a, list_b)], sum_pair =', sum_pair) 137 | 138 | # 字符串和列表的相互转换 139 | print('===字符串和列表的相互转换===') 140 | strs = 'python' 141 | list_str = list(strs) 142 | print('strs = {}\nlist_str = list(strs), list_str={}'.format(strs, list_str)) 143 | new_strs = '-'.join(list_str) 144 | print('new_strs= ', new_strs) 145 | 146 | # 计算某个元素出现的次数 147 | list_c = [2, 3, 2, 2, 1, 4] 148 | count = list_c.count(2) 149 | print('count = list.count(2), count={}'.format(count)) 150 | -------------------------------------------------------------------------------- /Python_cheatsheet/set_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/4/13 16:25 5 | @Author : luocai 6 | @file : set_example.py 7 | @concat : 429546420@qq.com 8 | @site : 9 | @software: PyCharm Community Edition 10 | @desc : 11 | 12 | 集合 13 | """ 14 | # 创建集合 15 | s1 = {'a', 'b', 'c'} 16 | s2 = set() 17 | s3 = set('abc') 18 | print('s1={}'.format(s1)) 19 | print('s2={}'.format(s2)) 20 | print('s3={}'.format(s3)) 21 | 22 | # 删除重复元素 23 | s4 = set('good') 24 | print('s4={}'.format(s4)) 25 | 26 | # 增加元素,add() 和 update() 27 | s1.add('dd') 28 | print('s1.add(\'dd\'), s1={}'.format(s1)) 29 | s1.update('o') 30 | print('添加一个元素,s1={}'.format(s1)) 31 | s1.update(['n', 1]) 32 | print('添加多个元素, s1={}'.format(s1)) 33 | s1.update([12, 33], {'ab', 'cd'}) 34 | print('添加列表和集合, s1={}'.format(s1)) 35 | 36 | # 删除元素, pop(), remove(), clear() 37 | print('s3={}'.format(s3)) 38 | s3.pop() 39 | print('随机删除元素, s3={}'.format(s3)) 40 | s3.clear() 41 | print('清空所有元素, s3={}'.format(s3)) 42 | s1.remove('a') 43 | print('删除指定元素,s1={}'.format(s1)) 44 | 45 | # 判断是否子集, issubset() 46 | a = set('abc') 47 | b = set('bc') 48 | c = set('cd') 49 | print('b是否a的子集:', b.issubset(a)) 50 | print('c是否a的子集:', c.issubset(a)) 51 | 52 | # 并集操作,union() 或者 | 53 | print('a 和 c 的并集:', a.union(c)) 54 | print('a 和 c 的并集:', a | c) 55 | 56 | # 交集操作,intersection() 或者 & 57 | print('a 和 c 的交集:', a.intersection(c)) 58 | print('a 和 c 的交集:', a & c) 59 | 60 | # 差集操作,difference() 或者 -,即只存在一个集合的元素 61 | print('只在a中的元素:', a.difference(c)) 62 | print('只在a中的元素:', a - c) 63 | 64 | # 对称差集, symmetric_difference() 或者 ^, 求取只存在其中一个集合的所有元素 65 | print('对称差集:', a.symmetric_difference(c)) 66 | print('对称差集:', a ^ c) 67 | -------------------------------------------------------------------------------- /Python_cheatsheet/statement_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/4/17 23:04 5 | @Author : luocai 6 | @file : statement_example.py 7 | @concat : 429546420@qq.com 8 | @site : 9 | @software: PyCharm Community Edition 10 | @desc : 11 | 12 | 条件、循环语句 13 | """ 14 | 15 | a = 3 16 | # if 语句 17 | if a > 0: 18 | print('a =', a) 19 | 20 | # if-else 21 | if a > 2: 22 | print('a is ', a) 23 | else: 24 | print('a is less 2') 25 | 26 | # if-elif-else 27 | if a > 5: 28 | print('a>5') 29 | elif a > 3: 30 | print('a>3') 31 | else: 32 | print('a<=3') 33 | 34 | # 嵌套语句 35 | if a < 0: 36 | print('a<0') 37 | else: 38 | if a > 3: 39 | print('a>3') 40 | else: 41 | print('0 0: 46 | print(n) 47 | n -= 1 48 | # input 49 | promt = "\ninput something, and repeat it." 50 | promt += "\nEnter 'q' to end the program.\n" 51 | message = "" 52 | while message != 'q': 53 | message = input(promt) 54 | print(message) 55 | 56 | 57 | # for 58 | l1 = [i for i in range(3)] 59 | for v in l1: 60 | print(v) 61 | l2 = ['a', 'b', 'c', 'dd', 'nm'] 62 | # 指定区间 63 | for i in range(2, 5): 64 | print(i) 65 | # 指定区间,并加入步长为 10 66 | for j in range(10, 30, 10): 67 | print(j) 68 | # 结合 len 来遍历列表 69 | for i in range(len(l2)): 70 | print('{}: {}'.format(i, l2[i])) 71 | # enumerate() 72 | for i, v in enumerate(l2): 73 | print('{}: {}'.format(i, v)) 74 | 75 | # continue 76 | for a in range(5): 77 | if a == 3: 78 | continue 79 | print(a) 80 | 81 | # break 82 | for a in range(5): 83 | if a == 3: 84 | break 85 | print(a) 86 | 87 | # else 88 | for a in range(5): 89 | print(a) 90 | else: 91 | print('finish!') 92 | -------------------------------------------------------------------------------- /Python_cheatsheet/string_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/4/8 22:12 5 | @Author : luocai 6 | @file : string_example.py 7 | @concat : 429546420@qq.com 8 | @site : 9 | @software: PyCharm Community Edition 10 | @desc : 11 | 12 | """ 13 | s1 = "talk is cheap" 14 | s2 = 'show me the code' 15 | print(s1) 16 | print(s2) 17 | 18 | # 索引值以 0 为开始值,-1 为从末尾的开始位置 19 | print('输出 s1 第一个到倒数第二个的所有字符: ', s1[0:-1]) # 输出第一个到倒数第二个的所有字符 20 | print('输出 s1 字符串第一个字符: ', s1[0]) # 输出字符串第一个字符 21 | print('输出 s1 从第三个开始到第六个的字符: ', s1[2:6]) # 输出从第三个开始到第六个的字符 22 | print('输出 s1 从第三个开始后的所有字符:', s1[2:]) # 输出从第三个开始的后的所有字符 23 | 24 | # 加号 + 是字符串的连接符 25 | # 星号 * 表示复制当前字符串,紧跟的数字为复制的次数 26 | str = "I love python " 27 | print("连接字符串:", str + "!!!") 28 | print("输出字符串两次:", str * 2) 29 | 30 | # 反斜杠 \ 转义特殊字符 31 | # 若不想让反斜杠发生转义,可以在字符串前面添加一个 r 32 | print('I\nlove\npython') 33 | print("反斜杠转义失效:", r'I\nlove\npython') 34 | 35 | # strip() 36 | s3 = " I love python " 37 | s4 = "show something!" 38 | print('输出直接调用 strip() 后的字符串结果: ', s3.strip()) 39 | print('lstrip() 删除左侧空白后的字符串结果: ', s3.lstrip()) 40 | print('rstrip() 删除右侧空白后的字符串结果: ', s3.rstrip()) 41 | print('输出调用 strip(\'!\')后的字符串结果: ', s4.strip('!')) 42 | # split() 43 | s5 = 'hello, world' 44 | print('采用split()的字符串结果: ', s5.split()) 45 | print('采用split(\',\')的字符串结果: ', s5.split(',')) 46 | # join() 47 | l1 = ['an', 'apple', 'in', 'the', 'table'] 48 | print('采用join()连接列表 l1 的结果: ', ''.join(l1)) 49 | print('采用\'-\'.join()连接列表 l1 的结果: ', '-'.join(l1)) 50 | # replace() 51 | print('replace(\'o\', \'l\')的输出结果: ', s5.replace('o', 'l')) 52 | # index() 53 | print('s5.index(\'o\')的输出结果: ', s5.index('o')) 54 | # startswith() / endswith() 55 | print('s5.startswith(\'h\')的输出结果: ', s5.startswith('h')) 56 | print('s5.endswith(\'h\')的输出结果: ', s5.endswith('h')) 57 | # find() 58 | print('s5.find(\'h\')的输出结果: ', s5.find('h')) 59 | # upper() / lower() / title() 60 | print('upper() 字母全大写的输出结果: ', s5.upper()) 61 | print('lower() 字母全小写的输出结果: ', s5.lower()) 62 | print('title() 单词首字母大写的输出结果: ', s5.title()) 63 | -------------------------------------------------------------------------------- /Python_cheatsheet/tuple_example.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/2/25 23:56 5 | @Author : cai 6 | 7 | 元组知识点 8 | """ 9 | # =============================================================== 10 | # 初始化 11 | # =============================================================== 12 | # 创建空元祖,两种方法 13 | t1 = tuple() 14 | t2 = () 15 | t3 = (1, 2, '2', [1, 2], 5) 16 | # 创建一个元素的元祖 17 | t4 = (7,) 18 | t5 = (2) 19 | print('创建两个空元组:t1={}, t2={}'.format(t1, t2)) 20 | print('包含不同元素类型的元组:t3={}'.format(t3)) 21 | print('包含一个元素的元祖: t4=(7, )={}, t5=(2)={}'.format(t4, t5)) 22 | print('type(t4)={}, type(t5)={}'.format(type(t4), type(t5))) 23 | print('输出元组的第一个元素:{}'.format(t3[0])) 24 | print('输出元组的第二个到第四个元素:{}'.format(t3[1:4])) 25 | print('输出元祖的最后一个元素: {}'.format(t3[-1])) 26 | print('输出元祖两次: {}'.format(t3 * 2)) 27 | print('连接元祖: {}'.format(t3 + t4)) 28 | 29 | # 创建一个二维元组 30 | tups = (1, 3, 4), ('1', 'abc') 31 | print('二维元组: {}'.format(tups)) 32 | 33 | 34 | def print_tup(): 35 | return 1, '2' 36 | 37 | 38 | res = print_tup() 39 | print('type(res)={}, res={}'.format(type(res), res)) 40 | 41 | # 元组不可修改,但如果元素可修改,那可以修改该元素内容 42 | tup11 = (1, [1, 3], '2') 43 | print('tup1={}'.format(tup11)) 44 | tup11[1].append('123') 45 | print('修改tup11[1]后,tup11={}'.format(tup11)) 46 | 47 | # count() 48 | print('tup11.count(1)={}'.format(tup11.count(1))) 49 | # index() 50 | print('tup11.index(\'2\')={}'.format(tup11.index('2'))) 51 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CodesNotes 2 | 记录阅读的书籍或者网上教程的代码练习的记录。 3 | 4 | 5 | 6 | #### 正在学习List 7 | 8 | - [程序员的数学基础课](https://time.geekbang.org/column/intro/143) 9 | 10 | ------ 11 | 12 | 这里整理归纳一些平时收集到的书籍、教程、项目等资源,主要是机器学习、深度学习、Python等,目录如下: 13 | 14 | - [AI 参考学习资料](https://github.com/ccc013/CodesNotes#ai-%E5%8F%82%E8%80%83%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99) 15 | - [综合资源](https://github.com/ccc013/CodesNotes#%E7%BB%BC%E5%90%88%E8%B5%84%E6%BA%90) 16 | - [网上教程](https://github.com/ccc013/CodesNotes#%E7%BD%91%E4%B8%8A%E6%95%99%E7%A8%8B) 17 | - [Tensorflow](https://github.com/ccc013/CodesNotes#tensorflow) 18 | - [机器学习](https://github.com/ccc013/CodesNotes#%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0) 19 | - [深度学习](https://github.com/ccc013/CodesNotes#%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0) 20 | - [视频课程](https://github.com/ccc013/CodesNotes#%E8%A7%86%E9%A2%91%E8%AF%BE%E7%A8%8B) 21 | - [机器学习](https://github.com/ccc013/CodesNotes#%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0-1) 22 | - [深度学习](https://github.com/ccc013/CodesNotes#%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0-1) 23 | - [书籍](https://github.com/ccc013/CodesNotes#%E4%B9%A6%E7%B1%8D) 24 | - [机器学习](https://github.com/ccc013/CodesNotes#%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0-2) 25 | - [深度学习](https://github.com/ccc013/CodesNotes#%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0-2) 26 | - [网站](https://github.com/ccc013/CodesNotes#%E7%BD%91%E7%AB%99) 27 | - [国内](https://github.com/ccc013/CodesNotes#%E5%9B%BD%E5%86%85) 28 | - [国外](https://github.com/ccc013/CodesNotes#%E5%9B%BD%E5%A4%96) 29 | - [项目 & Github](https://github.com/ccc013/CodesNotes#%E9%A1%B9%E7%9B%AE--github) 30 | - [博客](https://github.com/ccc013/CodesNotes#%E5%8D%9A%E5%AE%A2) 31 | - [国内](https://github.com/ccc013/CodesNotes#%E5%9B%BD%E5%86%85-1) 32 | - [国外](https://github.com/ccc013/CodesNotes#%E5%9B%BD%E5%A4%96-1) 33 | - [公司&组织](https://github.com/ccc013/CodesNotes#%E5%85%AC%E5%8F%B8%E7%BB%84%E7%BB%87) 34 | - [个人](https://github.com/ccc013/CodesNotes#%E4%B8%AA%E4%BA%BA) 35 | - [Python 参考学习资料](https://github.com/ccc013/CodesNotes#python-%E5%8F%82%E8%80%83%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99) 36 | - [教程](https://github.com/ccc013/CodesNotes#%E6%95%99%E7%A8%8B) 37 | - [Jupyter](https://github.com/ccc013/CodesNotes#jupyter) 38 | - [爬虫](https://github.com/ccc013/CodesNotes#%E7%88%AC%E8%99%AB) 39 | 40 | - [面试相关资料](https://github.com/ccc013/CodesNotes#%E9%9D%A2%E8%AF%95%E7%9B%B8%E5%85%B3%E8%B5%84%E6%96%99) 41 | - [综合](https://github.com/ccc013/CodesNotes#%E7%BB%BC%E5%90%88) 42 | - [题目](https://github.com/ccc013/CodesNotes#%E9%A2%98%E7%9B%AE) 43 | - [面经](https://github.com/ccc013/CodesNotes#%E9%9D%A2%E7%BB%8F) 44 | 45 | ## AI 参考学习资料 46 | 47 | ### 综合资源 48 | 49 | 1. [Awesome Computer Vision](https://github.com/jbhuang0604/awesome-computer-vision)--Github 上的一个9000+星的资源,包含书籍、课程、教程、论文、数据集、博客等等 50 | 2. [资源汇总 | 200多个最好的机器学习、NLP和Python相关教程](http://mp.weixin.qq.com/s?__biz=MzI0NDUwNzYzMg==&mid=2247483951&idx=1&sn=7a83632562662e520407627196c2ba65&chksm=e95df4b0de2a7da6958c89d1a3dbe43bc4165fab2ecdcc4992a666091bb1676e0e3fe570d822&mpshare=1&scene=1&srcid=#rd) 51 | 3. [AI算法工程师手册](http://www.huaxiaozhuan.com/)--包含数学基础、机器学习、深度学习、计算机视觉和NLP等知识 52 | 4. [StateOfTheArt.ai ](https://www.stateoftheart.ai/)--AI 界的 State of the Art都在这里了 53 | 5. [awesome-fashion-ai](https://github.com/ayushidalmia/awesome-fashion-ai/blob/master/README.md)--有关 fashion 和 e-commerce 方面的研究论文、数据集等 54 | 6. [AlphaTree-graphic-deep-neural-network](https://github.com/weslynn/AlphaTree-graphic-deep-neural-network)--介绍了深度学习的一些模型,并且有图示,包含了图像分类、物体检测、人脸检测与识别等方向 55 | 7. [AiLearning: 机器学习 - MachineLearning - ML、深度学习 - DeepLearning - DL、自然语言处理 NLP](https://github.com/apachecn/AiLearning) 56 | 8. [A complete ML study path, focused on TensorFlow and Scikit-Learn](https://github.com/clone95/Machine-Learning-Study-Path-March-2019/tree/master/Career%20Paths/Machine%20Learning%20Engineer%20Career%20Path)--机器学习的学习路线 57 | 58 | ### 网上教程 59 | 60 | #### TensorFlow 61 | 62 | - [Simple and ready-to-use tutorials for TensorFlow](https://github.com/open-source-for-science/TensorFlow-Course#why-use-tensorflow)--简单快速入门的TF教程 63 | - [TensorFlow Tutorial and Examples for Beginners with Latest APIs](https://github.com/aymericdamien/TensorFlow-Examples/)--2w6的Star的教程,从机器学习算法到深度学习,以及一些使用方法,比如数据加载、模型保存、多GPU、可视化 64 | 65 | #### 机器学习 66 | 67 | - [机器学习100天](https://github.com/Avik-Jain/100-Days-Of-ML-Code)[[中文翻译]](https://github.com/MLEveryday/100-Days-Of-ML-Code) 68 | - [Machine Learning in Python](https://www.pyimagesearch.com/2019/01/14/machine-learning-in-python/)--手把手教你利用Python对图像数据进行机器学习(使用scikit-learn 69 | 和Keras):Machine Learning in Python 70 | 注:含KNN、朴素贝叶斯、Logistic回归、SVM、决策树、随机森林、神经网络和深度神经网络和CNN等算法 71 | - [CS229 机器学习速查表](https://github.com/afshinea/stanford-cs-229-machine-learning) 72 | - [机器学习笔记](https://feisky.xyz/machine-learning/)--机器学习与人工智能学习笔记,包括机器学习、深度学习以及常用开源框架(Tensorflow、PyTorch)等 73 | 74 | #### 深度学习 75 | 76 | - [deep_learning_cookbook](https://github.com/DOsinga/deep_learning_cookbook)--基于TensorFlow和Keras的深度学习书籍《Deep Learning Cookbook》,代码很详细,包含多个项目! 77 | - [深度学习教程整理 | 干货](https://github.com/zeusees/HyperDL-Tutorial?from=singlemessage&isappinstalled=0)--整理深度学习方面的教程,包括基础网络、框架总结、网络设计和转换等 78 | - [CS230 深度学习速查表](https://github.com/afshinea/stanford-cs-230-deep-learning) 79 | - [deeplearning.ai(吴恩达老师的深度学习课程笔记及资源)](https://github.com/fengdu78/deeplearning_ai_books),[吴恩达老师的机器学习课程个人笔记](https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes)--同一个作者对吴恩达老师两门课程的笔记和资源 80 | - [Deep Tutorials for PyTorch](https://github.com/sgrvinod/Deep-Tutorials-for-PyTorch)--一系列基于 Pytorch 的教程,目前包括 caption、sequence labeling、object detection 和 Text Classification, 复现对应领域的某篇论文的代码 81 | 82 | 83 | 84 | ### 视频课程 85 | 86 | #### 机器学习 87 | 88 | - 李宏毅老师的 2019 机器学习课程 [[youtube]](https://www.youtube.com/playlist?list=PLJV_el3uVTsOK_ZK5L0Iv_EQoL1JefRL4)[[B站]](https://www.bilibili.com/video/av46561029/) [[课程资料链]](http://speech.ee.ntu.edu.tw/~tlkagk/courses_ML19.html) 89 | - [斯坦福大学的 CS229 机器学习课程](https://link.zhihu.com/?target=http%3A//cs229.stanford.edu/) 90 | - [给程序员的实践深度学习课程](https://course.fast.ai/)[[介绍]](https://mp.weixin.qq.com/s/aGhdgUQaO7eJylwThU65kQ)--整个课程一共7节,带你从理论到应用学成深度学习,计算机视觉、NLP、推荐系统等等一课打尽。并且非常偏向于实践,深受好评! 91 | 92 | #### 深度学习 93 | 94 | - [李宏毅老师的深度学习课程](https://link.zhihu.com/?target=https%3A//www.bilibili.com/video/av9770302) 95 | - [CS231n课程](https://link.zhihu.com/?target=http%3A//cs231n.stanford.edu/) 96 | - Andrew Ng 的 deeplearning.ai [Coursera](http://link.zhihu.com/?target=https%3A//www.coursera.org/specializations/deep-learning) [网易云课堂](http://link.zhihu.com/?target=http%3A//mooc.study.163.com/smartSpec/detail/1001319001.htm) 97 | 98 | ### 书籍 99 | 100 | #### 机器学习 101 | 102 | - 《统计学习方法》 103 | 104 | 代码:https://github.com/wzyonggege/statistical-learning-method 105 | 106 | https://github.com/WenDesi/lihang_book_algorithm 107 | 108 | https://blog.csdn.net/tudaodiaozhale 109 | 110 | https://github.com/fengdu78/lihang-code--python3.6版本 111 | 112 | - 《hands-on-ml-with-sklearn-and-tf》[[电子书]](http://download.csdn.net/download/xinconan1992/9877225)[[中文版翻译]](https://github.com/apachecn/hands_on_Ml_with_Sklearn_and_TF)[[Code]](https://github.com/ageron/handson-ml) 113 | 114 | #### 深度学习 115 | 116 | - 《动手学深度学习》[[pdf]](https://zh.gluon.ai/gluon_tutorials_zh.pdf)[[Github]](Github:https://github.com/diveintodeeplearning/d2l-zh)[[Home]](https://zh.gluon.ai/) 117 | - [深度学习图解](https://www.manning.com/books/grokking-deep-learning?a_aid=grokkingdl&a_bid=32715258)[[代码]](https://github.com/iamtrask/Grokking-Deep-Learning) 118 | - 《21个项目玩转深度学习———基于TensorFlow的实践详解》[[code]](https://github.com/hzy46/Deep-Learning-21-Examples) 119 | 120 | ### 网站 121 | 122 | #### 国内 123 | 124 | - (**推荐**)[机器之心](https://www.jiqizhixin.com/)-- 125 | - [PaperWeekly](https://www.paperweekly.site/tags/176/papers) 126 | - [通天塔](http://tongtianta.site/)--论文阅读,中英文翻译对比 127 | 128 | #### 国外 129 | 130 | - [Arxiv](https://arxiv.org/)--寻找最新论文的网站 131 | - [Arxiv Sanity Preserver](http://www.arxiv-sanity.com/)[[Code]](https://github.com/karpathy/arxiv-sanity-preserver) --对 arXiv 更好的展示论文 132 | - (**强力推荐**)[Papers With Code](https://paperswithcode.com/)--论文及其实现代码 133 | - (**强力推荐**)[Browse state-of-the-art](https://paperswithcode.com/sota)--记录了16个大类,总共950+个任务的当前最先进的技术 134 | - [RSIP vision--图像处理和计算机上视觉](https://www.rsipvision.com/) 135 | - [Learn Opencv](https://www.learnopencv.com/) 136 | - (**推荐**)[PyimageSearch](https://www.pyimagesearch.com)--计算机视觉、opencv等,并且都是详细实现代码,每一步实现都解释得很清楚! 137 | 138 | 139 | 140 | ### 项目 & Github 141 | 142 | - [Tensorflow/models](https://github.com/tensorflow/models)--TensorFlow 官方 Github 143 | - [gluon-cv](https://github.com/dmlc/gluon-cv)--GluonCV 提供了当前计算机视觉性能最优的深度学习模型 144 | - [imgaug](https://github.com/aleju/imgaug)--Image augmentation for machine learning experiments.数据增强库 145 | - [DPED](https://github.com/aiff22/DPED)--增强图片质量 146 | - [Deep Learning - All You Need to Know](https://github.com/osforscience/deep-learning-ocean)--深度学习资源,包含了论文、网络模型、教程、数据集、博客、框架等等 147 | 148 | #### 论文 149 | 150 | - [deep-learning-papers-translation](https://github.com/SnailTyan/deep-learning-papers-translation)--Github 深度学习论文翻译,包括分类论文,检测论文等 151 | - [deep-learning-papers](https://github.com/sbrugman/deep-learning-papers)--深度学习的论文,包括视觉、文本、音频,最新更新是2017年10月 152 | - [各种机器学习任务的顶级结果(论文)汇总](https://github.com/RedditSota/state-of-the-art-result-for-machine-learning-problems)--汇总多个任务,包括视觉、语音、NLP、强化学习等方向的最顶级结果的论文 153 | 154 | #### 人脸 155 | 156 | - [awesome-Face_Recognition](https://github.com/ChanChiChoi/awesome-Face_Recognition):近十年的人脸相关的所有论文合集 157 | - [face_recognition](https://github.com/ageitgey/face_recognition):人脸识别库,可以实现识别、检测、匹配等等功能。 158 | 159 | #### 160 | 161 | #### 计算机视觉 162 | 163 | - [Awesome Image Classification](https://github.com/weiaicunzai/awesome-image-classification)--图像分类方面的汇总,常用的网络模型的性能结果,代码实现以及论文。 164 | - [Awesome-Image-Inpainting](https://github.com/1900zyh/Awesome-Image-Inpainting)--图像修复方面的资料汇总 165 | 166 | ### 博客 167 | 168 | #### 国内 169 | 170 | 1. [机器学习--tornadomeet](http://www.cnblogs.com/tornadomeet/tag/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/default.html?page=1)--这是别人学习机器学习和深度学习做下笔记的博客,有好几十篇博文呢。 171 | 2. [zouxy09的专栏](http://blog.csdn.net/zouxy09)--这个博客不只有机器学习内容,还有一个深度学习的系列。 172 | 3. [Machine Learning](http://www.cnblogs.com/jerrylead/tag/Machine%20Learning/default.html?page=1)--也是有关机器学习的一个博客。 173 | 174 | 175 | 176 | #### 国外 177 | 178 | 179 | ##### 公司&组织 180 | 181 | 1. [OpenAI](https://blog.openai.com/)--OpenAI 182 | 2. [Distill](https://distill.pub/)--Distill 183 | 3. [Google AI Blog](https://ai.googleblog.com/)--谷歌AI的博客 184 | 4. [Notes on machine learning](https://peterroelants.github.io/) 185 | 5. [BAIR Blog](http://bair.berkeley.edu/blog/)--伯克利大学AI小组博客 186 | 6. [DeepMind Blog](https://deepmind.com/blog/?category=research)--DeepMind的博客 187 | 7. [FAIR Blog](https://research.fb.com/blog/)--Facebook AI博客 188 | 189 | ##### 个人 190 | 191 | 1. [SALu](https://shaoanlu.wordpress.com/)--有关于 GAN 方面的文章 192 | 2. [Colah’s Blog](http://colah.github.io/)--神经网络理解方面的入门,以及深度学习知识 193 | 3. [Ruder’s Blog](http://ruder.io/)--多任务学习、迁移学习 194 | 4. [inFERENCe](https://www.inference.vc/) 195 | 5. [Andrew Trask’s Blog](http://iamtrask.github.io/) 196 | 6. [Adit Deshpande’s Blog](https://adeshpande3.github.io/)--比较适合入门神经网络 197 | 7. [Graduate Descent](http://timvieira.github.io/blog/) 198 | 199 | 200 | 201 | 202 | 203 | ------ 204 | 205 | ## Python 参考学习资料 206 | 207 | 208 | ### 教程 209 | 210 | #### Jupyter 211 | 212 | - Jupyter Notebook 教程[[入门]](https://www.dataquest.io/blog/jupyter-notebook-tutorial/)[[进阶]](https://www.dataquest.io/blog/advanced-jupyter-notebooks-tutorial/) 213 | - [Awesome Jupyter](https://github.com/markusschanta/awesome-jupyter)--介绍了 Jupyter 相关的库、资源和教程,总共11个类别等 214 | 215 | #### 爬虫 216 | 217 | - [python模拟登陆一些大型网站,还有一些简单的爬虫](https://github.com/CriseLYJ/awesome-python-login-model) 218 | 219 | ------ 220 | 221 | ## 面试相关资料 222 | 223 | #### 综合 224 | 225 | - [Algorithm_Interview_Notes-Chinese](https://github.com/imhuay/Algorithm_Interview_Notes-Chinese)--2018/2019/校招/春招/秋招/算法/机器学习(Machine Learning)/深度学习(Deep Learning)/自然语言处理(NLP)/C/C++/Python/面试笔记 226 | 227 | #### 题目 228 | 229 | - [BAT面试1000题](https://zhuanlan.zhihu.com/c_140166199)--知乎专栏,面试题目 230 | - [machine-learning-interview-questions](https://github.com/Sroy20/machine-learning-interview-questions)--英文版面试题目,包括深度学习、机器学习和数学 231 | - [深度学习面试中文版](https://github.com/elviswf/DeepLearningBookQA_cn)--问题,以及给出在《深度学习》中答案所在的页码 232 | - [Python面试题](https://github.com/kenwoodjw/python_interview_question)--接近 300 道面试题,不少问题也给出了答案 233 | - [技术面试必备基础知识](https://github.com/CyC2018/CS-Notes)--包含算法、操作系统、数据库、网络、JAVA等面试题目 234 | 235 | #### 面经 236 | 237 | -------------------------------------------------------------------------------- /RecommendSystemStudy/.idea/RecommendSystemStudy.iml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 11 | -------------------------------------------------------------------------------- /RecommendSystemStudy/data_norm.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/11/26 8:15 下午 5 | @Author : luocai 6 | @file : data_norm.py 7 | @concat : 429546420@qq.com 8 | @site : 9 | @software: PyCharm Community Edition 10 | @desc : 11 | 12 | 数据标准化 13 | """ 14 | 15 | import math 16 | import numpy as np 17 | 18 | 19 | class DataNorm(object): 20 | 21 | def __init__(self): 22 | # sample 23 | self.arr = [i for i in range(1, 10)] 24 | # 最大值 25 | self.x_max = max(self.arr) 26 | # 最小值 27 | self.x_min = min(self.arr) 28 | # 平均值 29 | self.x_mean = sum(self.arr) / len(self.arr) 30 | # 标准差 31 | self.x_std = np.std(self.arr) 32 | 33 | # min-max 标准化 34 | def min_max(self): 35 | arr_ = list() 36 | for x in self.arr: 37 | # round(x, 4) 对 x 保留四位小数 38 | arr_.append(round((x - self.x_min) / (self.x_max - self.x_min), 4)) 39 | print(f'after min-max norm: {arr_}') 40 | 41 | # Z-score 标准化 42 | def z_score(self): 43 | arr_ = list() 44 | for x in self.arr: 45 | arr_.append(round((x - self.x_mean) / self.x_std, 4)) 46 | print(f'after z-score norm: {arr_}') 47 | 48 | # 小数定标标准化 49 | def decimal_scaling(self): 50 | arr_ = list() 51 | j = self.x_max // 10 if self.x_max % 10 == 0 else self.x_max // 10 + 1 52 | for x in self.arr: 53 | arr_.append(round(x / math.pow(10, j), 4)) 54 | print(f'after decimal_scaling norm: {arr_}') 55 | 56 | # 均值归一化 57 | def mean_norm(self): 58 | arr_ = list() 59 | for x in self.arr: 60 | arr_.append(round((x - self.x_mean) / (self.x_max - self.x_min), 4)) 61 | print(f'after mean norm: {arr_}') 62 | 63 | # 向量标准化 64 | def vector_norm(self): 65 | arr_ = list() 66 | for x in self.arr: 67 | arr_.append(round(x / sum(self.arr), 4)) 68 | print(f'after vector norm: {arr_}') 69 | 70 | # 指数转换法 71 | def exponential(self): 72 | arr_1 = list() 73 | for x in self.arr: 74 | arr_1.append(round(math.log10(x) / math.log10(self.x_max), 4)) 75 | print(f'after exponential(log10) norm: {arr_1}') 76 | 77 | arr_2 = list() 78 | sum_e = sum([math.exp(one) for one in self.arr]) 79 | for x in self.arr: 80 | arr_2.append(round(math.exp(x) / sum_e, 4)) 81 | print(f'after exponential(softmax) norm: {arr_2}') 82 | 83 | arr_3 = list() 84 | for x in self.arr: 85 | arr_3.append(round(1 / (1 + math.exp(-x)), 4)) 86 | print(f'after exponential(sigmoid) norm: {arr_3}') 87 | 88 | 89 | if __name__ == '__main__': 90 | dn = DataNorm() 91 | dn.min_max() 92 | dn.z_score() 93 | dn.decimal_scaling() 94 | dn.mean_norm() 95 | dn.vector_norm() 96 | dn.exponential() 97 | -------------------------------------------------------------------------------- /RecommendSystemStudy/netflix_movies_recommend_system.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2019/10/2 16:33 5 | @Author : luocai 6 | @file : netflix_movies_recommend_system.py 7 | @concat : 429546420@qq.com 8 | @site : 9 | @software: PyCharm Community Edition 10 | @desc : 11 | 12 | 《推荐系统开发实战》章2.1 实例1:搭建电影推荐系统 13 | """ 14 | import os 15 | import json 16 | import random 17 | import math 18 | from collections import defaultdict 19 | 20 | 21 | class FirstRec: 22 | """ 23 | 初始化函数 24 | file_path: 原始文件路径 25 | seed: 产生随机数的种子 26 | k: 选取的近邻用户个数 27 | n_items: 为每个用户推荐的电影数 28 | """ 29 | 30 | def __init__(self, file_path, seed, k, n_items): 31 | self.file_path = file_path 32 | self.users_1000 = self.__select_1000_users() 33 | self.seed = seed 34 | self.k = k 35 | self.n_items = n_items 36 | self.train, self.test = self.__load_and_split_data() 37 | 38 | # 获取所有用户并随机选择 1000 个 39 | def __select_1000_users(self): 40 | print("随机选择1000个用户!") 41 | if os.path.exists('netflix_data/train.json') and os.path.exists('netflix_data/test.json'): 42 | return list() 43 | else: 44 | users = set() 45 | # 获取所有用户 46 | for file in os.listdir(self.file_path): 47 | one_path = "{}/{}".format(self.file_path, file) 48 | print('{}'.format(one_path)) 49 | with open(one_path, 'r') as fp: 50 | for line in fp.readlines(): 51 | if line.strip().endswith(":"): 52 | continue 53 | userID, *_ = line.split(',') 54 | users.add(userID) 55 | # 随机选择 1000 个 56 | users_1000 = random.sample(list(users), 1000) 57 | print('random choose 1000 users: ', users_1000) 58 | return users_1000 59 | 60 | # 加载数据,并拆分为训练集和测试集 61 | def __load_and_split_data(self): 62 | train = dict() 63 | test = dict() 64 | if os.path.exists('netflix_data/train.json') and os.path.exists('netflix_data/test.json'): 65 | print("从文件中加载训练集和测试集") 66 | train = json.load(open('netflix_data/train.json')) 67 | test = json.load(open('netflix_data/test.json')) 68 | print('从文件中加载数据完成') 69 | else: 70 | # 设置产生随机数的种子,保证每次实验产生的随机结果一致 71 | random.seed(self.seed) 72 | for file in os.listdir(self.file_path): 73 | one_path = "{}/{}".format(self.file_path, file) 74 | print('{}'.format(one_path)) 75 | with open(one_path, 'r') as fp: 76 | movieID = fp.readline().split(':')[0] 77 | for line in fp.readlines(): 78 | if line.strip().endswith(":"): 79 | continue 80 | userID, rate, _ = line.split(',') 81 | # 判断用户是否在所选择的1000个用户中 82 | if userID in self.users_1000: 83 | if random.randint(1, 50) == 1: 84 | test.setdefault(userID, {})[movieID] = int(rate) 85 | else: 86 | train.setdefault(userID, {})[movieID] = int(rate) 87 | print("加载数据到 netflix_data/train.json 和 netflix_data/test.json") 88 | json.dump(train, open('netflix_data/train.json', 'w'), indent=4, separators=(',', ':')) 89 | json.dump(test, open('netflix_data/test.json', 'w'), indent=4, separators=(',', ':')) 90 | print("数据加载完成") 91 | return train, test 92 | 93 | ''' 94 | 计算皮尔逊相关系数 95 | rating1:用户1的评分记录,形式如{"movieid1":rate1,"movieid2":rate2,...} 96 | rating2:用户2的评分记录,形式如{"movieid1":rate1,"movieid2":rate2,...} 97 | ''' 98 | 99 | def pearson(self, rating1, rating2): 100 | sum_xy = 0 101 | sum_x = 0 102 | sum_y = 0 103 | sum_x2 = 0 104 | sum_y2 = 0 105 | num = 0 106 | for key in rating1.keys(): 107 | if key in rating2.keys(): 108 | num += 1 109 | x = rating1[key] 110 | y = rating2[key] 111 | sum_xy += x * y 112 | sum_x += x 113 | sum_y += y 114 | sum_x2 += math.pow(x, 2) 115 | sum_y2 += math.pow(y, 2) 116 | if num == 0: 117 | return 0 118 | # 皮尔逊相关系数分母 119 | denominator = math.sqrt(sum_x2 - math.pow(sum_x, 2) / num) * math.sqrt(sum_y2 - math.pow(sum_y, 2) / num) 120 | if denominator == 0: 121 | return 0 122 | else: 123 | return (sum_xy - (sum_x * sum_y) / num) / denominator 124 | 125 | ''' 126 | 用户 userID 进行电影推荐 127 | userID: 用户ID 128 | ''' 129 | 130 | def recommend(self, userID): 131 | neightborUser = dict() 132 | for user in self.train.keys(): 133 | if userID != user: 134 | distance = self.pearson(self.train[userID], self.train[user]) 135 | neightborUser[user] = distance 136 | # 字典排序 137 | newNU = sorted(neightborUser.items(), key=lambda k: k[1], reverse=True) 138 | 139 | movies = defaultdict(float) 140 | for (sim_user, sim) in newNU[:self.k]: 141 | for movieID in self.train[sim_user].keys(): 142 | # 推荐的电影的得分是用户相似度乘以用户的评分的求和 143 | try: 144 | movies[movieID] += sim * self.train[sim_user][movieID] 145 | except KeyError as ke: 146 | print('userID: {}, moviedID: {}, error: {}'.format(sim_user, movieID, ke)) 147 | raise 148 | # 再次排序 149 | new_movies = sorted(movies.items(), key=lambda k: k[1], reverse=True) 150 | return new_movies 151 | 152 | ''' 153 | 推荐系统效果评估函数 154 | num: 随机抽取 num 个用户计算准确率 155 | ''' 156 | 157 | def evaluate(self, num=30): 158 | print('开始计算准确率') 159 | precisions = list() 160 | random.seed(10) 161 | for userID in random.sample(self.test.keys(), num): 162 | hit = 0 163 | result = self.recommend(userID)[:self.n_items] 164 | for item, rate in result: 165 | if item in self.test[userID]: 166 | hit += 1 167 | precisions.append(hit / self.n_items) 168 | return sum(precisions) / len(precisions) 169 | 170 | 171 | if __name__ == '__main__': 172 | file_path = r"E:\recommend_systems_datas\data\netflix\training_set" 173 | seed = 30 174 | k = 15 175 | n_items = 20 176 | f_rec = FirstRec(file_path, seed, k, n_items) 177 | # 测试计算皮尔逊相关系数 178 | # r = f_rec.pearson(f_rec.train["2135038"], f_rec.train["2082397"]) 179 | # print("2135038 和 2082397 的皮尔逊相关系数为: {}".format(r)) 180 | # 为用户 2135038 推荐电影 181 | result = f_rec.recommend("2135038") 182 | print("为用户ID 为: 2135038 的用户推荐的电影为: ", result) 183 | print("算法的推荐准确率是: {}".format(f_rec.evaluate())) 184 | -------------------------------------------------------------------------------- /hands_on_ml_with_tf_and_sklearn/FeatureEngineering.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 特征工程\n", 8 | "\n", 9 | "## 数据预处理" 10 | ] 11 | }, 12 | { 13 | "cell_type": "markdown", 14 | "metadata": {}, 15 | "source": [ 16 | "#### 引入模块和数据" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 9, 22 | "metadata": { 23 | "collapsed": false 24 | }, 25 | "outputs": [ 26 | { 27 | "name": "stdout", 28 | "output_type": "stream", 29 | "text": [ 30 | "初始化数据=\n", 31 | " [[ 3. -1.2 2. ]\n", 32 | " [ 0. 5. 0.3]\n", 33 | " [ 1. 2.1 -2.1]]\n", 34 | "数据大小: (3, 3)\n" 35 | ] 36 | } 37 | ], 38 | "source": [ 39 | "import numpy as np\n", 40 | "from sklearn import preprocessing\n", 41 | "\n", 42 | "# 初始数据\n", 43 | "data = np.array([[3, -1.2, 2],\n", 44 | " [0, 5, 0.3],\n", 45 | " [1, 2.1, -2.1]])\n", 46 | "print('初始化数据=\\n', data)\n", 47 | "print('数据大小:',data.shape)" 48 | ] 49 | }, 50 | { 51 | "cell_type": "markdown", 52 | "metadata": {}, 53 | "source": [ 54 | "### 特征缩放" 55 | ] 56 | }, 57 | { 58 | "cell_type": "markdown", 59 | "metadata": {}, 60 | "source": [ 61 | "#### 归一化处理\n", 62 | "\n", 63 | "数据标准化主要功能就是消除变量间的量纲关系,从而使数据具有可比性。" 64 | ] 65 | }, 66 | { 67 | "cell_type": "markdown", 68 | "metadata": {}, 69 | "source": [ 70 | "##### 线性函数归一化\n", 71 | "\n", 72 | "它对原始数据进行线性变换,使得结果映射到[0,1]的范围,实现对原始数据的等比缩放。" 73 | ] 74 | }, 75 | { 76 | "cell_type": "code", 77 | "execution_count": 6, 78 | "metadata": { 79 | "collapsed": false 80 | }, 81 | "outputs": [ 82 | { 83 | "name": "stdout", 84 | "output_type": "stream", 85 | "text": [ 86 | "原始:\n", 87 | " [[ 3. -1.2 2. ]\n", 88 | " [ 0. 5. 0.3]\n", 89 | " [ 1. 2.1 -2.1]]\n", 90 | "\n", 91 | "经过范围缩放:\n", 92 | " [[ 1. 0. 1. ]\n", 93 | " [ 0. 1. 0.58536585]\n", 94 | " [ 0.33333333 0.53225806 0. ]]\n" 95 | ] 96 | } 97 | ], 98 | "source": [ 99 | "data_scaler=preprocessing.MinMaxScaler(feature_range=(0,1))\n", 100 | "data_scaled=data_scaler.fit_transform(data)\n", 101 | "print (\"原始:\\n\",data)\n", 102 | "print(\"\\n经过范围缩放:\\n\",data_scaled)" 103 | ] 104 | }, 105 | { 106 | "cell_type": "markdown", 107 | "metadata": {}, 108 | "source": [ 109 | "##### 零均值归一化\n", 110 | "\n", 111 | "它会将原始数据映射到均值为 0,标准差为 1 的分布上" 112 | ] 113 | }, 114 | { 115 | "cell_type": "code", 116 | "execution_count": 2, 117 | "metadata": { 118 | "collapsed": false 119 | }, 120 | "outputs": [ 121 | { 122 | "name": "stdout", 123 | "output_type": "stream", 124 | "text": [ 125 | "原始数据\n", 126 | " [[ 3. -1.2 2. ]\n", 127 | " [ 0. 5. 0.3]\n", 128 | " [ 1. 2.1 -2.1]]\n", 129 | "经过标准化处理的数据\n", 130 | " [[ 1.33630621 -1.25021647 1.14947305]\n", 131 | " [-1.06904497 1.19757578 0.13872951]\n", 132 | " [-0.26726124 0.05264069 -1.28820256]]\n" 133 | ] 134 | } 135 | ], 136 | "source": [ 137 | "data_standardized=preprocessing.scale(data)\n", 138 | "print(\"原始数据\\n\", data)\n", 139 | "print(\"经过标准化处理的数据\\n\", data_standardized)" 140 | ] 141 | }, 142 | { 143 | "cell_type": "code", 144 | "execution_count": 3, 145 | "metadata": { 146 | "collapsed": false 147 | }, 148 | "outputs": [ 149 | { 150 | "name": "stdout", 151 | "output_type": "stream", 152 | "text": [ 153 | "原始均值= [ 1.33333333 1.96666667 0.06666667]\n", 154 | "标准化后均值= [ 5.55111512e-17 -3.70074342e-17 0.00000000e+00]\n" 155 | ] 156 | } 157 | ], 158 | "source": [ 159 | "print('原始均值=',data.mean(axis=0))\n", 160 | "print('标准化后均值=',data_standardized.mean(axis=0))" 161 | ] 162 | }, 163 | { 164 | "cell_type": "code", 165 | "execution_count": 5, 166 | "metadata": { 167 | "collapsed": false 168 | }, 169 | "outputs": [ 170 | { 171 | "name": "stdout", 172 | "output_type": "stream", 173 | "text": [ 174 | "原始方差= [ 1.24721913 2.5328947 1.68193011]\n", 175 | "标准化后方差= [ 1. 1. 1.]\n" 176 | ] 177 | } 178 | ], 179 | "source": [ 180 | "print('原始方差=', data.std(axis=0))\n", 181 | "print('标准化后方差=', data_standardized.std(axis=0))" 182 | ] 183 | }, 184 | { 185 | "cell_type": "markdown", 186 | "metadata": {}, 187 | "source": [ 188 | "#### 正则化\n", 189 | "\n", 190 | "正则化是将样本或者特征的某个范数(如 L1、L2 范数)缩放到单位 1。" 191 | ] 192 | }, 193 | { 194 | "cell_type": "code", 195 | "execution_count": 10, 196 | "metadata": { 197 | "collapsed": false 198 | }, 199 | "outputs": [ 200 | { 201 | "name": "stdout", 202 | "output_type": "stream", 203 | "text": [ 204 | "原始:\n", 205 | " [[ 3. -1.2 2. ]\n", 206 | " [ 0. 5. 0.3]\n", 207 | " [ 1. 2.1 -2.1]]\n", 208 | "L1正则化后:\n", 209 | " [[ 0.48387097 -0.19354839 0.32258065]\n", 210 | " [ 0. 0.94339623 0.05660377]\n", 211 | " [ 0.19230769 0.40384615 -0.40384615]]\n" 212 | ] 213 | } 214 | ], 215 | "source": [ 216 | "data_normalized_l1=preprocessing.normalize(data,norm='l1')\n", 217 | "print(\"原始:\\n\",data)\n", 218 | "print(\"L1正则化后:\\n\",data_normalized_l1)" 219 | ] 220 | }, 221 | { 222 | "cell_type": "code", 223 | "execution_count": 11, 224 | "metadata": { 225 | "collapsed": false 226 | }, 227 | "outputs": [ 228 | { 229 | "name": "stdout", 230 | "output_type": "stream", 231 | "text": [ 232 | "原始:\n", 233 | " [[ 3. -1.2 2. ]\n", 234 | " [ 0. 5. 0.3]\n", 235 | " [ 1. 2.1 -2.1]]\n", 236 | "L1正则化后:\n", 237 | " [[ 0.78947368 -0.31578947 0.52631579]\n", 238 | " [ 0. 0.99820485 0.05989229]\n", 239 | " [ 0.31911282 0.67013693 -0.67013693]]\n" 240 | ] 241 | } 242 | ], 243 | "source": [ 244 | "data_normalized_l2=preprocessing.normalize(data,norm='l2')\n", 245 | "print(\"原始:\\n\",data)\n", 246 | "print(\"L1正则化后:\\n\",data_normalized_l2)" 247 | ] 248 | }, 249 | { 250 | "cell_type": "markdown", 251 | "metadata": {}, 252 | "source": [ 253 | "### 特征编码" 254 | ] 255 | }, 256 | { 257 | "cell_type": "markdown", 258 | "metadata": {}, 259 | "source": [ 260 | "#### 序号编码\n", 261 | "\n", 262 | "序号编码一般用于处理类别间具有大小关系的数据。" 263 | ] 264 | }, 265 | { 266 | "cell_type": "code", 267 | "execution_count": 13, 268 | "metadata": { 269 | "collapsed": true 270 | }, 271 | "outputs": [], 272 | "source": [ 273 | "#(1).创建标记编码器\n", 274 | "label_encoder=preprocessing.LabelEncoder()" 275 | ] 276 | }, 277 | { 278 | "cell_type": "code", 279 | "execution_count": 24, 280 | "metadata": { 281 | "collapsed": false 282 | }, 283 | "outputs": [ 284 | { 285 | "name": "stdout", 286 | "output_type": "stream", 287 | "text": [ 288 | " grade--->0\n", 289 | " health--->1\n", 290 | " high--->2\n", 291 | " id--->3\n", 292 | " name--->4\n", 293 | " weight--->5\n" 294 | ] 295 | } 296 | ], 297 | "source": [ 298 | "#(2) 用数据训练编码器\n", 299 | "category_data=['name','id','health','weight','high','grade']\n", 300 | "label_encoder.fit(category_data)\n", 301 | "# 创建一个类别映射表\n", 302 | "for i,item in enumerate(label_encoder.classes_):\n", 303 | " print(\"%7s--->%d\"%(item,i))" 304 | ] 305 | }, 306 | { 307 | "cell_type": "code", 308 | "execution_count": 25, 309 | "metadata": { 310 | "collapsed": false 311 | }, 312 | "outputs": [ 313 | { 314 | "name": "stdout", 315 | "output_type": "stream", 316 | "text": [ 317 | "例子1:\n", 318 | "labels = ['name', 'grade']\n", 319 | "encoded labels = [4 0]\n" 320 | ] 321 | } 322 | ], 323 | "source": [ 324 | "labels=['name','grade']\n", 325 | "encoded_labels=label_encoder.transform(labels)\n", 326 | "print('例子1:')\n", 327 | "print(\"labels = \",labels)\n", 328 | "print(\"encoded labels = \",encoded_labels)" 329 | ] 330 | }, 331 | { 332 | "cell_type": "code", 333 | "execution_count": 26, 334 | "metadata": { 335 | "collapsed": false 336 | }, 337 | "outputs": [ 338 | { 339 | "name": "stdout", 340 | "output_type": "stream", 341 | "text": [ 342 | "例子2:\n", 343 | "labels ['health' 'high' 'weight' 'id']\n", 344 | "encoded labels [1, 2, 5, 3]\n" 345 | ] 346 | } 347 | ], 348 | "source": [ 349 | "encoded_labels=[1,2,5,3]\n", 350 | "labels=label_encoder.inverse_transform(encoded_labels)\n", 351 | "print('例子2:')\n", 352 | "print(\"labels\",labels)\n", 353 | "print(\"encoded labels\",encoded_labels)" 354 | ] 355 | }, 356 | { 357 | "cell_type": "markdown", 358 | "metadata": {}, 359 | "source": [ 360 | "#### 独热编码\n", 361 | "\n", 362 | "独热编码是采用 N 位状态位来对 N 个可能的取值进行编码。" 363 | ] 364 | }, 365 | { 366 | "cell_type": "code", 367 | "execution_count": 27, 368 | "metadata": { 369 | "collapsed": false 370 | }, 371 | "outputs": [ 372 | { 373 | "name": "stdout", 374 | "output_type": "stream", 375 | "text": [ 376 | "\n", 377 | "encoded_vector =\n", 378 | " (0, 9)\t1.0\n", 379 | " (0, 8)\t1.0\n", 380 | " (0, 4)\t1.0\n", 381 | " (0, 2)\t1.0\n", 382 | "encoded_vector = [[ 0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]\n" 383 | ] 384 | } 385 | ], 386 | "source": [ 387 | "encoder=preprocessing.OneHotEncoder()\n", 388 | "encoder.fit([[0,2,1,12],[1,3,5,3],[2,3,2,12],[1,2,4,3]])\n", 389 | "encoded_vector=encoder.transform([[2,3,5,3]]) #注意是[[ ]]\n", 390 | "print(type(encoded_vector))\n", 391 | "print (\"encoded_vector =\\n \",encoded_vector)\n", 392 | "print (\"encoded_vector = \",encoded_vector.toarray())" 393 | ] 394 | }, 395 | { 396 | "cell_type": "markdown", 397 | "metadata": {}, 398 | "source": [ 399 | "#### 二值化\n", 400 | "\n", 401 | "将数值型转换为布尔类型" 402 | ] 403 | }, 404 | { 405 | "cell_type": "code", 406 | "execution_count": 28, 407 | "metadata": { 408 | "collapsed": false 409 | }, 410 | "outputs": [ 411 | { 412 | "name": "stdout", 413 | "output_type": "stream", 414 | "text": [ 415 | "原始:\n", 416 | " [[ 3. -1.2 2. ]\n", 417 | " [ 0. 5. 0.3]\n", 418 | " [ 1. 2.1 -2.1]]\n", 419 | "二值化:\n", 420 | " [[ 1. 0. 1.]\n", 421 | " [ 0. 1. 0.]\n", 422 | " [ 0. 1. 0.]]\n" 423 | ] 424 | } 425 | ], 426 | "source": [ 427 | "# 小于等于1.4的为0,其余为1\n", 428 | "data = np.array([[3, -1.2, 2],\n", 429 | " [0, 5, 0.3],\n", 430 | " [1, 2.1, -2.1]])\n", 431 | "data_binarized=preprocessing.Binarizer(threshold=1.4).transform(data)\n", 432 | "print(\"原始:\\n\",data)\n", 433 | "print(\"二值化:\\n\",data_binarized)" 434 | ] 435 | }, 436 | { 437 | "cell_type": "code", 438 | "execution_count": null, 439 | "metadata": { 440 | "collapsed": true 441 | }, 442 | "outputs": [], 443 | "source": [ 444 | "" 445 | ] 446 | }, 447 | { 448 | "cell_type": "code", 449 | "execution_count": null, 450 | "metadata": { 451 | "collapsed": true 452 | }, 453 | "outputs": [], 454 | "source": [ 455 | "" 456 | ] 457 | }, 458 | { 459 | "cell_type": "code", 460 | "execution_count": null, 461 | "metadata": { 462 | "collapsed": true 463 | }, 464 | "outputs": [], 465 | "source": [ 466 | "" 467 | ] 468 | }, 469 | { 470 | "cell_type": "code", 471 | "execution_count": null, 472 | "metadata": { 473 | "collapsed": true 474 | }, 475 | "outputs": [], 476 | "source": [ 477 | "" 478 | ] 479 | }, 480 | { 481 | "cell_type": "code", 482 | "execution_count": null, 483 | "metadata": { 484 | "collapsed": true 485 | }, 486 | "outputs": [], 487 | "source": [ 488 | "" 489 | ] 490 | }, 491 | { 492 | "cell_type": "code", 493 | "execution_count": null, 494 | "metadata": { 495 | "collapsed": true 496 | }, 497 | "outputs": [], 498 | "source": [ 499 | "" 500 | ] 501 | }, 502 | { 503 | "cell_type": "code", 504 | "execution_count": null, 505 | "metadata": { 506 | "collapsed": true 507 | }, 508 | "outputs": [], 509 | "source": [ 510 | "" 511 | ] 512 | }, 513 | { 514 | "cell_type": "code", 515 | "execution_count": null, 516 | "metadata": { 517 | "collapsed": true 518 | }, 519 | "outputs": [], 520 | "source": [ 521 | "" 522 | ] 523 | }, 524 | { 525 | "cell_type": "code", 526 | "execution_count": null, 527 | "metadata": { 528 | "collapsed": true 529 | }, 530 | "outputs": [], 531 | "source": [ 532 | "" 533 | ] 534 | } 535 | ], 536 | "metadata": { 537 | "anaconda-cloud": {}, 538 | "kernelspec": { 539 | "display_name": "Python [conda env:Anaconda3]", 540 | "language": "python", 541 | "name": "conda-env-Anaconda3-py" 542 | }, 543 | "language_info": { 544 | "codemirror_mode": { 545 | "name": "ipython", 546 | "version": 3.0 547 | }, 548 | "file_extension": ".py", 549 | "mimetype": "text/x-python", 550 | "name": "python", 551 | "nbconvert_exporter": "python", 552 | "pygments_lexer": "ipython3", 553 | "version": "3.5.2" 554 | } 555 | }, 556 | "nbformat": 4, 557 | "nbformat_minor": 0 558 | } -------------------------------------------------------------------------------- /opencv_notes/Skewed-text-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/opencv_notes/Skewed-text-image.png -------------------------------------------------------------------------------- /opencv_notes/car.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/opencv_notes/car.jpg -------------------------------------------------------------------------------- /opencv_notes/circle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/opencv_notes/circle.png -------------------------------------------------------------------------------- /opencv_notes/example.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/opencv_notes/example.jpg -------------------------------------------------------------------------------- /opencv_notes/opencv_bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/opencv_notes/opencv_bg.png -------------------------------------------------------------------------------- /opencv_notes/opencv_contour_example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/opencv_notes/opencv_contour_example.png -------------------------------------------------------------------------------- /opencv_notes/pycolor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/opencv_notes/pycolor.png -------------------------------------------------------------------------------- /opencv_notes/pytext.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ccc013/CodesNotes/5dd32c97b095fbc98556a563466a17c68b08231b/opencv_notes/pytext.png -------------------------------------------------------------------------------- /python_tricks_example.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "### 测试python的一些技巧" 8 | ] 9 | }, 10 | { 11 | "cell_type": "markdown", 12 | "metadata": {}, 13 | "source": [ 14 | "#### list " 15 | ] 16 | }, 17 | { 18 | "cell_type": "markdown", 19 | "metadata": {}, 20 | "source": [ 21 | "###### 修改插入操作" 22 | ] 23 | }, 24 | { 25 | "cell_type": "code", 26 | "execution_count": 4, 27 | "metadata": {}, 28 | "outputs": [ 29 | { 30 | "name": "stdout", 31 | "output_type": "stream", 32 | "text": [ 33 | "[0, 10, 2, 3, 4, 5, 6, 7, 8, 9]\n" 34 | ] 35 | } 36 | ], 37 | "source": [ 38 | "# 修改一个元素\n", 39 | "elems = list(range(10))\n", 40 | "elems[1] = 10\n", 41 | "print(elems)" 42 | ] 43 | }, 44 | { 45 | "cell_type": "code", 46 | "execution_count": 2, 47 | "metadata": {}, 48 | "outputs": [ 49 | { 50 | "name": "stdout", 51 | "output_type": "stream", 52 | "text": [ 53 | "[0, 20, 30, 40, 2, 3, 4, 5, 6, 7, 8, 9]\n" 54 | ] 55 | } 56 | ], 57 | "source": [ 58 | "# 用多个数值替换一个元素\n", 59 | "elems = list(range(10))\n", 60 | "elems[1:2] = [20, 30, 40]\n", 61 | "print(elems)\n", 62 | "\n", 63 | "# ==> [0, 20, 30, 40, 2, 3, 4, 5, 6, 7, 8, 9]" 64 | ] 65 | }, 66 | { 67 | "cell_type": "code", 68 | "execution_count": 3, 69 | "metadata": {}, 70 | "outputs": [ 71 | { 72 | "name": "stdout", 73 | "output_type": "stream", 74 | "text": [ 75 | "[0, 0.2, 0.3, 0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9]\n" 76 | ] 77 | } 78 | ], 79 | "source": [ 80 | "elems = list(range(10))\n", 81 | "elems[1:1] = [0.2, 0.3, 0.5]\n", 82 | "print(elems)" 83 | ] 84 | }, 85 | { 86 | "cell_type": "markdown", 87 | "metadata": {}, 88 | "source": [ 89 | "##### flatten" 90 | ] 91 | }, 92 | { 93 | "cell_type": "code", 94 | "execution_count": 5, 95 | "metadata": {}, 96 | "outputs": [ 97 | { 98 | "data": { 99 | "text/plain": [ 100 | "[1, 2, 3, 4, 5, 6]" 101 | ] 102 | }, 103 | "execution_count": 5, 104 | "metadata": {}, 105 | "output_type": "execute_result" 106 | } 107 | ], 108 | "source": [ 109 | "# sum 方法\n", 110 | "list_of_lists = [[1], [2, 3], [4, 5, 6]]\n", 111 | "sum(list_of_lists, [])" 112 | ] 113 | }, 114 | { 115 | "cell_type": "markdown", 116 | "metadata": {}, 117 | "source": [ 118 | "##### list vs generator" 119 | ] 120 | }, 121 | { 122 | "cell_type": "code", 123 | "execution_count": 6, 124 | "metadata": {}, 125 | "outputs": [ 126 | { 127 | "name": "stdout", 128 | "output_type": "stream", 129 | "text": [ 130 | "[['i', 'want', 'to'], ['want', 'to', 'go'], ['to', 'go', 'to'], ['go', 'to', 'school']]\n" 131 | ] 132 | } 133 | ], 134 | "source": [ 135 | "tokens = ['i', 'want', 'to', 'go', 'to', 'school']\n", 136 | "\n", 137 | "def ngrams(tokens, n):\n", 138 | " length = len(tokens)\n", 139 | " grams = []\n", 140 | " for i in range(length - n + 1):\n", 141 | " grams.append(tokens[i:i+n])\n", 142 | " return grams\n", 143 | "\n", 144 | "print(ngrams(tokens, 3))" 145 | ] 146 | }, 147 | { 148 | "cell_type": "code", 149 | "execution_count": 7, 150 | "metadata": {}, 151 | "outputs": [ 152 | { 153 | "name": "stdout", 154 | "output_type": "stream", 155 | "text": [ 156 | "\n", 157 | "['i', 'want', 'to']\n", 158 | "['want', 'to', 'go']\n", 159 | "['to', 'go', 'to']\n", 160 | "['go', 'to', 'school']\n" 161 | ] 162 | } 163 | ], 164 | "source": [ 165 | "# user generator\n", 166 | "def ngrams(tokens, n):\n", 167 | " length = len(tokens)\n", 168 | " for i in range(length - n + 1):\n", 169 | " yield tokens[i:i+n]\n", 170 | "\n", 171 | "ngrams_generator = ngrams(tokens, 3)\n", 172 | "print(ngrams_generator)\n", 173 | "\n", 174 | "for ngram in ngrams_generator:\n", 175 | " print(ngram)\n" 176 | ] 177 | }, 178 | { 179 | "cell_type": "markdown", 180 | "metadata": {}, 181 | "source": [ 182 | "### 记录函数运行时间" 183 | ] 184 | }, 185 | { 186 | "cell_type": "code", 187 | "execution_count": 18, 188 | "metadata": {}, 189 | "outputs": [], 190 | "source": [ 191 | "import time\n", 192 | "from functools import wraps\n", 193 | "\n", 194 | "\n", 195 | "def timing(f):\n", 196 | " \"\"\"Decorator for timing functions\n", 197 | " Usage:\n", 198 | " @timing\n", 199 | " def function(a):\n", 200 | " pass\n", 201 | " \"\"\"\n", 202 | "\n", 203 | " @wraps(f)\n", 204 | " def wrapper(*args, **kwargs):\n", 205 | " start = time.time()\n", 206 | " result = f(*args, **kwargs)\n", 207 | " end = time.time()\n", 208 | " print('function:%r took: %2.4f sec' % (f.__name__, end - start))\n", 209 | " return result\n", 210 | " return wrapper" 211 | ] 212 | }, 213 | { 214 | "cell_type": "code", 215 | "execution_count": 23, 216 | "metadata": {}, 217 | "outputs": [], 218 | "source": [ 219 | "from time import sleep\n", 220 | "@timing\n", 221 | "def count_nums():\n", 222 | " sleep(1)" 223 | ] 224 | }, 225 | { 226 | "cell_type": "code", 227 | "execution_count": 24, 228 | "metadata": {}, 229 | "outputs": [ 230 | { 231 | "name": "stdout", 232 | "output_type": "stream", 233 | "text": [ 234 | "function:'count_nums' took: 1.0036 sec\n" 235 | ] 236 | } 237 | ], 238 | "source": [ 239 | "count_nums()" 240 | ] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "execution_count": null, 245 | "metadata": {}, 246 | "outputs": [], 247 | "source": [] 248 | } 249 | ], 250 | "metadata": { 251 | "kernelspec": { 252 | "display_name": "Python 3", 253 | "language": "python", 254 | "name": "python3" 255 | }, 256 | "language_info": { 257 | "codemirror_mode": { 258 | "name": "ipython", 259 | "version": 3 260 | }, 261 | "file_extension": ".py", 262 | "mimetype": "text/x-python", 263 | "name": "python", 264 | "nbconvert_exporter": "python", 265 | "pygments_lexer": "ipython3", 266 | "version": "3.7.4" 267 | } 268 | }, 269 | "nbformat": 4, 270 | "nbformat_minor": 4 271 | } 272 | -------------------------------------------------------------------------------- /tools/RandomNums.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | @Time : 2020/9/22 9:56 上午 5 | @Author : luocai 6 | @file : RandomNums.py 7 | @concat : 429546420@qq.com 8 | @site : 9 | @software: PyCharm Community Edition 10 | @desc : 11 | 12 | 随机数生成器,输入随机抽取的数量范围 N,返回序号(1-N) 13 | """ 14 | import random 15 | 16 | 17 | def random_choose_num(n): 18 | ''' 19 | 输入数量范围 n, 返回随机选择的序号 20 | :param n: 大于 0的整数 21 | :return: 22 | ''' 23 | return random.randint(1, n) 24 | 25 | 26 | def main(): 27 | while True: 28 | try: 29 | n = input('请输入随机抽取的总数:(输入q退出)') 30 | if n == 'q': 31 | print('随机抽取结束') 32 | exit() 33 | n = int(n) 34 | res = random_choose_num(n) 35 | print(f"随机选择的序号为: {res}") 36 | except Exception as err: 37 | print('请输入一个整数') 38 | 39 | 40 | if __name__ == '__main__': 41 | main() 42 | --------------------------------------------------------------------------------