├── .github └── FUNDING.yml ├── LICENSE ├── README.md ├── _config.yml ├── big_bang.html ├── big_bang_theory.html ├── courses ├── chapter_1 │ └── README.MD ├── chapter_2 │ ├── .ipynb_checkpoints │ │ └── Hello-checkpoint.ipynb │ ├── Hello.ipynb │ ├── __pycache__ │ │ └── intro_raw.cpython-36.pyc │ ├── intro_raw.py │ └── pylint_test.py ├── chapter_3 │ ├── big_bang_theory.ipynb │ ├── class_test.py │ ├── heatmap_freq.html │ ├── nn_test.py │ ├── text_process.ipynb │ ├── vis_summary.html │ ├── vis_wordcloud.html │ ├── word_count.py │ └── wordcloud.html ├── chapter_7 │ └── scikit-learn-example.ipynb └── chapter_8 │ ├── chatbot.py │ ├── itchat.ipynb │ ├── keras.ipynb │ └── sklearn.ipynb ├── data_mining ├── RenZhengfei.zip ├── big_bang_theory.ipynb ├── cluster.html ├── huawei.html ├── huawei.ipynb └── ncov.html ├── fig ├── contact.png └── intro.png └── nn_test.py /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [wqw547243068] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | custom: # Replace with a single custom sponsorship URL 13 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | 635 | Copyright (C) 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | Copyright (C) 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # [Python-learning](https://wqw547243068.github.io/Python-learning/) 2 | 3 | --- 4 | 5 | 6 | --- 7 | 8 | ![](https://img.shields.io/badge/language-python-green.svg) 9 | [![GitHub stars](https://img.shields.io/github/stars/wqw547243068/Python-learning.svg)](https://github.com/wqw547243068/Python-learning/stargazers) 10 | [![GitHub forks](https://img.shields.io/github/forks/wqw547243068/Python-learning.svg)](https://github.com/wqw547243068/Python-learning/network) 11 | [![GitHub issues](https://img.shields.io/github/issues/wqw547243068/Python-learning.svg)](https://github.com/wqw547243068/Python-learning/issues) 12 | [![GitHub release](https://img.shields.io/github/release/wqw547243068/Python-learning.svg)](https://github.com/wqw547243068/Python-learning/releases) 13 | [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/wqw547243068/wqw547243068.github.io/master/LICENSE) 14 | 15 | --- 16 | 17 | **好玩儿的Python:从数据挖掘到深度学习-From Data Mining to Deep Learning** 18 | - 详情请点击:[慕课学院](http://www.mooc.ai/course/489) 19 | 20 | ![info](http://static.mooc.ai/files/course/2018/05-08/17590372d80d143595.jpg) 21 | 22 | ![简介](fig/intro.png) 23 | 24 | ## Git代码库 25 | - 克隆代码库到本地: 26 | > git clone git@github.com:wqw547243068/Python-learning.git 27 | 28 | ## 课程列表 29 | - 【2019-5-3】[Python从新手到大师-100天](https://github.com/jackfrued/Python-100-Days) 30 | ### 时间线 31 | 32 | |*时间*|*章节*|*题目*|*作业*|*备注*| 33 | |----|----|:------:|:----|:----| 34 | |2018-5-14|第一节|入门导读||| 35 | |2018-5-21|第二节|Python基础|请完成ppt里提到的5-6个作业|这节课长达2h,内容非常多| 36 | |2018-05-28|第三节|Python基础(续)|面向对象编程| 37 | |2018-5-28|第三节|文本处理||字符串+面向对象+文本处理| 38 | |2018-6-6|第四节|数据分析基础||Python生态圈及数据分析| 39 | |-|第五节|机器学习基础|机器学习基本流程及Scikit-learn||| 40 | |-|第六节|深度学习基础|深度学习简介及tensorflow||| 41 | |-|第七节|iris和mnist|实战环节||| 42 | |-|第八节|RNN和NLP|聊天机器人||| 43 | |-|第九节|CNN和CV|人脸识别、目标检测||| 44 | 45 | 46 | ### 内容提要 47 | 48 | #### 第一节 入门导读 49 | 内容如下: 50 | 1. AI时代何去何从 51 | - 时代浪潮:移动互联网→O2O→大数据→互金→智能家居→共享→AI→区块链 52 | - DL是AI/ML的一个重要分支,Data是燃料(DM能力不可或缺) 53 | 1. 如何高效学习 54 | - 知乎:[为什么大多数人宁愿吃生活的苦,也不愿吃学习的苦?](https://www.zhihu.com/question/272483562/answer/376542013)(主动吃苦) 55 | - 学习金字塔: 主动学习>被动学习,教授>总结>实践>看书 56 | - 费曼技巧:[终极快速学习方法](https://www.zhihu.com/question/20576786) 57 | - 怎么成为大牛?走出舒适区,进入学习区 58 | - 大脑的学习之道:图谱结构+注意力+联想记忆+推理反思 59 | 1. 课程导读 60 | 61 | #### 第二节 Python基础 62 | 内容如下: 63 | 1. 入门神图: 64 | - 包,程序入口,函数,循环,分支,编码 65 | 1. 开发环境: 66 | - 三大流派:IDE+命令行+web 67 | - Linux开发环境是互联网标配 68 | - 大神简介:[Linus,一生只为寻找欢笑](https://zhuanlan.zhihu.com/p/19796979) 69 | - [入门级:GitHub和Git超超超详细使用教程](https://blog.csdn.net/javaandroid730/article/details/53522872) 70 | - [Git简易指南](http://www.bootcss.com/p/git-guide/), [Git快速入门](http://www.cnblogs.com/polk6/p/git-introduce.html),[猴子都能懂的git入门](http://backlogtool.com/git-guide/cn/),[Git常用命令速查表](https://files.jb51.net/file_images/article/201409/git_big_jb51.jpg) 71 | - 官方环境[Jupyter Lab](http://jupyter.org/try)、[Google Colab](http://g.co/colab)(含GPU要翻墙)、 [Kaggle](https://www.kaggle.com/kernels) 72 | - [7个Jupyter Notebook小提示与技巧](https://www.jianshu.com/p/dacc6acba00b), [Jupyter notebook快速入门](https://www.cnblogs.com/nxld/p/6566380.html),[Jupyter nbviewer](http://nbviewer.jupyter.org/):各种notebook资料分享 73 | 1. hello world 74 | - [如何高效的调试](https://www.zhihu.com/question/21572891), [pdb单步调试技巧](https://www.cnblogs.com/rwxwsblog/p/4605309.html) 75 | - 代码规范:[Google规范](https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/),[Pylint:默认PEP8规范](https://www.ibm.com/developerworks/cn/linux/l-cn-pylint/) 76 | 1. 数据结构 77 | - [数据结构总结](http://lib.csdn.net/article/datastructure/11369) 78 | 1. 算法 79 | - [数据结构算法可视化网站visualgo](https://visualgo.net/en),[图解排序算法](http://www.cnblogs.com/chengxiao/p/6129630.html) 80 | - [递归,分治算法,动态规划和贪心选择的区别](http://www.cnblogs.com/codeskiller/p/6477181.html) 81 | 1. 总结 82 | 83 | #### 第三节 Python基础(续) 84 | 内容如下: 85 | 1. Python之禅:设计哲学 86 | 1. 词频统计:词频排序→Top 3→中文版→文件读写→新闻语料 87 | 1. 面向对象:代码块→函数→模块(过程) →类→包 88 | - 面向对象:[初级篇](http://www.cnblogs.com/wupeiqi/p/4493506.html),[进阶篇](http://www.cnblogs.com/wupeiqi/p/4766801.html) 89 | 1. 总结 90 | 91 | #### 第四节 Python数据分析基础 92 | 1. 数据基础 93 | - 线性代数(35%) 94 | - 资料:[「Deep Learning」读书系列分享第二章:线性代数-分享总结](https://www.leiphone.com/news/201708/iL1S8jkc4ytZFzHS.html) 【文字版】, [线性代数笔记](https://share.weiyun.com/5ARfiQx) 95 | - 概率与信息论(25%) 96 | - 资料:[「Deep Learning」读书系列分享第三章:概率和信息论-分享总结](https://www.leiphone.com/news/201708/lbN7eWYBcovwhhN7.html),【文字版】 97 | - 其他资料:[Deep Learning解读合辑-国庆特辑](https://mp.weixin.qq.com/s?__biz=MjM5ODU3OTIyOA==&mid=503183187&idx=1&sn=cf18a77ef1249b589c89e23e0ddcae9e&chksm=3ec1ca2009b64336d14cacc57a4dadd6f732af61cf29b6517df7c1387d5eedcd00837dab88e3&mpshare=1&scene=23&srcid=0605oj6B3P1HddCiBJgOolQE#rd), 视频版 98 | 1. Python生态圈 99 | - numpy, 矩阵运算工具,资料如下: 100 | - [70个NumPy分级练习:用Python一举搞定机器学习矩阵运算](https://www.toutiao.com/a6527910077834199566/?tt_from=mobile_qq&utm_campaign=client_share×tamp=1525573097&app=news_article&utm_source=mobile_qq&iid=31862217871&utm_medium=toutiao_android) 101 | - [用python做科学计算——Numpy快速处理数据](http://old.sebug.net/paper/books/scipydoc/numpy_intro.html) 102 | - [python numpy笔记](https://www.zybuluo.com/chanvee/note/89078) 103 | - [知识点总结:脑图笔记](https://woaielf.github.io/2017/04/15/numpy/) 104 | - pandas,表格数据分析工具,资料如下: 105 | - [Pandas学习笔记-常用功能](https://zhuanlan.zhihu.com/p/25013519) 106 | - [十分钟搞定pandas](http://www.cnblogs.com/chaosimple/p/4153083.html) 107 | - [知识点总结:脑图笔记](https://woaielf.github.io/2017/04/22/Pandas/) 108 | - matplotlib,画图工具,资料如下: 109 | - [matplotlib官方教程](http://matplotlib.org/1.3.1/users/pyplot_tutorial.html) 110 | - [matplotlib核心剖析](http://www.cnblogs.com/vamei/archive/2013/01/30/2879700.html) 111 | - [知识点总结:脑图笔记](https://woaielf.github.io/2017/04/27/matplotlib/) 112 | 1. 数据分析 113 | 分析流程如下: 114 | ![分析流程](https://pic2.zhimg.com/80/v2-d5ffe317e7a8ce9445548bf4a36fc42e_hd.jpg) 115 | - 朝阳医院数据分析,分析过程参考:[销售数据分析](https://zhuanlan.zhihu.com/p/29210673),[用numpy和pandas分析数据过程](https://zhuanlan.zhihu.com/p/33437294) 116 | - kaggle数据分析,数据源参考:[各领域公开数据集](https://zhuanlan.zhihu.com/p/25138563) 117 | 1. 总结 118 | 119 | 120 | #### 第五节 机器学习基础 121 | 1. 什么是机器学习 122 | - 各种关系 123 | 1. 基本概念 124 | - 流程,[Google机器学习速成课程](https://developers.google.cn/machine-learning/crash-course/training-and-test-sets/video-lecture),[使用sklearn做单机特征工程](https://www.cnblogs.com/jasonfreak/p/5448385.html),[用正则化(Regularization)来解决过拟合](https://www.cnblogs.com/ooon/p/4964441.html) 125 | - 专业术语 126 | - 典型问题 127 | 1. 经典算法 128 | - [图解机器学习](https://my.oschina.net/taogang/blog/1544709),[动态图体验网址](https://codepen.io/collection/DPWwaj/2/) 129 | - [图解机器学习](C:\Users\wqw\Desktop\tantan\fastai\好玩儿的python\ppt\图解机器学习), web形式展示机器学习的前后过程 130 | 1. 案例 131 | - [Scikit-learn官网](http://scikit-learn.org/stable/),[中文文档](http://sklearn.apachecn.org/cn/0.19.0/) 132 | - [Sklearn快速使用及经典算法实现](https://www.cnblogs.com/lianyingteng/p/7811126.html) 133 | 1. 总结 134 | 135 | 136 | #### 第六节 深度学习基础 137 | 1. 什么是深度学习 138 | - 定义+发展历史 139 | 1. 神经网络 140 | - 基本流程 141 | - 反向传播 142 | - 梯度下降 143 | - 资料:[可视化神经网络空间变换](http://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html),[Google playground](http://playground.tensorflow.org/#activation=sigmoid&batchSize=10&dataset=circle®Dataset=reg-gauss&learningRate=0.03®ularizationRate=0.001&noise=0&networkShape=4,3,4,2&seed=0.57107&showTestData=false&discretize=false&percTrainData=50&x=true&) 144 | - [Yes you should understand backprop](https://medium.com/@karpathy/yes-you-should-understand-backprop-e2f06eab496b) 145 | 1. Tensorflow 146 | - [小白都能懂的tensorflow教程](http://www.sohu.com/a/126825423_465975) 147 | 1. Tensorboard 148 | - [详解TensorBoard如何调参](https://blog.csdn.net/qunnie_yi/article/details/80129434) 149 | 1. 总结 150 | 151 | 152 | 153 | #### 第七节 iris和mnist 154 | 1. iris数据集+机器学习实战, [有道笔记链接](http://note.youdao.com/noteshare?id=d056f57ae605874c8485ae50eddc8d66&sub=D81038A5C91E4BE6A612ACEB8A56AEDE) 155 | 1. mnist数据集+tensorflow进阶,[jupyter notebook地址](./courses/chapter_7/scikit-learn-example.ipynb) 156 | 157 | #### 第八节 RNN和NLP 158 | 1. RNN简介 159 | - 资料:[循环神经网络(RNN)原理通俗解释](https://blog.csdn.net/qq_39422642/article/details/78676567),[TensorFlow中RNN实现的正确打开方式](https://blog.csdn.net/starzhou/article/details/77848156) 160 | - [理解LSTM网络](https://www.jianshu.com/p/9dc9f41f0b29),[英文原文](https://colah.github.io/posts/2015-08-Understanding-LSTMs/) 161 | 1. 应用: 162 | - 分类:再谈MNIST,[RNN用于MNIST分类](https://cuiqingcai.com/4934.html) 163 | - 回归:股票预测, [LSTM股票预测](https://blog.csdn.net/mylove0414/article/details/55805974) 164 | 1. NLP简介 165 | - NLP基本概念 166 | - [NLP学习总结](https://www.jianshu.com/p/ee484fd1c6d8),[十分钟NLP概述](https://www.cnblogs.com/baiboy/p/learnnlp.html),[BosonNLP在线示例](https://bosonnlp.com/demo#overview-emotion) 167 | 168 | 1. 应用 169 | - 聊天机器人 170 | - [python分析微信朋友圈](https://blog.csdn.net/u012485099/article/details/79522144),[Python解密微信大数据](https://zhuanlan.zhihu.com/p/33230381),[Itchat微信自动回复](https://zhuanlan.zhihu.com/p/34238048) 171 | - seq2seq,[charRNN-TF](https://github.com/hzy46/Char-RNN-TensorFlow) 172 | 1. 总结 173 | - 资料,[语音机器人](https://www.thepaper.cn/newsDetail_forward_2238654),[艾诚中英文切换超自如 对话网红机器人获赞](http://ent.enorth.com.cn/system/2017/09/14/033729404.shtml) 174 | 175 | #### 第九节 CNN和CV 176 | 1. iris数据集+机器学习实战 177 | 1. CNN简介 178 | - 计算机视觉 179 | - [YJango的卷积神经网络——介绍](https://zhuanlan.zhihu.com/p/27642620),[SIFT与HOG特征提取](http://blog.csdn.net/taigw/article/details/42206311) 180 | - [李飞飞《让冰冷的机器读懂照片背后的故事》](http://www.ifanr.com/648667),[TED视频《我们怎样教计算机理解图片》](https://www.ted.com/talks/fei_fei_li_how_we_re_teaching_computers_to_understand_pictures?language=zh-cn),[网易公开课:《李飞飞:如何教计算机理解图片》](http://open.163.com/movie/2015/3/Q/R/MAKN9A24M_MAKN9QAQR.html) 181 | - CNN基本结构 182 | - 《神经网络与深度学习》吴岸城,[Deep Learning(深度学习)学习笔记整理系列之(一)](http://blog.csdn.net/zouxy09/article/details/8775360),[Andrew Ng 深度学习(Deep Learning)介绍](http://blog.sina.com.cn/s/blog_50a5cf290101r7a6.html) 183 | - [YJango的卷积神经网络——介绍](https://zhuanlan.zhihu.com/p/27642620),[卷积神经网络工作原理直观的解释?](https://www.zhihu.com/question/39022858) 184 | - [Yann LeCun连发三弹:人人都懂的深度学习基本原理(附视频)](https://www.leiphone.com/news/201612/Sjkmer9Kto5ILxFk.html?utm_source=itdadao&utm_medium=referral) 185 | - [卷积神经网络中用1*1 卷积有什么作用或者好处呢?](https://www.zhihu.com/question/56024942) 186 | - 手写数字识别[3D交互体验](http://scs.ryerson.ca/~aharley/vis/conv/) 187 | - [CNN发展历史](http://www.cnblogs.com/52machinelearning/p/5821591.html),[台大李宏毅:一天搞懂深度学习](http://v.youku.com/v_show/id_XMTY5NDUzNjIxNg==.html?from=s1.8-1-1.2&spm=0.0.0.0.LZsB12%EF%BC%8C%E4%B8%80%E5%A4%A9%E6%90%9E%E6%87%82%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92--%E5%AD%B8%E7%BF%92%E5%BF%83%E5%BE%97) 188 | 189 | 1. 应用 190 | - 目标检测,作业:[Tensorflow lite在移动设备上的运行Demo](https://blog.csdn.net/masa_fish/article/details/54097796) 191 | - 人脸识别,作业:[python的人脸识别工具包face recognition](https://github.com/ageitgey/face_recognition) 192 | - 参考资料:[Large Pose 3D Face Reconstruction from a Single Image via Direct Volumetric CNN Regression](http://aaronsplace.co.uk/papers/jackson2017recon/),[2D图像三维重建Demo体验地址](http://www.cs.nott.ac.uk/~psxasj/3dme/view.php?name=../59b415560b915),[表情替换,DeepWarp Demo Page](http://163.172.78.19/) 193 | - 颜值预测,[一个基于 TensorFlow 的「颜值评分」开源项目:FaceRank](https://zhuanlan.zhihu.com/p/28208481) 194 | 1. 反思 195 | - [Geoffrey Hinton多伦多大学演讲:卷积神经网络的问题](http://www.sohu.com/a/165989490_465975) 196 | - [Hinton的Capsule论文全公开!首发《胶囊间的动态路由》原文精译,了解Hinton的胶囊网络ㅣ第一部分:直觉](http://mp.weixin.qq.com/s/gAFKrUjfQyqaDKNyMRitZg) 197 | 198 | ## 数据挖掘实战 199 | - 以下是帮大数据文摘做的挖掘分析 200 | 201 | ### big bang可视化分析 202 | - 【2019-05-22】[临别给《生活大爆炸》做个台词数据分析,你猜谢耳朵最爱说什么?](https://mp.weixin.qq.com/s?src=11×tamp=1559806346&ver=1651&signature=ghdcA8eGmPBbxllQXe5ftDZK8UVlZeSTMw0ZxLT82lFr1kB-QDJf3rf0MVIFearpvqtmvKnSAvGEIvvwxC8p5lc*umYWB7HcHFkYWl*M-inWZ8KZHrkZvL0IHW*XB5jH&new=1) 203 | - 用python分析big bang台词,并可视化,[jupyter笔记](https://github.com/wqw547243068/Python-learning/blob/master/courses/chapter_3/big_bang_theory.ipynb) 204 | - ![](https://pmcvariety.files.wordpress.com/2019/05/the-big-bang-theory-artisans.jpg?w=1000&h=563&crop=1) 205 | - [TelAntiNomy](https://blog.csdn.net/Tele_Anti_Nomy/article/details/88092709) 206 | - ![](https://img-blog.csdnimg.cn/20190305094504431.jpg) 207 | - 【2019-05-22】汇总top场景的top人物的词频[heatmap](courses/chapter_3/heatmap_freq.html) 208 | - 209 | - 台词汇总[vis_summary](courses/chapter_3/vis_summary.html) 210 | - 211 | - top场景top人物的词云汇总[vis_summary](courses/chapter_3/vis_summary.html) 212 | - 213 | - pyecharts的词云demo: 214 | - 215 | - [markdown转html格式工具](https://dillinger.io/) 216 | 217 | ### 华为讲话稿分析 218 | - 【2019-05-25】[卅年春秋,谁主沉浮?从400篇任正非演讲稿分析中,一探华为](https://mp.weixin.qq.com/s?src=11×tamp=1559806219&ver=1651&signature=ghdcA8eGmPBbxllQXe5ftDZK8UVlZeSTMw0ZxLT82lHj9VSWb6EKrYB5SbBSR3GHFXwEzAB2ZBBzHuC-TmetZhzzCFPO-Cy9UhK8QLT-*Hc8kjgvLxXpBppgPcoR4ORm&new=1) 219 | - 【2019-05-25】[独立页面](https://wqw547243068.github.io/Python-learning/data_mining/huawei) 220 | - 221 | 222 | ### 轨迹点聚类分析 223 | 224 | - 【2019-05-28】用DBSCAN将定位点聚类成簇,再做分类预测,判断常驻点,[示例](https://wqw547243068.github.io/Python-learning/data_mining/cluster.html) 225 | - 226 | 227 | ### 新冠状病毒感染可视化 228 | 229 | - 【2020-02-06】python+pyecharts可视化新冠状病毒(武汉肺炎)分布,[示例](https://wqw547243068.github.io/Python-learning/data_mining/ncov.html) 230 | - 感染过程仿真[VirusBroadcast](https://github.com/KikiLetGo/VirusBroadcast),java版本 231 | - 232 | 233 | 234 | ## 交流分享 235 | 欢迎大家入群分享、交流! 236 | ![简介](fig/contact.png) 237 | --- 238 | 239 | 240 | --- 241 | 244 | --- 245 | 246 | 247 |
248 | 249 | 250 | 251 | 252 | 253 |
254 | 257 | 258 | 259 | ## 评论区 260 | 261 | 262 |
263 | 276 | 277 |
278 | 279 | 280 | --- 281 | 290 | --- 291 | 292 | 293 | 299 | --- 300 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /big_bang.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |

