├── .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 |
10 |
11 |
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 | " name | \n",
53 | " age | \n",
54 | " score | \n",
55 | " rebounds | \n",
56 | " assist | \n",
57 | " steals | \n",
58 | " block | \n",
59 | "
\n",
60 | " \n",
61 | " \n",
62 | " \n",
63 | " 0 | \n",
64 | " kk | \n",
65 | " 23 | \n",
66 | " 32.1 | \n",
67 | " 5.1 | \n",
68 | " 3.4 | \n",
69 | " 1.2 | \n",
70 | " 0.9 | \n",
71 | "
\n",
72 | " \n",
73 | " 1 | \n",
74 | " sc | \n",
75 | " 24 | \n",
76 | " 30.1 | \n",
77 | " 5.5 | \n",
78 | " 7.1 | \n",
79 | " 1.8 | \n",
80 | " 0.5 | \n",
81 | "
\n",
82 | " \n",
83 | " 2 | \n",
84 | " ta | \n",
85 | " 25 | \n",
86 | " 27.2 | \n",
87 | " 3.3 | \n",
88 | " 2.1 | \n",
89 | " 0.9 | \n",
90 | " 1.0 | \n",
91 | "
\n",
92 | " \n",
93 | " 3 | \n",
94 | " js | \n",
95 | " 26 | \n",
96 | " 27.8 | \n",
97 | " 8.9 | \n",
98 | " 10.1 | \n",
99 | " 1.4 | \n",
100 | " 1.2 | \n",
101 | "
\n",
102 | " \n",
103 | " 4 | \n",
104 | " jn | \n",
105 | " 27 | \n",
106 | " 33.0 | \n",
107 | " 4.2 | \n",
108 | " 12.3 | \n",
109 | " 1.1 | \n",
110 | " 0.9 | \n",
111 | "
\n",
112 | " \n",
113 | " 5 | \n",
114 | " iw | \n",
115 | " 28 | \n",
116 | " 25.1 | \n",
117 | " 4.2 | \n",
118 | " 5.1 | \n",
119 | " 1.2 | \n",
120 | " 0.3 | \n",
121 | "
\n",
122 | " \n",
123 | " 6 | \n",
124 | " dcc | \n",
125 | " 29 | \n",
126 | " 22.0 | \n",
127 | " 5.5 | \n",
128 | " 8.1 | \n",
129 | " 1.3 | \n",
130 | " 0.8 | \n",
131 | "
\n",
132 | " \n",
133 | "
\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 | " name | \n",
185 | " age | \n",
186 | " score | \n",
187 | " rebounds | \n",
188 | " assist | \n",
189 | " steals | \n",
190 | " block | \n",
191 | "
\n",
192 | " \n",
193 | " \n",
194 | " \n",
195 | " 0 | \n",
196 | " kk | \n",
197 | " 23 | \n",
198 | " 32.1 | \n",
199 | " 5.1 | \n",
200 | " 3.4 | \n",
201 | " 1.2 | \n",
202 | " 0.9 | \n",
203 | "
\n",
204 | " \n",
205 | " 1 | \n",
206 | " sc | \n",
207 | " 24 | \n",
208 | " 30.1 | \n",
209 | " 5.5 | \n",
210 | " 7.1 | \n",
211 | " 1.8 | \n",
212 | " 0.5 | \n",
213 | "
\n",
214 | " \n",
215 | " 2 | \n",
216 | " ta | \n",
217 | " 25 | \n",
218 | " 27.2 | \n",
219 | " 3.3 | \n",
220 | " 2.1 | \n",
221 | " 0.9 | \n",
222 | " 1.0 | \n",
223 | "
\n",
224 | " \n",
225 | " 3 | \n",
226 | " js | \n",
227 | " 26 | \n",
228 | " 27.8 | \n",
229 | " 8.9 | \n",
230 | " 10.1 | \n",
231 | " 1.4 | \n",
232 | " 1.2 | \n",
233 | "
\n",
234 | " \n",
235 | " 4 | \n",
236 | " jn | \n",
237 | " 27 | \n",
238 | " 33.0 | \n",
239 | " 4.2 | \n",
240 | " 12.3 | \n",
241 | " 1.1 | \n",
242 | " 0.9 | \n",
243 | "
\n",
244 | " \n",
245 | "
\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 | " age | \n",
319 | " score | \n",
320 | " rebounds | \n",
321 | " assist | \n",
322 | " steals | \n",
323 | " block | \n",
324 | "
\n",
325 | " \n",
326 | " \n",
327 | " \n",
328 | " 0 | \n",
329 | " 23 | \n",
330 | " 32.1 | \n",
331 | " 5.1 | \n",
332 | " 3.4 | \n",
333 | " 1.2 | \n",
334 | " 0.9 | \n",
335 | "
\n",
336 | " \n",
337 | " 1 | \n",
338 | " 24 | \n",
339 | " 30.1 | \n",
340 | " 5.5 | \n",
341 | " 7.1 | \n",
342 | " 1.8 | \n",
343 | " 0.5 | \n",
344 | "
\n",
345 | " \n",
346 | " 2 | \n",
347 | " 25 | \n",
348 | " 27.2 | \n",
349 | " 3.3 | \n",
350 | " 2.1 | \n",
351 | " 0.9 | \n",
352 | " 1.0 | \n",
353 | "
\n",
354 | " \n",
355 | " 3 | \n",
356 | " 26 | \n",
357 | " 27.8 | \n",
358 | " 8.9 | \n",
359 | " 10.1 | \n",
360 | " 1.4 | \n",
361 | " 1.2 | \n",
362 | "
\n",
363 | " \n",
364 | " 4 | \n",
365 | " 27 | \n",
366 | " 33.0 | \n",
367 | " 4.2 | \n",
368 | " 12.3 | \n",
369 | " 1.1 | \n",
370 | " 0.9 | \n",
371 | "
\n",
372 | " \n",
373 | " 5 | \n",
374 | " 28 | \n",
375 | " 25.1 | \n",
376 | " 4.2 | \n",
377 | " 5.1 | \n",
378 | " 1.2 | \n",
379 | " 0.3 | \n",
380 | "
\n",
381 | " \n",
382 | " 6 | \n",
383 | " 29 | \n",
384 | " 22.0 | \n",
385 | " 5.5 | \n",
386 | " 8.1 | \n",
387 | " 1.3 | \n",
388 | " 0.8 | \n",
389 | "
\n",
390 | " \n",
391 | "
\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 | " account | \n",
452 | " jan | \n",
453 | " feb | \n",
454 | " mar | \n",
455 | "
\n",
456 | " \n",
457 | " \n",
458 | " \n",
459 | " 0 | \n",
460 | " Jones | \n",
461 | " 150 | \n",
462 | " 200 | \n",
463 | " 140 | \n",
464 | "
\n",
465 | " \n",
466 | " 1 | \n",
467 | " Alpha | \n",
468 | " 200 | \n",
469 | " 210 | \n",
470 | " 215 | \n",
471 | "
\n",
472 | " \n",
473 | " 2 | \n",
474 | " Blue | \n",
475 | " 50 | \n",
476 | " 90 | \n",
477 | " 95 | \n",
478 | "
\n",
479 | " \n",
480 | "
\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 | " account | \n",
531 | " jan | \n",
532 | " feb | \n",
533 | " mar | \n",
534 | "
\n",
535 | " \n",
536 | " \n",
537 | " \n",
538 | " 0 | \n",
539 | " Jones | \n",
540 | " 150 | \n",
541 | " 200 | \n",
542 | " 140 | \n",
543 | "
\n",
544 | " \n",
545 | " 1 | \n",
546 | " Alpha | \n",
547 | " 200 | \n",
548 | " 210 | \n",
549 | " 215 | \n",
550 | "
\n",
551 | " \n",
552 | " 2 | \n",
553 | " Blue | \n",
554 | " 50 | \n",
555 | " 90 | \n",
556 | " 95 | \n",
557 | "
\n",
558 | " \n",
559 | "
\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 | " account | \n",
611 | " jan | \n",
612 | " feb | \n",
613 | " mar | \n",
614 | "
\n",
615 | " \n",
616 | " \n",
617 | " \n",
618 | " 0 | \n",
619 | " Jones | \n",
620 | " 150 | \n",
621 | " 200 | \n",
622 | " 140 | \n",
623 | "
\n",
624 | " \n",
625 | " 1 | \n",
626 | " Alpha | \n",
627 | " 200 | \n",
628 | " 210 | \n",
629 | " 215 | \n",
630 | "
\n",
631 | " \n",
632 | " 2 | \n",
633 | " Blue | \n",
634 | " 50 | \n",
635 | " 90 | \n",
636 | " 95 | \n",
637 | "
\n",
638 | " \n",
639 | "
\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 | " Jones | \n",
699 | " jan | \n",
700 | " feb | \n",
701 | " mar | \n",
702 | "
\n",
703 | " \n",
704 | " \n",
705 | " \n",
706 | " 0 | \n",
707 | " Jones | \n",
708 | " 150 | \n",
709 | " 200 | \n",
710 | " 140 | \n",
711 | "
\n",
712 | " \n",
713 | " 1 | \n",
714 | " Alpha | \n",
715 | " 200 | \n",
716 | " 210 | \n",
717 | " 215 | \n",
718 | "
\n",
719 | " \n",
720 | " 2 | \n",
721 | " Blue | \n",
722 | " 50 | \n",
723 | " 90 | \n",
724 | " 95 | \n",
725 | "
\n",
726 | " \n",
727 | "
\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 |
10 |
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 |
--------------------------------------------------------------------------------