big bang可视化分析

4 |

用python分析big bang台词,并可视化,jupyter笔记 5 |
6 | 7 |
TelAntiNomy 8 |
9 | 10 |
【2019-05-22】汇总top场景的top人物的词频[heatmap](courses/chapter_3/heatmap_freq.html) 11 |
12 | 13 | vis_summary 14 |
台词汇总[vis_summary](courses/chapter_3/vis_summary.html) 15 | 16 | 17 |
top场景top人物的词云汇总[vis_summary](courses/chapter_3/vis_summary.html) 18 |
19 | 20 | 21 |

pyecharts的词云demo


22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /big_bang_theory.html: -------------------------------------------------------------------------------- 1 |

big bang可视化分析

2 | 3 |
  • 用python分析big bang台词,并可视化,jupyter笔记
  • TelAntiNomy
  • 【2019-05-22】汇总top场景的top人物的词频heatmap
  • <iframe src="courses/chapter3/heatmapfreq.html" scrolling="yes" border="0" frameborder="no" framespacing="0" allowfullscreen="true" height="400" width="600"> </iframe>
  • 台词汇总[vissummary](courses/chapter3/vis_summary.html)
  • <iframe src="courses/chapter3/vissummary.html" scrolling="yes" border="0" frameborder="no" framespacing="0" allowfullscreen="true" height="1500" width="100%"> </iframe>
  • top场景top人物的词云汇总[vissummary](courses/chapter3/vis_summary.html)
  • <iframe src="courses/chapter3/viswordcloud.html" scrolling="yes" border="0" frameborder="no" framespacing="0" allowfullscreen="true" height="600" width="100%"> </iframe>
  • pyecharts的词云demo:
  • <iframe src="courses/chapter_3/wordcloud.html" scrolling="yes" border="0" frameborder="no" framespacing="0" allowfullscreen="true" height="600" width="100%"> </iframe>
4 | -------------------------------------------------------------------------------- /courses/chapter_1/README.MD: -------------------------------------------------------------------------------- 1 | # 第一节 Python入门AI导读 2 | 3 | 课程简介 4 | 5 | ![intro](../../fig/intro.png) 6 | 7 | 详见ppt 8 | 9 | ## 大纲 10 | 11 | 1. AI时代何去何从 12 | 1. 如何高效学习 13 | 1. 课程导读 14 | 1. Python前世今生 15 | 1. Python开发环境 16 | 1. Hello World 17 | 18 | 本节重点:如何高效学习 19 | 20 | ## 其他 21 | 22 | -------------------------------------------------------------------------------- /courses/chapter_2/.ipynb_checkpoints/Hello-checkpoint.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [], 3 | "metadata": {}, 4 | "nbformat": 4, 5 | "nbformat_minor": 2 6 | } 7 | -------------------------------------------------------------------------------- /courses/chapter_2/Hello.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": null, 6 | "metadata": {}, 7 | "outputs": [], 8 | "source": [ 9 | "# -*- coding: utf-8 -*-\n", 10 | "# Quick Pytohn Script Explanation for Progeammers\n", 11 | "# 给程序员的超快速Py脚本解说\n", 12 | "import os\n", 13 | "\n", 14 | "def main():\n", 15 | " print('Hello World!')\n", 16 | " print(\"这是Alice\\'的问候.\") \n", 17 | " print('这是Bob\\'的问候.')\n", 18 | " foo(5, 10)\n", 19 | " print('=' * 10)\n", 20 | " print('这将直接执行'+os.getcwd())\n", 21 | " counter = 0\n", 22 | " counter += 1\n", 23 | " food = ['苹果', '杏子', '李子', '梨']\n", 24 | " for i in food:\n", 25 | " print('俺就爱整只:'+i)\n", 26 | " print('数到10')\n", 27 | " for i in range(10):\n", 28 | " print(i)\n", 29 | "\n", 30 | "def foo(param1, secondParam):\n", 31 | " res = param1+secondParam\n", 32 | " print('%s 加 %s 等于 %s'%(param1, secondParam, res))\n", 33 | " if res < 50:\n", 34 | " print('这个')\n", 35 | " elif (res>=50) and ((param1==42) or (secondParam==24)):\n", 36 | " print('那个')\n", 37 | " else:\n", 38 | " print('嗯...')\n", 39 | " return res # 这是单行注释\n", 40 | " '''这是多\n", 41 | "行注释......'''\n", 42 | "\n", 43 | "if __name__=='__main__':\n", 44 | " main()" 45 | ] 46 | } 47 | ], 48 | "metadata": { 49 | "kernelspec": { 50 | "display_name": "Python 3", 51 | "language": "python", 52 | "name": "python3" 53 | }, 54 | "language_info": { 55 | "codemirror_mode": { 56 | "name": "ipython", 57 | "version": 3 58 | }, 59 | "file_extension": ".py", 60 | "mimetype": "text/x-python", 61 | "name": "python", 62 | "nbconvert_exporter": "python", 63 | "pygments_lexer": "ipython3", 64 | "version": "3.6.3" 65 | } 66 | }, 67 | "nbformat": 4, 68 | "nbformat_minor": 2 69 | } 70 | -------------------------------------------------------------------------------- /courses/chapter_2/__pycache__/intro_raw.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wqw547243068/Python-learning/a3f4acebbed13852606c9d831477af3bab766f90/courses/chapter_2/__pycache__/intro_raw.cpython-36.pyc -------------------------------------------------------------------------------- /courses/chapter_2/intro_raw.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Quick Pytohn Script Explanation for Progeammers 3 | # 给程序员的超快速Py脚本解说 4 | import os 5 | 6 | def main(): 7 | print('Hello World!') 8 | print("这是Alice\'的问候.") 9 | print('这是Bob\'的问候.') 10 | foo(5, 10) 11 | print('=' * 10) 12 | print('这将直接执行'+os.getcwd()) 13 | counter = 0 14 | counter += 1 15 | food = ['苹果', '杏子', '李子', '梨'] 16 | for i in food: 17 | print('俺就爱整只:'+i) 18 | print('数到10') 19 | for i in range(10): 20 | print(i) 21 | 22 | def foo(param1, secondParam): 23 | res = param1+secondParam 24 | print('%s 加 %s 等于 %s'%(param1, secondParam, res)) 25 | if res < 50: 26 | print('这个') 27 | elif (res>=50) and ((param1==42) or (secondParam==24)): 28 | print('那个') 29 | else: 30 | print('嗯...') 31 | return res # 这是单行注释 32 | '''这是多 33 | 行注释......''' 34 | 35 | if __name__=='__main__': 36 | main() -------------------------------------------------------------------------------- /courses/chapter_2/pylint_test.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding:utf8 3 | """ 4 | test sample. google编码规范:(URL不受80字符限制) 5 | https://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/ 6 | 2017-11-24 7 | wqw547243068@163.com 8 | """ 9 | #import的包一定要使用;import包分成3部分,依次排序:①系统包②第三方包③自定义包。每部分按照字母顺序排序,一次不能导入多个包 10 | import sys 11 | 12 | class MyClass(object): 13 | """class测试: 类名满足Pascal风格""" 14 | public_name = '-public-' # public 15 | _myname = '-protected' # protected 16 | __private_name = '-private-' # private 17 | 18 | def __init__(self, name="wang"): 19 | self._myname = name 20 | print '我的名字是%s'%(self._myname) 21 | 22 | def say(self): 23 | """打招呼""" 24 | print '你好,我是%s,%s,%s'%(self._myname, self.public_name, self.__private_name) 25 | return 'yes' 26 | 27 | def modify(self, name="-"): 28 | """更改属性值""" 29 | self._myname = name 30 | 31 | def my_fun(value=0, delta=9): 32 | """ 33 | 外部函数:名字_连接。多参数时,逗号后面加一个空格 34 | """ 35 | res = value + delta 36 | return res 37 | 38 | def main(): 39 | """main function""" 40 | #main里的都是全局变量,需要大写 41 | value = 3 42 | new = my_fun(value) 43 | v_result = MyClass("wqw") 44 | #不能访问protected、private变量.W._myname, W.__private_name 45 | #超过80字符时,可以用\换行,注:(),[]时可省略\ 46 | print >> sys.stdout, 'hello,related values are listed as : %s , %s,I am \ 47 | %s,%s ...'%(value, new, v_result.say(), v_result.public_name) 48 | print >> sys.stdout, 'hello,related values are listed as : %s , %s,I am %s,%s ...'%(value, new, v_result.say(), v_result.public_name) # pylint: disable=line-too-long 49 | #参考:怎么关闭某类检测:How do I disable a Pylint warning? 50 | #https://stackoverflow.com/questions/4341746/how-do-i-disable-a-pylint-warning 51 | 52 | if __name__ == '__main__': 53 | A = 3 # 此处为全局变量,一律大写 54 | main() 55 | 56 | # */* vim: set expandtab ts=4 sw=4 sts=4 tw=400: */ -------------------------------------------------------------------------------- /courses/chapter_3/class_test.py: -------------------------------------------------------------------------------- 1 | 2 | class Province: 3 | # 静态字段 4 | country = '中国' 5 | def __init__(self, name): 6 | # 普通字段 7 | self.name = name 8 | 9 | # 直接访问普通字段 10 | obj = Province('河北省') 11 | print obj.name 12 | # 直接访问静态字段 13 | Province.country 14 | 15 | class Foo: 16 | def __init__(self, name): 17 | self.name = name 18 | def ord_func(self): 19 | """ 定义普通方法,至少有一个self参数 """ 20 | # print self.name 21 | print '普通方法' 22 | @classmethod 23 | def class_func(cls): 24 | """ 定义类方法,至少有一个cls参数 """ 25 | print '类方法' 26 | @staticmethod 27 | def static_func():#静态方法不能访问类变量+实例变量,无需实例化就能使用 28 | """ 定义静态方法 ,无默认参数""" 29 | print '静态方法' 30 | f = Foo() 31 | f.ord_func()# 调用普通方法 32 | f.static_func() 33 | f.class_func()#报错! 34 | Foo.class_func()# 调用类方法 35 | Foo.static_func()# 调用静态方法 36 | -------------------------------------------------------------------------------- /courses/chapter_3/nn_test.py: -------------------------------------------------------------------------------- 1 | # coding:utf8 2 | # How to build your own Neural Network from scratch in Python 3 | # https://towardsdatascience.com/how-to-build-your-own-neural-network-from-scratch-in-python-68998a08e4f6 4 | 5 | import numpy as np 6 | 7 | def sigmoid(x): 8 | return 1.0/(1+ np.exp(-x)) 9 | 10 | def sigmoid_derivative(x): 11 | return x * (1.0 - x) 12 | 13 | class NeuralNetwork: 14 | def __init__(self, x, y): 15 | self.input = x 16 | self.weights1 = np.random.rand(self.input.shape[1],4) 17 | self.weights2 = np.random.rand(4,1) 18 | self.y = y 19 | self.output = np.zeros(self.y.shape) 20 | 21 | def feedforward(self): 22 | self.layer1 = sigmoid(np.dot(self.input, self.weights1)) 23 | self.output = sigmoid(np.dot(self.layer1, self.weights2)) 24 | 25 | def backprop(self): 26 | # application of the chain rule to find derivative of the loss function with respect to weights2 and weights1 27 | d_weights2 = np.dot(self.layer1.T, (2*(self.y - self.output) * sigmoid_derivative(self.output))) 28 | d_weights1 = np.dot(self.input.T, (np.dot(2*(self.y - self.output) * sigmoid_derivative(self.output), self.weights2.T) * sigmoid_derivative(self.layer1))) 29 | 30 | # update the weights with the derivative (slope) of the loss function 31 | self.weights1 += d_weights1 32 | self.weights2 += d_weights2 33 | 34 | 35 | if __name__ == "__main__": 36 | X = np.array([[0,0,1], 37 | [0,1,1], 38 | [1,0,1], 39 | [1,1,1]]) 40 | y = np.array([[0],[1],[1],[0]]) 41 | nn = NeuralNetwork(X,y) 42 | 43 | for i in range(1500): 44 | nn.feedforward() 45 | nn.backprop() 46 | 47 | print(nn.output) -------------------------------------------------------------------------------- /courses/chapter_3/word_count.py: -------------------------------------------------------------------------------- 1 | 2 | # coding:utf8 3 | 4 | def main(): 5 | """ 主函数 """ 6 | zen = """ 7 | The Zen of Python, by Tim Peters 8 | 9 | Beautiful is better than ugly. 10 | Explicit is better than implicit. 11 | Simple is better than complex. 12 | Complex is better than complicated. 13 | Flat is better than nested. 14 | Sparse is better than dense. 15 | Readability counts. 16 | Special cases aren't special enough to break the rules. 17 | Although practicality beats purity. 18 | Errors should never pass silently. 19 | Unless explicitly silenced. 20 | In the face of ambiguity, refuse the temptation to guess. 21 | There should be one-- and preferably only one --obvious way to do it. 22 | Although that way may not be obvious at first unless you're Dutch. 23 | Now is better than never. 24 | Although never is often better than *right* now. 25 | If the implementation is hard to explain, it's a bad idea. 26 | If the implementation is easy to explain, it may be a good idea. 27 | Namespaces are one honking great idea -- let's do more of those! 28 | """ 29 | print(zen) 30 | # 统计词频 31 | word_dict = {} 32 | for word in zen.split(): 33 | #print(word) 34 | #""" 35 | if word in word_dict: 36 | word_dict[word] += 1 37 | else: 38 | word_dict[word] = 1 39 | #""" 40 | # 更高效的方式,python2 41 | #word_dict[word] += word_dict.get(word, 0) 42 | print('word\tcount\n%s'%('='*20)) 43 | for k in word_dict: 44 | print('%s\t%s'%(k, word_dict[k])) 45 | # 排序 46 | key_list = list(word_dict.items()) 47 | key_list.sort()#就地排序 48 | #sorted(word_dict.items()) 49 | #key_list = sorted(list(word_dict.items()), cmp=lambda x,y : cmp(x[1], y[1]), reverse=True) 50 | print('word\tcount\n%s'%('='*20)) 51 | for k in key_list: 52 | print('%s\t%s'%(k[0], word_dict[k[0]])) 53 | 54 | if __name__ == "__main__": 55 | print('开始调用主函数') 56 | main() 57 | -------------------------------------------------------------------------------- /courses/chapter_8/chatbot.py: -------------------------------------------------------------------------------- 1 | #coding:utf8 2 | #[2018-4-1]python初学者好玩案例:https://blog.csdn.net/qq_18495537/article/details/79278710 3 | from time import sleep 4 | import requests 5 | 6 | if __name__ == "__main__": 7 | ask = input("请主人输入话题:(随便什么词) ") 8 | same_max = 10#中止条件,恢复语句中最多多少次相同 9 | same_count_1 = 0 10 | same_count_2 = 0 11 | last_resp_1 = '-' 12 | last_resp_2 = '-' 13 | count = 0 14 | print('{}\t{:<40}\t{:<40}\n{}'.format('轮数', '图灵(问)', '青云客(答)', '-'*80)) 15 | while True: 16 | count += 1 17 | #更新问题 18 | if last_resp_2 != '-': 19 | ask = last_resp_2 20 | sleep(1) 21 | #图灵机器人 22 | resp = requests.post("http://www.tuling123.com/openapi/api", 23 | data={"key": "4fede3c4384846b9a7d0456a5e1e2943", "info": ask, }) 24 | resp = resp.json() 25 | #print('第{}轮\t图灵:\t{}'.format(count, resp['text'])) 26 | if same_count_1 > same_max: 27 | print('图灵把天儿聊死了。。。哈哈哈') 28 | break 29 | if resp == last_resp_1: 30 | same_count_1 += 1 31 | else: 32 | last_resp_1 = resp 33 | #printf('%s\t%s', count, resp['text']) 34 | print('%s\t图灵: %s'%(count, resp['text'])) 35 | #print('%s\t图灵: %s'%(count, resp['text']), end="")#python3不换行 36 | sleep(1) 37 | #青云客机器人 38 | resp = requests.get("http://api.qingyunke.com/api.php", 39 | {'key': 'free', 'appid': 0, 'msg': resp['text']}) 40 | resp.encoding = 'utf8' 41 | resp = resp.json() 42 | if same_count_2 > same_max: 43 | print('青云客把天儿聊死了。。。哈哈哈') 44 | break 45 | if resp['content'] == last_resp_2: 46 | same_count_2 += 1 47 | else: 48 | last_resp_2 = resp['content'] 49 | #print('第{}轮\t青云客:\t{}'.format(count, resp['content'])) 50 | #print('{}\t{:<40}\t{:<40}'.format(count, s, resp['content'])) 51 | print('\t\t{:>40}'.format('菲菲: '+resp['content'])) -------------------------------------------------------------------------------- /courses/chapter_8/keras.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": {}, 7 | "outputs": [ 8 | { 9 | "name": "stdout", 10 | "output_type": "stream", 11 | "text": [ 12 | "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\n" 13 | ] 14 | }, 15 | { 16 | "data": { 17 | "text/plain": [ 18 | "Text(0.5,1,'IHSAN')" 19 | ] 20 | }, 21 | "execution_count": 1, 22 | "metadata": {}, 23 | "output_type": "execute_result" 24 | }, 25 | { 26 | "data": { 27 | "image/png": "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\nT+bnXX1y4qKrBwf83KOeyO/QIdSbfbR+8qVCzdpKZVe2Sydy7TOufcszco2GXJ3abPNsR1hbnCkH\nAAAAYsagHAAAAIgZg3IAAAAgZmTKV1Cr77hZY73HG80lqzbJtw22+yxff/B9iHd3Drq6L+kzozv6\nt7j68M79ru7t8o+vfY/rqZXjbPUMZ0Z6c49JXvdzF7/h6nt3HHJ1X7vPlGvGvLcqz9sdc5ZX+5CP\ny2s9OzXi6pJVXN0Z/HaxVXr3ap/k20lReosXJNOq29WTZ5++/rMeL3Ijvod5puIfOymzTp6fvuDq\nwW7/uTx88D5X9xf9/l5vXkQr95vX44ceX+pdByHu489a0v2xYH47upj332k278/ZHZz322xfh99u\nOlOtu120yT6SkGt5JKW2yN++Evy7F5nWQHNwphwAAACIGYNyAAAAIGYMygEAAICY3baZcs0Ozxdr\n9x3/uwvfqLk8LZnzdFUuVLu3Npo/a5N825aU7yP+0N67XJ2RPsbHt/vM+FCP73vcIRnRVLK9ofVb\nTY6z1TKc2j/6s1VZXzOz8/NXXX1q6rKrh1M9rt7T63vCv60qzxt3plzbCodluUu/vCQbrvbuXVZL\nBn0zK5d93+O5XNrVJ0fOufrUtN9uTs5fuf7zVN7fV9/FSN5nzZTrHJTR/Iyrpwv++PDwvte6Op3x\nz3/PniOubuVMudLjS725Qmenrri6V/ZRzdtvpPdCFSK/ZU1Hvrd2Kj/n6tPjvm/5noGtrm6lTLke\ny5IhUbPWjLl+Z+uxLQqkyLE2OFMOAAAAxIxBOQAAABAzBuUAAABAzG7bTLlmwD8j2eEXJ31+bloy\n55pN1D6oKVvKrFUkRa49TyuaV1tppRf1SC/srT2+L/mBvcdr3r9zjXOQrZYTb0S2mK9Zj6d9Prdk\nPks8lZ51dbv8f6+by+Dj5zGQLHKdWnOaul1PFHwGVedt6Hu5kfO4SucinB7zvcK/cOVlV1/KTbo6\nW1nqRV6MGsviF/UXcv9cwW+jwXy/6b94+YuuPtS33dU7+vy8iFSb/9roaPfXSWj0ugbNlC/6fvB6\nnL8y7+cCfebCs67WbfRAt89Nf8sdPn+v70Ui4bPKrURz0vpFUw5+u5kr+fduRuZJzOb83ITuDv+9\nFOd2oMeqNsmMJ+S43Fbn/KR+J98+s2U2lsncXP0bVWnFscqqz5SHELaEEP5ZCOGPQwinQgjZEMJM\n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\n3CMv21m24usLef+5Dxb9d2i9uQxrSb+DD+/c7+oLab/PtPlpE3ajxH61rMzjeumyPz7s7fXzPsiU\nN091Tlzz5ZohPzq029XDnX6+TitgdAYAAADEjEE5AAAAEDMG5QAAAEDMyJQv0t65e7b53ro7hn0u\nMim3b0+2y/KV31rtbd1h/rHa6oQBc9Ib98W5y64+OLzT1SXtHyvriiVdKZ/1q9fLey7vM6X1ewe3\nsKBl7bkOege9fVdbuyzfONLSZ3hUrh3w/MxFV8/K7fW9GJRrERzr9fvonVVzUnYPSAY7VTt/mpHn\nfuvBe129e8Rne6dzfg7Kc5PnXX1Fji9F81njjPSzzkn/6qJkjUuVtZtbUJRM+cXxEVdXSv7Yt3wL\nrtOPWl77ZFHy9FP+Gnk7e4dcvZ6Z8nrKkumeqfgc9O6U304uF3xGXOcmFGVOSVry9zp3QXt163yA\n1Bp+L2mmfFktz63Hunr5/Ky8Nt0nNXM+6A8HaIDmwKtz4o899GhD921FnCkHAAAAYsagHAAAAIgZ\ng3IAAAAgZq0TeIuZZv/WMguo/Z+1T7ku1zxbTjKbWcnmzUl+jQuk3jztH3vPniOuvjjv+9mOS3/q\ncp0+yK2sR/Ly/akuV/dKv+y89MfX/8Nftp1voFS5XkvgyQvPuVp7dRelL7nm6Xd2+LzuGw/c7eo9\nVTnyVNIfe/T4oHo7/OfUkfDPPXigx9UvXDrt6lfnx109mvfbtOauO5M+jzvY0Svr6+fIrOWxVLO6\naeknP1PwDac7gl+XLnlvMyZ5eenNrTnpkblJVx+XLHH19Sqard51BVRJ8vGa9M9X/GvvS/hjYZDJ\nTnNl/1pL8j0zLe/9y1f83IX+bp/vHV7HuU56lE7K0UuvK9Au23RB9nftb7/8vd643wutbiPkxBvB\nmXIAAAAgZgzKAQAAgJgxKAcAAABiRqa8BSTk/41S0re8IPk0zS3npa9wXjLm+bLPRfoEKqp1Saa8\nXs5a87aa35+XjGt15lV7YfdIZnu9dcvz37/nuKsvzfv87KRkyjWjWpI+xq2cq9Q+w+PpaVdrn3LN\nLqtOyVEf7Nvu6i3dPmPezOxxe51M+t6tvkf6wMSrru6WzHim5PtPDyf9uh7fut/Vx3YecLVe06GZ\ndJuaKPhtUnuqJyQrvDPV7+qRou/NXSzLsbfin2+q5HPT5WjterKrNnkt2ltba32vShW/fyYkN31n\n/w5XvyTXw0iX/T5TliPASN6/l2H6gqvvSO91daf0DtdrQjSVHIo0Q74t4edJpCVvr3NI9MimPeFb\n98iHVsOZcgAAACBmDMoBAACAmDEoBwAAAGJGpjwGmlvulezcUMpnNjOFWVdXJK9WkMz4+ekrrr5z\nh8989pX94yfWMPO50WkOUxOj2p9W63nJjX/p4kvXf97WM+iWxZ4pl+1Q8/S6XPP0FcnTzkhPZ83Q\nV+e4dZ9Yb/miz01/4/IZV5eLfh8LdUKi+t4NS0/m7tT6vV7dv/VzPDK029Wan5+WjX5Qjk/benw+\nfkBeazK5dl8zBblmg+ass7K8V/LyKclRDwY/Z2Te/Hah+3eP3L8ox+KS1M3s2a7b2PYOn4+/lPJz\nQKakb7huwh2ybj3Sp3xL0ve7n5N5FRnJXafNZ86vyvfY584+6+p3H/8mVyd7/HubamYfc2np3i79\n61PL+tn7Omv+c9V3kww5bhVnygEAAICYMSgHAAAAYsagHAAAAIgZmfIYaD/o1+055uorkunsKMy7\nul6f8nnJ8l6ZGnf1cLfPHpIpX5n23p2rSG/eOv1oZ6VvcnWuOiMZa/ORzdhFkrvUIHW9fP2UvPZn\nL59y9fbepUx93JnynPQpT1ZqL9dQqvaE7kv6fXzn4DZXtzczH9ugLsmz90tGfGunz4S3y/HhcJ/v\nc751YIur29rW71yPHguvlGblFn55kI26Q7LC7ZJJ1yyxPt583h9rRyfGXD0k+freZmbK5Xvk3j1H\nXX1+3h/3ZyRTrq+lJHNC9PoZ+7v955yVDPlo0X9Ppcv++DYn30tTWf9ZvXz5rKsfPPgaVzczU66H\nNqW9/dvkvdD763F/+Vwj4OZwphwAAACIGYNyAAAAIGYMygEAAICYkSmPgeZnt0ifX+37q9ncXH7O\n1ZqrvCoZ9OmMv30657OF2juXjHmVSMva6cB6fcur61bPGdbrU94j2WTtS64Z1rQszxSWctpDPta8\n7rTnuuZlyxIi1c9V+xwPtvsJAl1J/141s191oxJtfv/etWW7q+/ITLu6XXpxH99z0NV9nf7DW8tM\neVay/bOyjc3mfa1zPvrapE+5HOt2tvtrB0xn/PPNFf02PC656FfnfI57f2Gvq3s7mzdxRL9HuqXW\n/bdNtnE9/pSisr+9bPOHpJ99f4/Py//dlZdcnS35Hu/+0Zd/T2nmXK9r0NPZvINEo8feZdNr6ryX\n+p1c73sDG8Nkzo+lhmX+TTNwphwAAACIGYNyAAAAIGbEV1qAtii7f89xV1+e95dLTuT9n/0K0pwu\nXfZ/Nrww6/+kumPS/4m2S1prpcz/ifd2jrNoa6xe+fO3Lte/UpaljWC66s/fGb1MtdQaF4nba7bf\n4eqXpi7WvL3+yTYvfx5vpT8eFbwGAAAgAElEQVTpLmuBVqdWujghL61Q8nGYfNHvox3tfrtaS7o/\n90mk4sGDd9e8f6es63q2d9QI1NOXTvrlsg/p59KR9Ou+b8BHdxLt/rWcLfr2tHqp+ilp+zdR9FHD\nQkUvx752grzYhNS6LhqxmJdoUEIiVgPdvX55u1++s0Nil3mJXUb++TUidj7tv6fuzPrvud5U1/Wf\n25PSyrLBbXD53qw5RWmlWefxomWtcVvn2IZbp3GVk1OXXf3uT//89Z9L42ea8pycKQcAAABixqAc\nAAAAiBmDcgAAACBmt02mfD1a2dwqzQ53S8ZbL4OtWUHNv+UkqzcvOcuZnM/6XZ2+6urtw5KzvI0z\n5Xqp6eV17bShfDQuU/61S76F2PYen/VvtUz5S2PnXa3vhf4ffiVaOU9v5lueaas7bfe21pLSJnBb\nZ7+r9XLsqqJtSXO+Vd6pK/69G+6Wx1/HTLnS545zXVRRsvjTkjO+kvGZb82UaxvAhGSRtwz5S8eX\nNAt8xZeaFS7KPAltA5iXulT2uepmtsbUI1FBnkvz+CfnRvz9hw64errk8/OpTn882trlv5d2dfnj\n19XMjKtHSv47WN+7Scmgv3D5tKuz2aX1ObLTr+tq5zVoi8P6dW3LMub6RYCWVC9D/sGnPr7m68CZ\ncgAAACBmDMoBAACAmDEoBwAAAGK2aTPlz4yfsS0f/ofX6z//rl9wy4/KJYNbOWNe3Z/VzKyv3deF\ngs/ilSPft3ymIv2w5fLF+YLPbZbKPuu3vune1qb9qpfn+2uWLketl5HWPOzWW1rDWzcvmdPR9HTN\nOivrq0lLzVlrj+fnLp+6/vP2Xumdv86Zcs0eJ+XS8u1B5hLI56752GnJx47JezeV9dnFzqprFaTW\nse93qyuWfC760sQVWe6PXbrD6f6q/a21kfkroz7731bWftX+9uXgj7UZmTcxMjnm6h29Q67ubWKm\nPFeuPZfo2Ylzri7K9S1emr7k6tds9bntspzC65Xvqd19w64+PzPq6inJqKfle2qq4OcLPDf5qqt7\nqp5vV3GHW9bd6b8T69F+9Vp3yvEnUfQvXjPlFal1jozWOan1+dAaHn/xiXV/Ts6UAwAAADFjUA4A\nAADEjEE5AAAAELNNmylXmg167KFHY1qT+rRP+X17jrn6Str35p2STHlJEm7zZd8rV7OG6bzPQeaL\n/vbVeVez27tvuWaP69WaKe+oyg7q+9oTc19y3S6evPicq2eKPhOqmXF9tZqzrJWhzxZ8xnLIt0Be\nc0nJGpclI96X9JnVK0WfCS/La5+WeRzjJb+PXpRs9K6B9Z5BsDFo9jZX8MemrNSa+W6X804pqSsy\nf2Yg4ffBqOK3Yp1CovuAbgdT0vd4LXXJ8eNc1l9/okuON0WZQ7K71/ds1zkm87L/DqZ6XF3v+ho9\nkhkvyHubl31uquyf/4XZpZ7RRwo+7z5Y6nV1vb7l2ov/8K79rh6T71g9e6nbWaTfuTK34IXLZ1y9\ns9fn78mUt6ZHTjzsah1HVs9VfMun3mDPXP7aqp+TM+UAAABAzBiUAwAAADFjUA4AAADE7LbJlGs2\nqJVpj+Zlfcql1h7KpcjnGrV/7cX5SVeHyOfjOjok69zps4G3U6Zcc5ia++5v9+9NJj/ras33d1Q9\n3v177nTLNJO5WssyoZIZ1+U6V2FE6quSCW2U9kWu7u29PJ++vpLSL/rA9r2u/vqU71+tfYpN9rm8\n+XzsrPRo7+v110WonsdBn/IlBckZX837jHYx8n3MVWeiXWqfJR7u8p9DVPbbaJ/07h4ryVwCOXZW\nEr4+vNNnn3U7a6ZuOVY9cpf/ztP9+2Cffy/02BZV/DZ9Yfyyq3d1+57rw32+3iLX/pjO+uNHQs4J\njlX8vItcxX9vTVZ99q+M+h7mQ93+uQYazJR3LqtlHpVMJlg2t0D2/1nJ39frU27WOtdJuZ3p9Wr0\nejbrMReRM+UAAABAzBiUAwAAADFjUA4AAADEbNNmyu/ddsie/NH/dr2elH6xmh1aT7ou9bRJfq1d\nAm1dwWe8C5H0f5Vs3qs5nynX3POugu+ZXK74XGcrafS9bPRz12zh3bsPu/rCvO8FPFbw6xMkKl3d\nS1gznN11+pQ3mhHXXrmfu/gNub30DZda7y8R0+W56jrKsl1O5ZcypGlZd81g6jyLZtOMqT7fgPRc\n1nkcZcmUakI+G/l98NSoz6jvrupbrPnWej2XN5tSeSknrtnbabkmgx7bInnnOyRnfWR4j6sHJItc\nkdNUmtPuyvrPomL++dvaElL7B0yGtZuPo8e2vT2+7/g7d7/O1U9PyjwJ+aLJlf17r9ev0O+FXpl7\nNNDpe4cPdfi+5oWcnw/QEfn3Jh3556u+TsKZWd/n/67cQVf3yXPp51BPQvbvtht0Kq+m+7t+p2qt\nx8I4rfV36EYWx2vlTDkAAAAQMwblAAAAQMwYlAMAAAAx27SZcrXW2aBauazJrF82Ibd9/MUnXK09\n1bdKPm5bl+9TPpryy9P5GVfnJb82E/nscGfZ91DOSI6zUPLZvo6yz7yuZ99yfZ9PTvneufXeS+07\nWm+70Gxxj/QS17pNsoZB6nJxKYM6Jn2Dlfbu1gz55y8+72rtjauZ8Iwul7qeRjPkqiyvZ7YqI/rs\n5VNu2fZe3/N4rTPlKimZ0uGkz8v2Bb8+BfPvdanOZ/fq7Lirv3L+hes/v26/71+vuef1fi/WW3V2\n+crkmFtWLPoMd1HeZ72uwNaeQVcf2Ob3f81Bp+Vz6k76xxtO+NvnpW95qeRz0mOTfs7Jgb7trk4m\n17BvufRk75HXosszMu9Bpkksy+urlMyFOLRzn6unMv69yst7lZbnz1f88uq+5XNybBuf9fOktsnn\nrnMLlB6ntS+5ZswTdY6GZcmQT1dysty/l+uZ617v71A0hjPlAAAAQMwYlAMAAAAxY1AOAAAAxOy2\nyZQ3WyO5rDfuvHPFZTeiy//vB9/n6uM7jrr67IzP07XlZ2s+vubZMmWfGdes89j0hKu7O3ymfS0z\n5fXe5w8+9fGa99f38rGHHl3V+mj2sN2kL/GyTLk3W1jKUf/t2af9fVN+d9RMp+aStbd3oxnx1VqW\nqpSm7CHSXr5+eaEqd6n5+bh1y1yBLZ39rt7e5TOr+ZxkyMv+syhEvqfzq3m/jxUmlpbnJEv7liP3\nubrRTPlG60Ocq8qUX037+TG5Ul5v7mjv/zfvv9vV/TI/JyF9xfVaAQd6trl6Puvn30xU/D6Yk17e\n2mdd666O2tcmWEuRXkShzi5Ybw9NST/9gS7pmz6ww9VJOXaW0jL3KSf7kC3tI5OFebfs8ozP7u8b\n3ulq7fW/vG+5f3V6HO9J+rx8W1nuL2+O9iHXeizrt+uR7LSrG8l119tfW+07FLVxphwAAACIGYNy\nAAAAIGYMygEAAICYkSm/SavJZX1x5GVXb6mTAdP8WIdkSMtln0/rlBxkUv5fK5jPs6rq/q9mZhfS\nPkN+KL/L1aWyz7xqf9q1VC+Pr/S9bDZpZ2tJySJmJWw4VUxf/3mi6HORNu/v6z/l1fcJV/p4vSk/\nV6BeT/asZNhLBb8dTRd8/raor6jqrTm0bW+dtV1fHZIhvWefn8fRKftk++hpV7+SGXW1zttIS305\nt5Qp7Z7zjz2R8XNENO+u67LR+xCXKkvHq4Ica/JSa7/oQcmMD6Z8X3HdhpW+t8d2HnD1VN7vs+fy\nfj5PSeYOXJ7zWef5vM+ga6ZcP8tmCsty07XpnJZiqViz1u+FDvleOLxrv6srFcmQl/zxoqPo512k\nq3rUZ+TaGefT/n0+Ouf3mUHJt2umXL/DOlO+7m33x8ZUwd9fr2ugGfLxnF+fk1OXXP37Dc4zW02u\nu9W+Q+FxphwAAACIGYNyAAAAIGYMygEAAICYrUmmPITwPWb2e4vlD0RR9JEb3Obvm9lPmdl9ZpYw\ns2+Y2X+Jouh312Kdmq2RXNYH7nuPq7945SVXN5rpjCRT3tNeOwucyfusn/YpL0hf5NmKzwpnSr4u\nl31uslzxtfb+bSZ9r9Y7H6u9tisSvNTctPb2re7Hrcs0473aDLk+vvYl1jzusORvv/Xg/a7e1ut7\nc0/M+167nzn7dVfPFX1+thRpD/el+sy4z1gekc9tvWkeNinb9JHt+1w9m/VZ46uSIc2Wff522T5Y\nlUGdkiz+i5fPuHpbj/8cNK++0fsQJ6ryvro/FYKv29v8V9ju5ICrO9p8f+p6tNd2clntn0/3f52f\nMy0Z9K+e/4ar3yw96HU7SyZu/Su6K+Xz6drfXmv9ntDe+jP5tKvPjF5wtc596u7sktp/Lx3ctcfV\ns2X/+F3pK66uPnoUIr+uc3m/z0xKH/AduaGa66ZzSE7sPeJqfe17yn4fTGfGXV2S7TZb8P3pP/Ls\nX7paj9WdcvxpZq477u9Q1Nb0M+UhhH1m9iEzm69xmx81sz8zs7vN7ONm9ttmttvMPhZC+JVmrxMA\nAADQypo6KA8hBDP7qJlNmNlvrXCbO8zsV8xs0sweiKLoR6Io+udm9lozO21mPxlC+OZmrhcAAADQ\nypp9pvwDZvawmX2fmaVXuM0/NbMOM/twFEXnrv0yiqIpM/t3i+UPNnm9AAAAgJbVtEx5COGEmf0H\nM/v1KIqeDCGsFIK69vu/vMGyv5DbtKxGclnal/xdhx6o+dj1Mltdkhm/b4/voXwl7XvnThT8/x9J\ntHhZP2zNRc5Jb92JWf/4ndJrt5mZcn0vNN9WL//a7Pzbsvcqqp3X16ygVeWqm913vFe2C+25rMvb\nZA0O9Gx1tea6Ncs80O4z6C+OnXP1jGSjC1JniktzFbTnuWYwh/xTrTnt9a3y8rn3d/r+2NrzPVny\nab6y5HWr5xqkJYs/m/P773xO+jl3+Czvhu9DXLXTDHT6D74g11zQs0oD8r4n6px3Sst2Ny/v/Yj0\nGT85M+LXR7aDkvSnvpifdvWg7DOvjvm5FD37/PLVZMq15/lrd/vviZNzPrOt1xXQTPmZjL9+RX9S\ntvHLfl1P7Pe57F75LLUell7iffJZpqqu66DrNlf2x4uLk/61pWTe1OHdh1zdLf3t+7t6XX3vvjtd\nPXnK75PtWf+dp98L1cc6M7P7B+5w9WjJH29+5AE/D201ue5W+w5FbU0ZlIcQkmb2+2b2qpn9TJ2b\nH1/89xVdEEXRSAghbWZ7QwjdURRl9DbyvF9dYdGdK/weAAAAaDnNOlP+r22hi8qboyjK1rnttenx\nMyssnzGznsXb1RyUAwAAAJvBqgflIYQ32MLZ8f8niqIvrH6Vrv9Nfdlf/lUURa9fYZ2+amb332gZ\nAAAA0GpWNSiviq28YmY/f5N3mzGzrbZwJnziBsv7F/+dvcGy2Kwml9XsTFa3ZAV7JHunWbwOyVVq\nD1XNQefKPg93dnbU1fsHtvvHK/nbtycb6w3ciPjzbXUy42v2TMsz6Jpb3imZ72875P+ftVf62Qd5\nxHqZdNXT7pc/uPeEq6+kp1w9WfR/+Kp+fcv7u6/lO7ucZsi117fmtP/R0W9x9dCAf+/3pn0+Px35\nXuJXpX91vqqPeUbyqFfzft3OjF109Y4t21z93iNvdvWnTn3O1a3eh7hctS1M5bVfgFwnQJaemxtz\n9a75Ha6eKfs/5KYl6/uFiy+6elS24YLMdcjL/JtStHL/+YVa5xKsHe1Drtev2Nnht9mRtM+/52Vd\ns9IPfyzj/9i9rds/XrHo3xuTw4nm5XcO+++VA1N+HxrLLw0JiiX/Oeq6Tcn+PDrnj3WRnxpgx/Yc\nc3WfZMo1n6+1Hpv1+NUtfdD3dm9x9fcdfaerdw76197MfTLu/Ru1rbb7Sq+ZHTOzE2aWCyFE1/4z\ns3+zeJvfXvzdry3WLy/+e0wey0IIu2whunKxXp4cAAAA2CxWG1/Jm9n/u8Ky+20hZ/45WxiIX4u2\nPGFmbzKzd1b97pp3Vd0GAAAAuC2salC+OKnzn91oWQjhMVsYlP9uFEUfqVr0UTP7aTP70RDCR6/1\nKg8hDNlS55YbXngIAAAA2Iya1qf8ZkVRdDaE8C/M7DfM7CshhE+aWcHM3mtme615E0bXVCvlsjQ7\nqNnhoZTPx2XzPgu4PFPus4BTJZ8kmitoNnh9879x0t7encH3p9Vs4fKs4coq2kBebh0kbTaY8n1+\ntf/9ocFdrtYM+mot64MuGXPNsAaJB1dnh9MFnxGd177lRZ/l1W2+UfUy5B986uM17//Jk3/n6n/5\nwPtc/U0HXuPq7kt+fb88etLVV6r2Oc0dX8j7XHPn1AVXhza/lR3ZdcDVG60PcaGqp/RE0W80eZnv\nos7n/DUUxk7/b1frdpOW7WpetkPtY15/Folkl+XmBTkgbB3y2eL25Np9JWvP9mSQWpZrT/iy5OOL\n0vs70oR8nQsxJBL+2DnQ6b+n9g76jPkrVX3V52UuQEn2mRH5jgsVOZYmfMZ7v2wHminX17Jw8fKV\nl9ej+9yQ1K22T2L9rPug3MwsiqIPhRDOmdlPmdn32kK2/QUz+7koin43jnUCAAAA4rJmg/Ioih4z\ns8dqLP8zM/uztXp+AAAAYKNYbfcVAAAAAKsUS3wFzaXZ3vuk5+pI2ucs2/K+BbzG4SqSm9QesHOS\ns8xI794OyW1qdnAjW5ajlpy25rzHpB91df5e3/d+mQugmWx9rn09vpftzp7hmrdff/IKI8nbVr0X\nEwX/Pj1/+ZSrt/f6HsirzZQr7UNej/b67kr59enq8JnUoQ6/XfRK3VHVPzsrva/ny37/GpP996He\nflf3Jf1209fZY60sX/THl0xVvjezLDtcO7c8LfNdJmT/W5YFVk2eHqM57OW7hP9FW1i/82T6TuhR\nut73gn4WeelLXiz5uiB1Sq5nobX26h4aW9qOZ6R/fTbyjz0j+0y3+bkCvVm/nWQLfhvUdV0+Vyg0\ntlyOfRWdbHAbzctCbZwpBwAAAGLGoBwAAACIGYNyAAAAIGZkyjcBzddqvlX7lrdLblGzgdq3PCN9\ny8/NjLp6d6/PMmuGdTNlyjvlvX7t7iOuPjc37uoJyT5W5zKTkjvsCX53fPveu129vWeoZq0Z9FZX\nvZ2lJTusfYizMm9hyEeyV00z4pox1+VHh3a7WvsKayZ1/9Y9rh6Z973HJ3JLOfG85GM1flqSftCj\n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\nlV7ezbbarKLm7UdzS/X+oZ1umWaJq3uam5lNFfx7MVXUPr/+vSmY366WdViWwOysZEQ/ffoLrj7c\n7fuYz0vGdEbXTzOrZZ+FLkRL66f7U0j4dT8n+dT+qz4vez591eLUVvbv7vMjp1w9LvvImPQtr/50\nepJ+LsFZee2JtM906xwR3WbXOg+byfvtYDzvs8UjOb8P5KSHuxV97rqtOrPe4/eJ3jnft3y1ptKa\ng/bzIvRzKkZ+u8wn/DbdFfnPJhfk9t3+e6VnvvbrWc38n+mMPx5MFX1G+4ocawvy2rTWeRynzW+X\nenzZ27NVlvtb9AY/p+Zw7w5Xv+GO17i6uk85GfDNhTPlAAAAQMwYlAMAAAAxY1AOAAAAxIxMOZbR\nftc90m96sMNn/9J5yYRKoK5Q1W97ruJzhxnpM1yW3tyaMU8kVteTWfN1q82oq4vTPod5bvySqyey\nS7nNqbLPLWsf4JRk+ff0+P7Ubz14n6u39Qw2sqoNW21P90wht+Kyl6d8H2/tcV7vsXLms7jtKZ/R\nLBT9dqT31z7DY5HfiF8Nfrt7zs66WucDlCTDXo5q9/Kvvr/mqKVFu53J+cz42EWfV08l/Wtfb7MZ\nn9ftCz4L/fTkOVdnI5+rru71/fLsZbfs7PPjrr6U9n2/NV/7ePYJVx+R/vbNNivXYRiV6xSMpiW7\nLMe3q20+cz5R1a/6XNHPxxno7r3l9bwRvebClbxfV50nMS3zJDRnfTXjvxd25n3P9ldy/rPs7equ\nuX6rmdOifcufv/CKq8e6/Pt+Puu3q3TFb6O6f+u1OwaT/rUU5fRnUt6rwTa/jxzu93Ns7t160NU7\nB3xGHZsHZ8oBAACAmDEoBwAAAGLGoBwAAACIGZlyLNMled579xxz9WXJSSakF69P95rlykt5vpmC\n7+M7Jf2kx6Z9XnbvNp8BXW2mfK1pj+nehM8KDqSW8viJSMLCokMy5Xf0+96192w94OoDgz6HuFpr\n3dN9PWmP9Celf/yk9M4umO8hn438Vl2ukQlfENWolmuvOj+yvcPnot+4w+9/B7btcXWqvfZ2tN6y\nks//w5c/5+oHdx939bzcvrcqU35i63637BMvf7ahdXnkLr/NrnXP5qmMPxZ+5uzXXZ2o+O0kJ9tV\nSrLJe7u3XP/5zXe81i3busZzSK7KPvM/z37N1SNpn3HX6y50t/nt8kj3dle/bp/fDvq6/Fylnb1+\nDk11/+1GP0fNlN854L9Xnjr9rKsHZ/26nJJ5HHn5luuUz63L/LyOtHzOJTm+6JyTVqbfC/XQJ70x\nnCkHAAAAYsagHAAAAIgZg3IAAAAgZmTKsUxXe0fNujfl65T8v1264vN7c8WlHPnZ6RG3bCD43OGO\nbt/LdlfZ56gbVSprwr22ZKK5u0Rb8BnS9qrsYTDf+1Z7V2utvbTT0ms7I8u133yj1rqn+3rSTHk+\n5+c2jMhchvmSfy8npEdzriIZUcnTaoq8EnydCn47G6qaa3Cib5db9sCujZUp18zpoUH/ejRDrtci\nGK36LPZt8fMkjm/Z5+rHX/R9yB854TPkR6Uv+VrnW0dmZDua9hnzZyvnXD1Z9tuh7vN7+pf6Ud+9\nxnNI1AW55sLopO8rHpVrz7voT/jjz55unxHfHrpcfWLbYVd3d/rlq9Eh+8hAt98OHrjjLldPv+L3\n966CzDmRbbYk+3cm0mO7Fy2bc9LYHJT1pPvzySl/7YBW2wc3Os6UAwAAADFjUA4AAADEjEE5AAAA\nELOmBmhDCN9iZj9uZg+Z2bCZTZrZc2b2a1EU/bnc9iEz+zkz+yYz6zSzU2b2O2b2oSiKfGALsdJs\ncm/KZ/16kj5jfinr87vPT5y//nNC+jl/beqsq9+67x5X18vWaf9ZlZW+6HPzPhs42Ocz7F3y2pLJ\nxnaRLsnb63vXXbV8Np93y+plyivSy/bFsfOuvmNobTOmG5l+Dm89+DpXT0p/6TOjF1ydle1sTHrz\nj+Qkc1qS7VI+u/6kX5+7Bvde/3m35Kg7urtdPVPIuHpbi2XK681FUNmi3w+OSAa12rayf18fe+jR\nhtZlrfXIdrZdeokfqvh8fSLne33PyfGqun/1erey1mN1Uq6boMuVHq8y8tr02F0s+Ry2WfMy5Uoz\n5oOSMT+6Za+rL+b8tTnmc37dy8tS4ybLa394OudEM+brqV6G/INPfbzm/TVjXm8fhde0QXkI4efM\n7BfM7KqZ/XczGzGzrWZ2n5m9zcz+vOq27zGzT5tZzsw+aQuD939gZr9qZm8ys/c1a70AAACAVteU\nQXkI4X22MCD/X2b2nVEUzcny9qqf+83st82sbGZvi6LoK4u//3kze8LM3htCeH8URZ9oxroBAAAA\nrW7VmfIQQpuZ/bKZZczsu3VAbmYWRa4/0HvNbJuZfeLagHzxNjlbiLOYmf3QatcLAAAA2Ciacab8\n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\ntSigpEWCBUpLhdZwiJZWoN4Fm8TktKEEAgmX3BH49Y/33ZzJsPc+2Ztz9nv27Oez1l6TPfPOPjNP\n3tnzzux3ZtwoNzMzMzMrzI1yMzMzM7PC3Cg3MzMzMyvMjXIzMzMzs8J8n3IzMzOzEbR+64aeyvue\n6dPLZ8rNzMzMzApzo9zMzMzMrDA3ys3MzMzMCnOfcjMzM7MRUO9DvvzBe7Z7v+iuJdu9/+15r9zu\n/dy9fnG79+5jPrV8ptzMzMzMrDA3ys3MzMzMCnOj3MzMzMysMPcpNzMzMxsB9T7gr//6uV3LL7rz\n5u3erzv9qilfJpvgM+VmZmZmZoW5UW5mZmZmVpgiovQyTDlJ62bPnr33YYfNK70oZmZmZjPSD+5f\n2VP5X9334GlakuG2bNldbNmyZX1E7PN0PqepjfJVwBxgtzzqpwUXZ1j9Uh46u945u/44t/45u/45\nu/45u/44t/7N1OwOBB6JiIOezoc0slHeIum/ACLiRaWXZdg4u/45u/44t/45u/45u/45u/44t/41\nPTv3KTczMzMzK8yNcjMzMzOzwtwoNzMzMzMrzI1yMzMzM7PC3Cg3MzMzMyus0XdfMTMzMzMbBj5T\nbmZmZmZWmBvlZmZmZmaFuVFuZmZmZlaYG+VmZmZmZoW5UW5mZmZmVpgb5WZmZmZmhblRbmZmZmZW\nmBvlZmZmZmaFNbJRLukASV+WdI+kbZLGJV0oaa/Sy1aSpH0knSLpGkkrJG2R9LCkb0v6fUlt64Ok\n+ZJukLRe0mZJP5R0lqSdBr0OM42kkyRFfp3SoczxksZy1hslfUfSwkEv60wg6RWSvi5pTd4210i6\nSdLr25R1vcskvSHndHfebldKWizppR3Kj0x2khZI+oykb0l6JG+LV0wyT8/5NHE77iU7SXMlnSNp\niaTVkh6VdJ+k6yQdO8nfWSjptpzbwznH46dnraZfP3WuNv+XKvuNQzuU2SnXyR/mbX59rrPzp25N\nBq/P7VW5Do3lHLZIWiXpKkmHdZhnOOtcRDTqBRwC3AcEcC1wPrAkv/8psE/pZSyYzWk5h3uARcBH\ngS8DD+XxV5Of8lqZ583AY8BG4EvAJ3KOASwuvU6F83xezm5DzuOUNmVOz9MeAD4LfApYncddUHod\nBpzXB/N63w9cCnwE+CJwO/DxWlnXu4ksPlapQ5fk77SrgUeBJ4B3jXJ2wPfzum0A7sr/vqJL+Z7z\n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\n+t4LPLc27XU5uy3kJxWPenbs2MODespnVLbjHchuFvDPucwltHmQS5t5hvpBLlORW5f5xnh6Dw+a\nU3rdB1DndiVd0PkE8JratA/leceaVOeUF7Yx8s3mbyVdtXsd6bZWv056itQyYH50uUdok0laSLpY\n7HHgM7TvVzUeSF6X6wAAAlpJREFUEZdV5jmBdGZkK+kpZOtJt2J7QR7/1mhaJeqRpPNIXVhOjYhL\natPOAD5N+jL4GumM5gLgANIFo38y2KUtQ9J+pB3MoaR7795GejDOiaQv0HdGxOJKedc7nrxzw42k\nO9ZsAK4hNdDnkbq2CDgrIi6qzDNS2eX1bf30vz/wG6TuJ617PD9Q3c76yaep23Ev2Um6lPRUzweA\nz9H+YrmxiBir/Y1PAmeTLui+mtTQehvp9nZnRMTFU7dGg9FrnevwGWOkLixzI2JFbZpIffUXkG7C\ncD0pr7eRDiDfEhHXTcnKDFgf2+vLgZtI9eYa4H9IBydHkQ6wXx4R23VHGeo6V/qoYDpewPOAS0lX\n7D5K+k+8iEnODDf9xcQZ3W6vsTbzvYz84BfSWbkfka4o36n0Os2EFx3OlFemvxG4hdSo2kR6OtnC\n0stdIKe9Sb9Yrcrb5TrSgfNLOpR3vUs57AKcRep29wipK9Ba4J+A40Y9ux34XhufinyauB33kh0T\nZ3a7vc7r8HcW5rw25fxuAY4vvf6DrHNtPqOV51POlOfpO+c6+aNcRx/MdXZ+6fUfdHbAL5MOhtfm\nfcdq4AvAAV3+zlDWucadKTczMzMzGzZNu9DTzMzMzGzouFFuZmZmZlaYG+VmZmZmZoW5UW5mZmZm\nVpgb5WZmZmZmhblRbmZmZmZWmBvlZmZmZmaFuVFuZmZmZlaYG+VmZmZmZoW5UW5mZmZmVpgb5WZm\nZmZmhblRbmZmZmZWmBvlZmZmZmaFuVFuZmZmZlaYG+VmZmZmZoW5UW5mZmZmVtj/A+07+TBjbSJb\nAAAAAElFTkSuQmCC\n", 28 | "text/plain": [ 29 | "" 30 | ] 31 | }, 32 | "metadata": { 33 | "image/png": { 34 | "height": 203, 35 | "width": 370 36 | } 37 | }, 38 | "output_type": "display_data" 39 | } 40 | ], 41 | "source": [ 42 | "#https://zhuanlan.zhihu.com/p/26078299\n", 43 | "from captcha.image import ImageCaptcha\n", 44 | "import matplotlib.pyplot as plt\n", 45 | "import numpy as np\n", 46 | "import random\n", 47 | "\n", 48 | "%matplotlib inline\n", 49 | "%config InlineBackend.figure_format = 'retina'\n", 50 | "\n", 51 | "import string\n", 52 | "characters = string.digits + string.ascii_uppercase\n", 53 | "print(characters)\n", 54 | "\n", 55 | "width, height, n_len, n_class = 170, 80, 4, len(characters)\n", 56 | "\n", 57 | "generator = ImageCaptcha(width=width, height=height)\n", 58 | "random_str = ''.join([random.choice(characters) for j in range(5)])\n", 59 | "img = generator.generate_image(random_str)\n", 60 | "\n", 61 | "plt.imshow(img)\n", 62 | "plt.title(random_str)" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 14, 68 | "metadata": {}, 69 | "outputs": [ 70 | { 71 | "data": { 72 | "text/plain": [ 73 | "Text(0.5,1,'0BCB')" 74 | ] 75 | }, 76 | "execution_count": 14, 77 | "metadata": {}, 78 | "output_type": "execute_result" 79 | }, 80 | { 81 | "data": { 82 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAuUAAAGXCAYAAAAUOC6pAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAWJQAAFiUBSVIk8AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3Xl0ZGla3/nnjV1LSMpFuVRVVmZW\nVdbetKu6u3oDesHG2AU2ZpnTMx57DjYc24ONMbRnbBYP3rEHD9DNMfaBoRt7xtMYPOChAWO7u6EN\nDVR3VW+VtWTlWllVWbkpUwpJscc7f0iZEb8npAgpFdINSd/POXmkJ++NiBs37r26uvq9zw0xRgMA\nAACQnFTSCwAAAADsdpyUAwAAAAnjpBwAAABIGCflAAAAQMI4KQcAAAASxkk5AAAAkDBOygEAAICE\ncVIOAAAAJIyTcgAAACBhnJQDAAAACeOkHAAAAEgYJ+UAAABAwjgpBwAAABLGSTkAAACQME7KAWCI\nhRAOhRB+OoRwJoRQCSFcDiH8egjhG1aZ//0hhLjKv4UQwoshhJ8NITy8xtffE0L4cAjhv4QQXlte\nhlII4VQI4f8OIXxrCCGzwuNWW4ZKCOFCCOGXQwh/YqPrBwB2ihBjTHoZAAArCCF8jZl92sz2Lf/X\nnJmN29IFlWhmPxRj/HH3mPeb2WeWy2tm1lz+PrX8PLcuxtTM7EMxxl/t8frfbWY/YWaTHf89Z2YZ\nMxvt+L9TZvadMcavdDw2dsxf7ph3j5nlOuqfiDH+7dWWAQB2C66UA8AQCiGMmNn/Z0sn0l80s8dj\njJO2dFL7L8wsmNk/DSF8Y4+neUeM8dDyvwNmljezb7Clk+icmX0shFBc5fV/1Mx+zpZOyJ8xs28z\ns4kY42SMcczMDpjZX1xetgfN7MlVluFvdizDITMrmNljZvaby9M/HEL4ujWsEgDY0TgpB4Dh9FfM\n7KiZzZvZt8QYT5qZxRjnYowfNrNfW57vn671CWOMjRjjp83su5b/a9LMuk6IQwjfZGZ/f7n8eTN7\nd4zxV2OMpY7nuhpj/Ldm9jYz+5u2dOV9LcsQY4wvmNl3mtnN5f/+lrW+BwDYqTgpB4Dh9OeXv/67\nGOPrK0z/35e/PrnWfHiHr3R8P7bC9H9uS1fiv2hmfy3G2FrtiZZPsj9iZv/PehYgxrhoZmd6LAMA\n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\nN//5ki2dkF9ZZdZbLRS/aYVpX29mo2b2uX6dVwAAAICdYiDB5+Ub//wDM3vWzL5xhchKp18xs39m\nZh8KIXy04+ZBBTP7R8vz/OwglmuQBpkRX69axWXKX9NMeb3k8nIN15c8aLY3Nabz56c1nzd1oCj1\nyJhmUPtJZfT58pPtjGpqzOWeZ12m3P+e6HLK5jLnfWLSQ833FX7lMzo4oHRFM+b1Rf0cu0dd6Hpv\nRZ2/EXzmVNdlOug2HqL/nV3rjMugN9zjK2Vd/vlZnX9hrp2dHp3SbSybTW5/2woV99lfPn+9Pe2m\n+5zr7nNx6z2m3D6V0jxtZq8+3Yn36n0GRsa1X3UIfRrYY8t0/tzJjrkxH5Nuf9Y25hZb7jg/pmMF\nHnhKt4PJA6NSb3Scx2R6XOpaQ6+zPfquE1Kfek77mM+UtG95q6Ozcsp02XymPDOuNZlybBcb/skX\nQvifbOmEvGlm/83Mvm+Fg/r5GOPHzcxijHMhhO+xpZPz3wkhfMLMZmzprqAPLf//L210uQAAAIDt\nYhCXo44vf02b2fevMs/vmtnHbxUxxl8LIbzPzH7YzL7dzApmdtrMfsDMPhLjdr7+CQAAAKzPhk/K\nY4w/ZmY/dgeP+30z+9MbfX0AAABgu9vZwc1tqrqgWcGFGc3mLtzQrJ3Ve2dA66ZZvrG9mjm//8kj\nUufHN5YlLIxqRnW8Iy+cLehzV29q/jXnNsl0Spe1WdP8rO/33Ki7PO0QZ5N9n/LKvH7uPnMeXIi8\nFXVdtNL6fPkxXXcj45rbzk3qdlOd1SxzLOnj6wsu/x98H3OXeXX97Jsp3Q4vv3n59vd7Dus4hp2e\nKff7+NVTc7e/r8+7PKzp5+C13MCLMKHbweRRXbcTB8ak3m094rer6O9D4P6g7Ke33Hic/KjuU4VR\n/dwHvR1kMvp6h48clPrapetSd/0UK+jxL9XsOH41/R/TXR183WNBgSEy8D7lAAAAANaHk3IAAAAg\nYZyUAwAAAAnb2cHN7cJlA33e9PQfvCb14iXXx7jpPkaXn/M91ovT2o92Ylr7yeZHNpYtzOa1H+49\nJ9r9cK+8UpJprZwLPrq4fMrladNZfXOz1+aknj6ybz2Luul8brzWkRP3fcj9vF0Z0rTW2RHXN3xS\nP+c9x0ekPvqo9iXOFvRzmp9ZkPqlT12Uul5xn1VTP5uUy5hngz5/MH1/u0m1rPt0eVbz9eWbHdNr\n+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\nd+91wPfPwO7ULydeXXTjezp0Z8ZXn9fM7OhTB6TuN2ZtM3ClHAAAAEgYJ+UAAABAwjgpBwAAABK2\nfQO0W8z3/i2Ma9aoMKnTQ76dMW/VNMeUiq6fdHCZbdMMaPWGZgVf+PR5qUcP6vNdv3JN6ljX/Ors\nRc2/V27o8jVLri95U9+rb7Hse/PmpnR59j3Qzhre/cAhmVbcpznE5pQmGX2mq1d+zKw7Q9ZPvwx6\nP8OUUfc9kO97SnPXX7msmdLaos+U6+fYKGvmtOy2w5tX5vTxOd0wrp2ZlzrOuTxex3aZd9vMiQ/c\nLfW+Y0Wp/XrOjw4265d19yW46y7dbrN13Ueff03XbdPt41m3T7tIuaU6jgGtuj62ck23+auNktTz\nM1+V+uADU1Lf/xbNnBenBtzTfZ3qNc2E+n7anfznkNvknLIf75NO9e43nx3xfcnv6jl/V29/p1fm\n3N9Pwtezl3V/e/m/XZB64Yq+ttxLw8yspT+HYnDHB3dsvu+tul1tZQ92DK+NZMDXYj0/4/v1FR+m\nn9+3cKUcAAAASBgn5QAAAEDCOCkHAAAAEjbQwEwI4evM7PvN7D1mttfMZszsq2b2UzHG33TzvsfM\nfsTM3mVmBTM7bWa/YGYfjTFqmHUI5XI+06pZwOz+9ltYXNC3k21oDjHlMuWpqHVrTp+7EjQTXm9o\nZqvZ9JkuV1/W3GSs6maQCVr7frXRNGsYJrR+9H2aNZw+1s51Fdx6Sqd1XaQ1Yt6V6dI0bPd7y79D\n5x90Br1fn1OfYeuVSRt0ns1vgyNunENeW7Ba5aZ+srGmte9b3tTW3Hb+Re1bHqNuB61ruvyhrvtB\nZ362eGBUpu0/NiH1uOv/vNl8L+/CqI5tuH5J7xWQGXO9+11ev1XTOu3y+50Zc7//h6a7j8GcZoPr\ndXc8qGvD6YZ77be85zGptzxTXtfj1flXNPvc6rhPw/Gv0WPJZmfKu/rHd82g+0h2wk/V6T5DfvLT\n56Q+8vi01N257PYSVN2x5+wfviH1/DU3VmhB6+jvN+H275a7z0B2XKdPHNJxERNdfckHe68AJGOj\nmXD/+H4/Y9f7c65XTnwYM+LrNbAlDCH8iJn9QzO7ZmafNLNLZrbfzJ4ws/eb2W92zPtnzew/mFnF\nzH7Jlk7ev8XMftLM3mtm3zmo5QIAAACG3UBOykMI32lLJ+T/1cy+LcZYctOzHd9PmNnPmVnTzN4f\n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\n2zPzwq7y1jueGbnhCsqINWuBiykJ+j6Uri0BnJSZZ3StM1Wxq/vb+el/Z+DnKN1POmM839d9nA0T\nn0k9jgeJXUScTXmq533AX9L7ZrkVmbmi8Tc+ApxMuaH7Ikqi9RbK8HYnZOaZ87dHC2PQOtfnM1ZQ\nurAszcxbG8uCjPAr1wAAAX1JREFU0ld/OWUQhsso8XoL5QLyTZl56bzszAIb4nh9NXAlpd5cDHyP\ncnFyIOUC+9WZuUF3lLGuc21fFWyKF/AS4GzKHbtPUP4Tz2COluFJfzHTojvba0WP9V5FffALpVXu\nm5Q7yjdre59G4UWflvKu5W8ArqEkVesoTyc7qu3tbiFO21N+sbqtHpf3Uy6cX9GnvPWuxGEL4CRK\nt7uHKV2B7gG+CBw67bHbiO+11fMRn0k8jgeJHTMtu7O9Tu3zd46q8VpX43cNcFjb+7+Qda7HZ3Ti\n+ayW8rp881onv1nr6AO1zi5re/8XOnbAj1Muhu+p547bgU8Bu8zyd8ayzk1cS7kkSZI0bibtRk9J\nkiRp7JiUS5IkSS0zKZckSZJaZlIuSZIktcykXJIkSWqZSbkkSZLUMpNySZIkqWUm5ZIkSVLLTMol\nSZKklpmUS5IkSS0zKZckSZJaZlIuSZIktcykXJIkSWqZSbkkSZLUMpNySZIkqWUm5ZIkSVLL/h9Y\ngcOQSrbHMQAAAABJRU5ErkJggg==\n", 83 | "text/plain": [ 84 | "" 85 | ] 86 | }, 87 | "metadata": { 88 | "image/png": { 89 | "height": 203, 90 | "width": 370 91 | } 92 | }, 93 | "output_type": "display_data" 94 | } 95 | ], 96 | "source": [ 97 | "def gen(batch_size=32):\n", 98 | " X = np.zeros((batch_size, height, width, 3), dtype=np.uint8)\n", 99 | " y = [np.zeros((batch_size, n_class), dtype=np.uint8) for i in range(n_len)]\n", 100 | " generator = ImageCaptcha(width=width, height=height)\n", 101 | " while True:\n", 102 | " for i in range(batch_size):\n", 103 | " random_str = ''.join([random.choice(characters) for j in range(4)])\n", 104 | " X[i] = generator.generate_image(random_str)\n", 105 | " for j, ch in enumerate(random_str):\n", 106 | " y[j][i, :] = 0\n", 107 | " y[j][i, characters.find(ch)] = 1\n", 108 | " yield X, y\n", 109 | "def decode(y):\n", 110 | " y = np.argmax(np.array(y), axis=2)[:,0]\n", 111 | " return ''.join([characters[x] for x in y])\n", 112 | "\n", 113 | "X, y = next(gen(1))\n", 114 | "plt.imshow(X[0])\n", 115 | "plt.title(decode(y))" 116 | ] 117 | }, 118 | { 119 | "cell_type": "code", 120 | "execution_count": 21, 121 | "metadata": {}, 122 | "outputs": [ 123 | { 124 | "name": "stderr", 125 | "output_type": "stream", 126 | "text": [ 127 | "c:\\users\\wqw\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\ipykernel_launcher.py:7: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(32, (3, 3), activation=\"relu\")`\n", 128 | " import sys\n", 129 | "c:\\users\\wqw\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\ipykernel_launcher.py:8: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(32, (3, 3), activation=\"relu\")`\n", 130 | " \n", 131 | "c:\\users\\wqw\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\ipykernel_launcher.py:7: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(64, (3, 3), activation=\"relu\")`\n", 132 | " import sys\n", 133 | "c:\\users\\wqw\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\ipykernel_launcher.py:8: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(64, (3, 3), activation=\"relu\")`\n", 134 | " \n", 135 | "c:\\users\\wqw\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\ipykernel_launcher.py:7: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(128, (3, 3), activation=\"relu\")`\n", 136 | " import sys\n", 137 | "c:\\users\\wqw\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\ipykernel_launcher.py:8: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(128, (3, 3), activation=\"relu\")`\n", 138 | " \n", 139 | "c:\\users\\wqw\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\ipykernel_launcher.py:7: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(256, (3, 3), activation=\"relu\")`\n", 140 | " import sys\n", 141 | "c:\\users\\wqw\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\ipykernel_launcher.py:8: UserWarning: Update your `Conv2D` call to the Keras 2 API: `Conv2D(256, (3, 3), activation=\"relu\")`\n", 142 | " \n", 143 | "c:\\users\\wqw\\appdata\\local\\programs\\python\\python36\\lib\\site-packages\\ipykernel_launcher.py:14: UserWarning: Update your `Model` call to the Keras 2 API: `Model(inputs=Tensor(\"in..., outputs=[\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mkeras\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mutils\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvisualize_util\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mplot\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 2\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mIPython\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdisplay\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mImage\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mmodel\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mto_file\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"model.png\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mshow_shapes\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mImage\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'model.png'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", 179 | "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'keras.utils.visualize_util'" 180 | ] 181 | } 182 | ], 183 | "source": [ 184 | "from keras.utils.visualize_util import plot\n", 185 | "from IPython.display import Image\n", 186 | "\n", 187 | "plot(model, to_file=\"model.png\", show_shapes=True)\n", 188 | "Image('model.png')" 189 | ] 190 | }, 191 | { 192 | "cell_type": "code", 193 | "execution_count": 23, 194 | "metadata": {}, 195 | "outputs": [ 196 | { 197 | "ename": "ModuleNotFoundError", 198 | "evalue": "No module named 'keras.utils.visualize_util'", 199 | "output_type": "error", 200 | "traceback": [ 201 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 202 | "\u001b[1;31mModuleNotFoundError\u001b[0m Traceback (most recent call last)", 203 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mfrom\u001b[0m \u001b[0mkeras\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmodels\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[1;33m*\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[1;32mfrom\u001b[0m \u001b[0mkeras\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mutils\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvisualize_util\u001b[0m \u001b[1;32mimport\u001b[0m \u001b[0mplot\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", 204 | "\u001b[1;31mModuleNotFoundError\u001b[0m: No module named 'keras.utils.visualize_util'" 205 | ] 206 | } 207 | ], 208 | "source": [ 209 | "from keras.models import *\n", 210 | "from keras.utils.visualize_util import plot" 211 | ] 212 | } 213 | ], 214 | "metadata": { 215 | "kernelspec": { 216 | "display_name": "Python 3", 217 | "language": "python", 218 | "name": "python3" 219 | }, 220 | "language_info": { 221 | "codemirror_mode": { 222 | "name": "ipython", 223 | "version": 3 224 | }, 225 | "file_extension": ".py", 226 | "mimetype": "text/x-python", 227 | "name": "python", 228 | "nbconvert_exporter": "python", 229 | "pygments_lexer": "ipython3", 230 | "version": "3.6.3" 231 | } 232 | }, 233 | "nbformat": 4, 234 | "nbformat_minor": 2 235 | } 236 | -------------------------------------------------------------------------------- /courses/chapter_8/sklearn.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# sklearn学习笔记\n", 8 | "- 代码实战\n", 9 | "\n", 10 | "## 统计信息\n", 11 | "- 两大类:定性分析和定量分析\n", 12 | "- 最大、最小、均值、标准差、方差、极差、中位数\n", 13 | "---\n", 14 | "其他\n" 15 | ] 16 | }, 17 | { 18 | "cell_type": "code", 19 | "execution_count": 4, 20 | "metadata": {}, 21 | "outputs": [ 22 | { 23 | "name": "stdout", 24 | "output_type": "stream", 25 | "text": [ 26 | "array([3, 2, 3, 4, 4, 1, 2, 4, 4, 3])\n", 27 | "[1, 5, 8, 2, 4, 1]\n", 28 | "均值:3.5,最小值:1,最大值:8,方差:6.25,标准差:2.5,中位数:3.0,极差:7\n", 29 | "7.5 1.0\n" 30 | ] 31 | } 32 | ], 33 | "source": [ 34 | "import numpy as np\n", 35 | "import sklearn as sk\n", 36 | "data = np.random.normal(1,5,10) # 正态分布\n", 37 | "data = np.random.randint(1,5,10) # 均匀分布\n", 38 | "print(repr(data))\n", 39 | "data = [1,5,8,2,4,1]\n", 40 | "print(data)\n", 41 | "# 各种统计指标\n", 42 | "print('均值:%s,最小值:%s,最大值:%s,方差:%s,标准差:%s,中位数:%s,极差:%s'%(np.mean(data),np.min(data),np.max(data),np.var(data),np.std(data),np.median(data),np.ptp(data)))\n", 43 | "print(np.cov(data),np.corrcoef(data)) # 协方差,相关系数" 44 | ] 45 | }, 46 | { 47 | "cell_type": "markdown", 48 | "metadata": {}, 49 | "source": [ 50 | "## 加载数据集\n", 51 | "- 使用默认的iris数据集\n", 52 | "- 注意:内置数据集以bunch类型存在,包含data、target等成员" 53 | ] 54 | }, 55 | { 56 | "cell_type": "code", 57 | "execution_count": 5, 58 | "metadata": { 59 | "collapsed": true 60 | }, 61 | "outputs": [ 62 | { 63 | "data": { 64 | "text/plain": [ 65 | "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", 66 | " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", 67 | " 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", 68 | " 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n", 69 | " 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", 70 | " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n", 71 | " 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])" 72 | ] 73 | }, 74 | "execution_count": 5, 75 | "metadata": {}, 76 | "output_type": "execute_result" 77 | } 78 | ], 79 | "source": [ 80 | "from sklearn.datasets import load_iris\n", 81 | "iris = load_iris()#导入IRIS数据集,sklearn.utils.Bunch类型\n", 82 | "#data = sk.datasets.load_iris()\n", 83 | "iris.data#特征矩阵\n", 84 | "iris.target#目标向量" 85 | ] 86 | }, 87 | { 88 | "cell_type": "markdown", 89 | "metadata": {}, 90 | "source": [ 91 | "## 数据预处理\n", 92 | "- 消除量纲:针对列(特征),将各个特征调整为标准正态分布,具体方法:Z标准化、极差标准化\n", 93 | "- 规范化:针对行(样本),将每个样本的长度限定为单位向量\n", 94 | "- 连续特征离散化:二值化\n", 95 | "- 离散特征数值化:one-hot编码(哑编码)" 96 | ] 97 | }, 98 | { 99 | "cell_type": "code", 100 | "execution_count": 77, 101 | "metadata": {}, 102 | "outputs": [ 103 | { 104 | "name": "stdout", 105 | "output_type": "stream", 106 | "text": [ 107 | "[[-0.90068117 1.03205722 -1.3412724 -1.31297673]\n", 108 | " [-1.14301691 -0.1249576 -1.3412724 -1.31297673]\n", 109 | " [-1.38535265 0.33784833 -1.39813811 -1.31297673]\n", 110 | " [-1.50652052 0.10644536 -1.2844067 -1.31297673]\n", 111 | " [-1.02184904 1.26346019 -1.3412724 -1.31297673]]\n" 112 | ] 113 | } 114 | ], 115 | "source": [ 116 | "#预处理\n", 117 | "#dir(sk.preprocessing)\n", 118 | "new_data = sk.preprocessing.StandardScaler().fit_transform(iris.data)\n", 119 | "#除了Z标准化StandardScaler,还有其他标准化方法:MinMaxScaler极差标准化、规范化Normalizer\n", 120 | "#注:Z标准化只对列做处理(去量纲影响),而规范化将行处理为单位向量\n", 121 | "bin_data = sk.preprocessing.Binarizer(threshold=3).fit_transform(iris.data) # 二值化,阈值为3\n", 122 | "one_data = sk.preprocessing.OneHotEncoder().fit_transform(iris.target.reshape((-1,1))) # 独热编码\n", 123 | "print(new_data[:5])" 124 | ] 125 | }, 126 | { 127 | "cell_type": "code", 128 | "execution_count": 75, 129 | "metadata": {}, 130 | "outputs": [ 131 | { 132 | "name": "stdout", 133 | "output_type": "stream", 134 | "text": [ 135 | " (0, 1)\t1.0\n", 136 | " (1, 2)\t1.0\n", 137 | " (2, 0)\t1.0\n" 138 | ] 139 | } 140 | ], 141 | "source": [ 142 | "data = np.array([[1,'a',10],[2,'b',-10],[4,'D',20],[2,'Z',30]])\n", 143 | "data_y = np.array([i[0] for i in data])\n", 144 | "#one-hot编码,输入必须是array类型,而且是列向量(正整数),按照取值升序排列,输出三元组形式表示的对角矩阵\n", 145 | "one_data = sk.preprocessing.OneHotEncoder().fit_transform(data_y.reshape(-1,1))\n", 146 | "#print(one_data)\n", 147 | "test = np.array([2,7,1]).reshape(-1,1)\n", 148 | "out = sk.preprocessing.OneHotEncoder().fit_transform(test.reshape(-1,1))\n", 149 | "#out = sk.preprocessing.OneHotEncoder().fit_transform(iris.target.reshape(-1,1))\n", 150 | "print(out)" 151 | ] 152 | }, 153 | { 154 | "cell_type": "code", 155 | "execution_count": 86, 156 | "metadata": {}, 157 | "outputs": [ 158 | { 159 | "data": { 160 | "text/plain": [ 161 | "array([[ 2.25, -230. , 12.5 ],\n", 162 | " [ 1. , -200. , 10. ],\n", 163 | " [ 2. , -230. , -10. ],\n", 164 | " [ 4. , -300. , 20. ],\n", 165 | " [ 2. , -157. , 30. ]])" 166 | ] 167 | }, 168 | "execution_count": 86, 169 | "metadata": {}, 170 | "output_type": "execute_result" 171 | } 172 | ], 173 | "source": [ 174 | "data = np.array([[1,-200,10],[2,-230,-10],[4,-300,20],[2,-157,30]])\n", 175 | "# 默认用均值自动填充缺失值\n", 176 | "sk.preprocessing.Imputer().fit_transform(np.vstack((np.array([np.nan,-230,np.nan]),data)))" 177 | ] 178 | }, 179 | { 180 | "cell_type": "markdown", 181 | "metadata": {}, 182 | "source": [ 183 | "## 数据变换\n", 184 | "- 多项式、对数、指数\n", 185 | "- 也可以自定义函数" 186 | ] 187 | }, 188 | { 189 | "cell_type": "code", 190 | "execution_count": 89, 191 | "metadata": {}, 192 | "outputs": [ 193 | { 194 | "name": "stdout", 195 | "output_type": "stream", 196 | "text": [ 197 | "2.3978952728\n" 198 | ] 199 | } 200 | ], 201 | "source": [ 202 | "from sklearn.preprocessing import PolynomialFeatures\n", 203 | "#多项式转换,参数degree为度,默认值为2\n", 204 | "PolynomialFeatures().fit_transform(iris.data)\n", 205 | "print(np.log1p(10))\n", 206 | "# 也可以自定义\n", 207 | "from numpy import log1p # log(1+x)\n", 208 | "from sklearn.preprocessing import FunctionTransformer\n", 209 | "#自定义转换函数为对数函数的数据变换\n", 210 | "#第一个参数是单变元函数\n", 211 | "FunctionTransformer(log1p).fit_transform(iris.data)" 212 | ] 213 | }, 214 | { 215 | "cell_type": "markdown", 216 | "metadata": {}, 217 | "source": [ 218 | "## 特征选择\n", 219 | "从发散性和相关性两个维度来筛选特征,主要方法:\n", 220 | "- filter:过滤法\n", 221 | "- wrapper:包装法\n", 222 | "- embedded:嵌入法" 223 | ] 224 | }, 225 | { 226 | "cell_type": "code", 227 | "execution_count": 90, 228 | "metadata": { 229 | "collapsed": true 230 | }, 231 | "outputs": [ 232 | { 233 | "data": { 234 | "text/plain": [ 235 | "array([[ 1.4],\n", 236 | " [ 1.4],\n", 237 | " [ 1.3],\n", 238 | " [ 1.5],\n", 239 | " [ 1.4],\n", 240 | " [ 1.7],\n", 241 | " [ 1.4],\n", 242 | " [ 1.5],\n", 243 | " [ 1.4],\n", 244 | " [ 1.5],\n", 245 | " [ 1.5],\n", 246 | " [ 1.6],\n", 247 | " [ 1.4],\n", 248 | " [ 1.1],\n", 249 | " [ 1.2],\n", 250 | " [ 1.5],\n", 251 | " [ 1.3],\n", 252 | " [ 1.4],\n", 253 | " [ 1.7],\n", 254 | " [ 1.5],\n", 255 | " [ 1.7],\n", 256 | " [ 1.5],\n", 257 | " [ 1. ],\n", 258 | " [ 1.7],\n", 259 | " [ 1.9],\n", 260 | " [ 1.6],\n", 261 | " [ 1.6],\n", 262 | " [ 1.5],\n", 263 | " [ 1.4],\n", 264 | " [ 1.6],\n", 265 | " [ 1.6],\n", 266 | " [ 1.5],\n", 267 | " [ 1.5],\n", 268 | " [ 1.4],\n", 269 | " [ 1.5],\n", 270 | " [ 1.2],\n", 271 | " [ 1.3],\n", 272 | " [ 1.5],\n", 273 | " [ 1.3],\n", 274 | " [ 1.5],\n", 275 | " [ 1.3],\n", 276 | " [ 1.3],\n", 277 | " [ 1.3],\n", 278 | " [ 1.6],\n", 279 | " [ 1.9],\n", 280 | " [ 1.4],\n", 281 | " [ 1.6],\n", 282 | " [ 1.4],\n", 283 | " [ 1.5],\n", 284 | " [ 1.4],\n", 285 | " [ 4.7],\n", 286 | " [ 4.5],\n", 287 | " [ 4.9],\n", 288 | " [ 4. ],\n", 289 | " [ 4.6],\n", 290 | " [ 4.5],\n", 291 | " [ 4.7],\n", 292 | " [ 3.3],\n", 293 | " [ 4.6],\n", 294 | " [ 3.9],\n", 295 | " [ 3.5],\n", 296 | " [ 4.2],\n", 297 | " [ 4. ],\n", 298 | " [ 4.7],\n", 299 | " [ 3.6],\n", 300 | " [ 4.4],\n", 301 | " [ 4.5],\n", 302 | " [ 4.1],\n", 303 | " [ 4.5],\n", 304 | " [ 3.9],\n", 305 | " [ 4.8],\n", 306 | " [ 4. ],\n", 307 | " [ 4.9],\n", 308 | " [ 4.7],\n", 309 | " [ 4.3],\n", 310 | " [ 4.4],\n", 311 | " [ 4.8],\n", 312 | " [ 5. ],\n", 313 | " [ 4.5],\n", 314 | " [ 3.5],\n", 315 | " [ 3.8],\n", 316 | " [ 3.7],\n", 317 | " [ 3.9],\n", 318 | " [ 5.1],\n", 319 | " [ 4.5],\n", 320 | " [ 4.5],\n", 321 | " [ 4.7],\n", 322 | " [ 4.4],\n", 323 | " [ 4.1],\n", 324 | " [ 4. ],\n", 325 | " [ 4.4],\n", 326 | " [ 4.6],\n", 327 | " [ 4. ],\n", 328 | " [ 3.3],\n", 329 | " [ 4.2],\n", 330 | " [ 4.2],\n", 331 | " [ 4.2],\n", 332 | " [ 4.3],\n", 333 | " [ 3. ],\n", 334 | " [ 4.1],\n", 335 | " [ 6. ],\n", 336 | " [ 5.1],\n", 337 | " [ 5.9],\n", 338 | " [ 5.6],\n", 339 | " [ 5.8],\n", 340 | " [ 6.6],\n", 341 | " [ 4.5],\n", 342 | " [ 6.3],\n", 343 | " [ 5.8],\n", 344 | " [ 6.1],\n", 345 | " [ 5.1],\n", 346 | " [ 5.3],\n", 347 | " [ 5.5],\n", 348 | " [ 5. ],\n", 349 | " [ 5.1],\n", 350 | " [ 5.3],\n", 351 | " [ 5.5],\n", 352 | " [ 6.7],\n", 353 | " [ 6.9],\n", 354 | " [ 5. ],\n", 355 | " [ 5.7],\n", 356 | " [ 4.9],\n", 357 | " [ 6.7],\n", 358 | " [ 4.9],\n", 359 | " [ 5.7],\n", 360 | " [ 6. ],\n", 361 | " [ 4.8],\n", 362 | " [ 4.9],\n", 363 | " [ 5.6],\n", 364 | " [ 5.8],\n", 365 | " [ 6.1],\n", 366 | " [ 6.4],\n", 367 | " [ 5.6],\n", 368 | " [ 5.1],\n", 369 | " [ 5.6],\n", 370 | " [ 6.1],\n", 371 | " [ 5.6],\n", 372 | " [ 5.5],\n", 373 | " [ 4.8],\n", 374 | " [ 5.4],\n", 375 | " [ 5.6],\n", 376 | " [ 5.1],\n", 377 | " [ 5.1],\n", 378 | " [ 5.9],\n", 379 | " [ 5.7],\n", 380 | " [ 5.2],\n", 381 | " [ 5. ],\n", 382 | " [ 5.2],\n", 383 | " [ 5.4],\n", 384 | " [ 5.1]])" 385 | ] 386 | }, 387 | "execution_count": 90, 388 | "metadata": {}, 389 | "output_type": "execute_result" 390 | } 391 | ], 392 | "source": [ 393 | "from sklearn.feature_selection import VarianceThreshold\n", 394 | "#方差选择法,返回值为特征选择后的数据,参数threshold为方差的阈值\n", 395 | "VarianceThreshold(threshold=3).fit_transform(iris.data)" 396 | ] 397 | }, 398 | { 399 | "cell_type": "code", 400 | "execution_count": 2, 401 | "metadata": {}, 402 | "outputs": [ 403 | { 404 | "ename": "TypeError", 405 | "evalue": "constant() missing 1 required positional argument: 'value'", 406 | "output_type": "error", 407 | "traceback": [ 408 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 409 | "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", 410 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n", 411 | "\u001b[1;31mTypeError\u001b[0m: constant() missing 1 required positional argument: 'value'" 412 | ] 413 | } 414 | ], 415 | "source": [ 416 | "%%time\n", 417 | "import tensorflow as tf\n", 418 | "import time\n", 419 | "tf.constant()\n", 420 | "time.sleep(3)\n", 421 | "tf.constant\n", 422 | "print('hello')" 423 | ] 424 | }, 425 | { 426 | "cell_type": "code", 427 | "execution_count": 1, 428 | "metadata": {}, 429 | "outputs": [ 430 | { 431 | "name": "stdout", 432 | "output_type": "stream", 433 | "text": [ 434 | "Successfully downloaded train-images-idx3-ubyte.gz 9912422 bytes.\n", 435 | "Extracting /tmp/mnist_tutorial/data\\train-images-idx3-ubyte.gz\n", 436 | "Successfully downloaded train-labels-idx1-ubyte.gz 28881 bytes.\n", 437 | "Extracting /tmp/mnist_tutorial/data\\train-labels-idx1-ubyte.gz\n", 438 | "Successfully downloaded t10k-images-idx3-ubyte.gz 1648877 bytes.\n", 439 | "Extracting /tmp/mnist_tutorial/data\\t10k-images-idx3-ubyte.gz\n", 440 | "Successfully downloaded t10k-labels-idx1-ubyte.gz 4542 bytes.\n", 441 | "Extracting /tmp/mnist_tutorial/data\\t10k-labels-idx1-ubyte.gz\n" 442 | ] 443 | }, 444 | { 445 | "ename": "AttributeError", 446 | "evalue": "module 'urllib' has no attribute 'urlretrieve'", 447 | "output_type": "error", 448 | "traceback": [ 449 | "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", 450 | "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", 451 | "\u001b[1;32m\u001b[0m in \u001b[0;36m\u001b[1;34m()\u001b[0m\n\u001b[0;32m 9\u001b[0m \u001b[0mmnist\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mtf\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mcontrib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlearn\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdatasets\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmnist\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mread_data_sets\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mtrain_dir\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mLOGDIR\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;34m'data'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mone_hot\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 10\u001b[0m \u001b[1;31m### Get a sprite and labels file for the embedding projector ###\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 11\u001b[1;33m \u001b[0murllib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0murlretrieve\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mGIST_URL\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;34m'labels_1024.tsv'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mLOGDIR\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;34m'labels_1024.tsv'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 12\u001b[0m \u001b[0murllib\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0murlretrieve\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mGIST_URL\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;34m'sprite_1024.png'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mLOGDIR\u001b[0m \u001b[1;33m+\u001b[0m \u001b[1;34m'sprite_1024.png'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 13\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n", 452 | "\u001b[1;31mAttributeError\u001b[0m: module 'urllib' has no attribute 'urlretrieve'" 453 | ] 454 | } 455 | ], 456 | "source": [ 457 | "#https://gist.github.com/dandelionmane/4f02ab8f1451e276fea1f165a20336f1#file-slides-pdf\n", 458 | "import os\n", 459 | "import tensorflow as tf\n", 460 | "import urllib\n", 461 | "\n", 462 | "LOGDIR = '/tmp/mnist_tutorial/'\n", 463 | "GIST_URL = 'https://gist.githubusercontent.com/dandelionmane/4f02ab8f1451e276fea1f165a20336f1/raw/dfb8ee95b010480d56a73f324aca480b3820c180'\n", 464 | "\n", 465 | "### MNIST EMBEDDINGS ###\n", 466 | "mnist = tf.contrib.learn.datasets.mnist.read_data_sets(train_dir=LOGDIR + 'data', one_hot=True)\n", 467 | "### Get a sprite and labels file for the embedding projector ###\n", 468 | "urllib.urlretrieve(GIST_URL + 'labels_1024.tsv', LOGDIR + 'labels_1024.tsv')\n", 469 | "urllib.urlretrieve(GIST_URL + 'sprite_1024.png', LOGDIR + 'sprite_1024.png')\n", 470 | "\n", 471 | "\n", 472 | "def conv_layer(input, size_in, size_out, name=\"conv\"):\n", 473 | " with tf.name_scope(name):\n", 474 | " w = tf.Variable(tf.truncated_normal([5, 5, size_in, size_out], stddev=0.1), name=\"W\")\n", 475 | " b = tf.Variable(tf.constant(0.1, shape=[size_out]), name=\"B\")\n", 476 | " conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding=\"SAME\")\n", 477 | " act = tf.nn.relu(conv + b)\n", 478 | " tf.summary.histogram(\"weights\", w)\n", 479 | " tf.summary.histogram(\"biases\", b)\n", 480 | " tf.summary.histogram(\"activations\", act)\n", 481 | " return tf.nn.max_pool(act, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=\"SAME\")\n", 482 | "\n", 483 | "\n", 484 | "def fc_layer(input, size_in, size_out, name=\"fc\"):\n", 485 | " with tf.name_scope(name):\n", 486 | " w = tf.Variable(tf.truncated_normal([size_in, size_out], stddev=0.1), name=\"W\")\n", 487 | " b = tf.Variable(tf.constant(0.1, shape=[size_out]), name=\"B\")\n", 488 | " act = tf.nn.relu(tf.matmul(input, w) + b)\n", 489 | " tf.summary.histogram(\"weights\", w)\n", 490 | " tf.summary.histogram(\"biases\", b)\n", 491 | " tf.summary.histogram(\"activations\", act)\n", 492 | " return act\n", 493 | "\n", 494 | "\n", 495 | "def mnist_model(learning_rate, use_two_conv, use_two_fc, hparam):\n", 496 | " tf.reset_default_graph()\n", 497 | " sess = tf.Session()\n", 498 | "\n", 499 | " # Setup placeholders, and reshape the data\n", 500 | " x = tf.placeholder(tf.float32, shape=[None, 784], name=\"x\")\n", 501 | " x_image = tf.reshape(x, [-1, 28, 28, 1])\n", 502 | " tf.summary.image('input', x_image, 3)\n", 503 | " y = tf.placeholder(tf.float32, shape=[None, 10], name=\"labels\")\n", 504 | "\n", 505 | " if use_two_conv:\n", 506 | " conv1 = conv_layer(x_image, 1, 32, \"conv1\")\n", 507 | " conv_out = conv_layer(conv1, 32, 64, \"conv2\")\n", 508 | " else:\n", 509 | " conv1 = conv_layer(x_image, 1, 64, \"conv\")\n", 510 | " conv_out = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding=\"SAME\")\n", 511 | "\n", 512 | " flattened = tf.reshape(conv_out, [-1, 7 * 7 * 64])\n", 513 | "\n", 514 | " if use_two_fc:\n", 515 | " fc1 = fc_layer(flattened, 7 * 7 * 64, 1024, \"fc1\")\n", 516 | " embedding_input = fc1\n", 517 | " embedding_size = 1024\n", 518 | " logits = fc_layer(fc1, 1024, 10, \"fc2\")\n", 519 | " else:\n", 520 | " embedding_input = flattened\n", 521 | " embedding_size = 7*7*64\n", 522 | " logits = fc_layer(flattened, 7*7*64, 10, \"fc\")\n", 523 | "\n", 524 | " with tf.name_scope(\"xent\"):\n", 525 | " xent = tf.reduce_mean(\n", 526 | " tf.nn.softmax_cross_entropy_with_logits(\n", 527 | " logits=logits, labels=y), name=\"xent\")\n", 528 | " tf.summary.scalar(\"xent\", xent)\n", 529 | "\n", 530 | " with tf.name_scope(\"train\"):\n", 531 | " train_step = tf.train.AdamOptimizer(learning_rate).minimize(xent)\n", 532 | "\n", 533 | " with tf.name_scope(\"accuracy\"):\n", 534 | " correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))\n", 535 | " accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))\n", 536 | " tf.summary.scalar(\"accuracy\", accuracy)\n", 537 | "\n", 538 | " summ = tf.summary.merge_all()\n", 539 | "\n", 540 | "\n", 541 | " embedding = tf.Variable(tf.zeros([1024, embedding_size]), name=\"test_embedding\")\n", 542 | " assignment = embedding.assign(embedding_input)\n", 543 | " saver = tf.train.Saver()\n", 544 | "\n", 545 | " sess.run(tf.global_variables_initializer())\n", 546 | " writer = tf.summary.FileWriter(LOGDIR + hparam)\n", 547 | " writer.add_graph(sess.graph)\n", 548 | "\n", 549 | " config = tf.contrib.tensorboard.plugins.projector.ProjectorConfig()\n", 550 | " embedding_config = config.embeddings.add()\n", 551 | " embedding_config.tensor_name = embedding.name\n", 552 | " embedding_config.sprite.image_path = LOGDIR + 'sprite_1024.png'\n", 553 | " embedding_config.metadata_path = LOGDIR + 'labels_1024.tsv'\n", 554 | " # Specify the width and height of a single thumbnail.\n", 555 | " embedding_config.sprite.single_image_dim.extend([28, 28])\n", 556 | " tf.contrib.tensorboard.plugins.projector.visualize_embeddings(writer, config)\n", 557 | "\n", 558 | " for i in range(2001):\n", 559 | " batch = mnist.train.next_batch(100)\n", 560 | " if i % 5 == 0:\n", 561 | " [train_accuracy, s] = sess.run([accuracy, summ], feed_dict={x: batch[0], y: batch[1]})\n", 562 | " writer.add_summary(s, i)\n", 563 | " if i % 500 == 0:\n", 564 | " sess.run(assignment, feed_dict={x: mnist.test.images[:1024], y: mnist.test.labels[:1024]})\n", 565 | " saver.save(sess, os.path.join(LOGDIR, \"model.ckpt\"), i)\n", 566 | " sess.run(train_step, feed_dict={x: batch[0], y: batch[1]})\n", 567 | "\n", 568 | "def make_hparam_string(learning_rate, use_two_fc, use_two_conv):\n", 569 | " conv_param = \"conv=2\" if use_two_conv else \"conv=1\"\n", 570 | " fc_param = \"fc=2\" if use_two_fc else \"fc=1\"\n", 571 | " return \"lr_%.0E,%s,%s\" % (learning_rate, conv_param, fc_param)\n", 572 | "\n", 573 | "def main():\n", 574 | " # You can try adding some more learning rates\n", 575 | " for learning_rate in [1E-4]:\n", 576 | "\n", 577 | " # Include \"False\" as a value to try different model architectures\n", 578 | " for use_two_fc in [True]:\n", 579 | " for use_two_conv in [True]:\n", 580 | " # Construct a hyperparameter string for each one (example: \"lr_1E-3,fc=2,conv=2)\n", 581 | " hparam = make_hparam_string(learning_rate, use_two_fc, use_two_conv)\n", 582 | " print('Starting run for %s' % hparam)\n", 583 | "\n", 584 | " # Actually run with the new settings\n", 585 | " mnist_model(learning_rate, use_two_fc, use_two_conv, hparam)\n", 586 | "\n", 587 | "\n", 588 | "if __name__ == '__main__':\n", 589 | " main()" 590 | ] 591 | }, 592 | { 593 | "cell_type": "code", 594 | "execution_count": null, 595 | "metadata": {}, 596 | "outputs": [], 597 | "source": [] 598 | } 599 | ], 600 | "metadata": { 601 | "kernelspec": { 602 | "display_name": "Python 3", 603 | "language": "python", 604 | "name": "python3" 605 | }, 606 | "language_info": { 607 | "codemirror_mode": { 608 | "name": "ipython", 609 | "version": 3 610 | }, 611 | "file_extension": ".py", 612 | "mimetype": "text/x-python", 613 | "name": "python", 614 | "nbconvert_exporter": "python", 615 | "pygments_lexer": "ipython3", 616 | "version": "3.6.3" 617 | } 618 | }, 619 | "nbformat": 4, 620 | "nbformat_minor": 2 621 | } 622 | -------------------------------------------------------------------------------- /data_mining/RenZhengfei.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wqw547243068/Python-learning/a3f4acebbed13852606c9d831477af3bab766f90/data_mining/RenZhengfei.zip -------------------------------------------------------------------------------- /data_mining/cluster.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 32 | 聚类结果展示 33 | 34 | 35 |
36 | 37 | 491 | 492 |
493 |
请输入轨迹字符串:
json串:

494 | 495 |
497 | 498 | 499 |
500 | 501 | 502 | 503 | -------------------------------------------------------------------------------- /fig/contact.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wqw547243068/Python-learning/a3f4acebbed13852606c9d831477af3bab766f90/fig/contact.png -------------------------------------------------------------------------------- /fig/intro.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wqw547243068/Python-learning/a3f4acebbed13852606c9d831477af3bab766f90/fig/intro.png -------------------------------------------------------------------------------- /nn_test.py: -------------------------------------------------------------------------------- 1 | # coding:utf8 2 | # How to build your own Neural Network from scratch in Python 3 | # https://towardsdatascience.com/how-to-build-your-own-neural-network-from-scratch-in-python-68998a08e4f6 4 | 5 | import numpy as np 6 | 7 | def sigmoid(x): 8 | return 1.0/(1+ np.exp(-x)) 9 | 10 | def sigmoid_derivative(x): 11 | return x * (1.0 - x) 12 | 13 | class NeuralNetwork: 14 | def __init__(self, x, y): 15 | self.input = x 16 | self.weights1 = np.random.rand(self.input.shape[1],4) 17 | self.weights2 = np.random.rand(4,1) 18 | self.y = y 19 | self.output = np.zeros(self.y.shape) 20 | 21 | def feedforward(self): 22 | self.layer1 = sigmoid(np.dot(self.input, self.weights1)) 23 | self.output = sigmoid(np.dot(self.layer1, self.weights2)) 24 | 25 | def backprop(self): 26 | # application of the chain rule to find derivative of the loss function with respect to weights2 and weights1 27 | d_weights2 = np.dot(self.layer1.T, (2*(self.y - self.output) * sigmoid_derivative(self.output))) 28 | d_weights1 = np.dot(self.input.T, (np.dot(2*(self.y - self.output) * sigmoid_derivative(self.output), self.weights2.T) * sigmoid_derivative(self.layer1))) 29 | 30 | # update the weights with the derivative (slope) of the loss function 31 | self.weights1 += d_weights1 32 | self.weights2 += d_weights2 33 | 34 | 35 | if __name__ == "__main__": 36 | X = np.array([[0,0,1], 37 | [0,1,1], 38 | [1,0,1], 39 | [1,1,1]]) 40 | y = np.array([[0],[1],[1],[0]]) 41 | nn = NeuralNetwork(X,y) 42 | 43 | for i in range(1500): 44 | nn.feedforward() 45 | nn.backprop() 46 | 47 | print(nn.output) 48 | 49 | --------------------------------------------------------------------------------