├── Demo-Parallel_Grid_Search_SARIMAX ├── Demo_Parallel_Grid_Search_SARIMA.ipynb ├── README.md ├── Test_0qrQsBZ.csv └── Train_SU63ISt.csv ├── LICENSE ├── Non-parametric Confidence Interval ├── Non_parametric_Confidence_Interval.ipynb └── README.md ├── PipelineFoundation ├── LICENSE ├── Pipeline_Experiment.ipynb └── README.md ├── Predicted_R-squared ├── .ipynb_checkpoints │ └── Predicted_R-squared-checkpoint.ipynb ├── PredictedR2.csv ├── Predicted_R-squared.ipynb └── README.md ├── README.md └── SleepyOne ├── README.md └── index.html /Demo-Parallel_Grid_Search_SARIMAX/README.md: -------------------------------------------------------------------------------- 1 | #iamJustAStudent - Let's study AI/ML together : http://iamjustastudent.com 2 | # Demo-Parallel_Grid_Search_SARIMAX 3 | Python code - How to fine tune SARIMAX hyperparams using parallel threads on a multi-core GPU, using joblib library.

4 | Read Complete Tutorial at: https://medium.com/analytics-vidhya/fine-tune-sarima-hyperparams-using-parallel-processing-with-joblib-step-by-step-python-code-2037fec1659 5 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /Non-parametric Confidence Interval/Non_parametric_Confidence_Interval.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Non-parametric Confidence Interval.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [] 9 | }, 10 | "kernelspec": { 11 | "name": "python3", 12 | "display_name": "Python 3" 13 | } 14 | }, 15 | "cells": [ 16 | { 17 | "cell_type": "markdown", 18 | "metadata": { 19 | "id": "ZCKkphFiGk75", 20 | "colab_type": "text" 21 | }, 22 | "source": [ 23 | "#Confidence Interval of Non-Parametric Statistical Tests" 24 | ] 25 | }, 26 | { 27 | "cell_type": "code", 28 | "metadata": { 29 | "id": "mHmGZtGnwXAg", 30 | "colab_type": "code", 31 | "colab": {} 32 | }, 33 | "source": [ 34 | "# methodology behind the code referenced from the British Medical Journal,\n", 35 | "# volume 296, 21 May 1988:\n", 36 | "# \"Calculating confidence intervals for some non-parametric analyses\" by \n", 37 | "# M J Campbell & M J Gardner\n", 38 | "# https://www.ncbi.nlm.nih.gov/pmc/articles/PMC2545906/pdf/bmj00286-0037.pdf\n", 39 | "\n", 40 | "# worked examples referenced from the book: \n", 41 | "# Statistics at Square One by M J Campbell & T D V Swinscow\n", 42 | "# https://www.amazon.in/Statistics-Square-One-Michael-Campbell/dp/1405191007" 43 | ], 44 | "execution_count": 0, 45 | "outputs": [] 46 | }, 47 | { 48 | "cell_type": "code", 49 | "metadata": { 50 | "id": "46ORWbg2gDtA", 51 | "colab_type": "code", 52 | "colab": {} 53 | }, 54 | "source": [ 55 | "# custom func for confidence interval for differences \n", 56 | "# for (non-Gaussian unpaired data). Example: Mann-Whitney U test\n", 57 | "\n", 58 | "import numpy as np\n", 59 | "\n", 60 | "def non_param_unpaired_CI(sample1, sample2, conf):\n", 61 | " n1 = len(sample1) \n", 62 | " n2 = len(sample2) \n", 63 | " alpha = 1-conf \n", 64 | " N = stats.norm.ppf(1 - alpha/2) \n", 65 | "\n", 66 | " # The confidence interval for the difference between the two population\n", 67 | " # medians is derived through the n x m differences.\n", 68 | " diffs = sorted([i-j for i in sample1 for j in sample2])\n", 69 | " \n", 70 | " # the Kth smallest to the Kth largest of the n x m differences then determine \n", 71 | " # the confidence interval, where K is:\n", 72 | " k = np.math.ceil(n1*n2/2 - (N * (n1*n2*(n1+n2+1)/12)**0.5))\n", 73 | " \n", 74 | " CI = (round(diffs[k-1],3), round(diffs[len(diffs)-k],3))\n", 75 | " return CI" 76 | ], 77 | "execution_count": 0, 78 | "outputs": [] 79 | }, 80 | { 81 | "cell_type": "code", 82 | "metadata": { 83 | "id": "hZzwH0yA02ch", 84 | "colab_type": "code", 85 | "colab": {} 86 | }, 87 | "source": [ 88 | "# custom func for confidence interval for differences \n", 89 | "# for (non-Gaussian paired data) Example: Wilcoxon signed-rank test\n", 90 | "\n", 91 | "import numpy as np\n", 92 | "import operator\n", 93 | "\n", 94 | "def non_param_paired_CI(sample1, sample2, conf):\n", 95 | " n = len(sample1) \n", 96 | " alpha = 1-conf \n", 97 | " N = stats.norm.ppf(1 - alpha/2) \n", 98 | "\n", 99 | " # The confidence interval for the difference between the two population\n", 100 | " # medians is derived through the n(n+1)/2 possible averaged differences.\n", 101 | " diff_sample = sorted(list(map(operator.sub, sample2, sample1)))\n", 102 | " averages = sorted([(s1+s2)/2 for i, s1 in enumerate(diff_sample) for _, s2 in enumerate(diff_sample[i:])])\n", 103 | "\n", 104 | " # the Kth smallest to the Kth largest of the averaged differences then \n", 105 | " # determine the confidence interval, where K is:\n", 106 | " k = np.math.ceil(n*(n+1)/4 - (N * (n*(n+1)*(2*n+1)/24)**0.5))\n", 107 | "\n", 108 | " CI = (round(averages[k-1],3), round(averages[len(averages)-k],3))\n", 109 | " return CI" 110 | ], 111 | "execution_count": 0, 112 | "outputs": [] 113 | }, 114 | { 115 | "cell_type": "markdown", 116 | "metadata": { 117 | "id": "5kOfkAAgBOFz", 118 | "colab_type": "text" 119 | }, 120 | "source": [ 121 | "## Worked Examples" 122 | ] 123 | }, 124 | { 125 | "cell_type": "markdown", 126 | "metadata": { 127 | "id": "V4PmwYr1L6NB", 128 | "colab_type": "text" 129 | }, 130 | "source": [ 131 | "###Mann-Whitney *U* test \n", 132 | "###*for unpaired, non-normal continuous output data*" 133 | ] 134 | }, 135 | { 136 | "cell_type": "code", 137 | "metadata": { 138 | "id": "-iURL33ydog3", 139 | "colab_type": "code", 140 | "colab": {} 141 | }, 142 | "source": [ 143 | "# A senior registrar in the rheumatology clinic of a district hospital\n", 144 | "# has designed a clinical trial of a new drug for rheumatoid arthritis.\n", 145 | "# Twenty patients were randomized into two groups of 10 to\n", 146 | "# receive either the standard therapy A or a new treatment B. The\n", 147 | "# plasma globulin fractions after treatment are listed in the Table below.\n", 148 | "\n", 149 | "# Ques Posed : We wish to test whether the new treatment has changed the \n", 150 | "# plasma globulin (and we are worried about the assumption of Normality)." 151 | ], 152 | "execution_count": 0, 153 | "outputs": [] 154 | }, 155 | { 156 | "cell_type": "markdown", 157 | "metadata": { 158 | "id": "0Qkc3npueltG", 159 | "colab_type": "text" 160 | }, 161 | "source": [ 162 | "![image.png](data:image/png;base64,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)" 163 | ] 164 | }, 165 | { 166 | "cell_type": "code", 167 | "metadata": { 168 | "id": "GpLX5L-KhILA", 169 | "colab_type": "code", 170 | "colab": {} 171 | }, 172 | "source": [ 173 | "# H0 (null hypothesis): plasma globulin fraction is not affected by either treatments." 174 | ], 175 | "execution_count": 0, 176 | "outputs": [] 177 | }, 178 | { 179 | "cell_type": "code", 180 | "metadata": { 181 | "id": "7ugN7idQemKT", 182 | "colab_type": "code", 183 | "outputId": "2a2a012a-da61-4047-ccf9-6bc0fcb0eb7b", 184 | "colab": { 185 | "base_uri": "https://localhost:8080/", 186 | "height": 68 187 | } 188 | }, 189 | "source": [ 190 | "import numpy as np\n", 191 | "from scipy import stats\n", 192 | "import operator\n", 193 | "\n", 194 | "# given\n", 195 | "conf = 0.95\n", 196 | "sample1 = [38,26,29,41,36,31,32,30,35,33]\n", 197 | "sample2 = [45,28,27,38,40,42,39,39,34,45]\n", 198 | "\n", 199 | "# mann-whitney\n", 200 | "# we need to use alternative='two-sided'. The use_continuity param is set to \n", 201 | "# 'False' simply to compare with the findings of the book, 'Statistics at Square \n", 202 | "# One'. Otherwise, I think it can be left at its default value of 'True'.\n", 203 | "stat, p = stats.mannwhitneyu(sample1, sample2, use_continuity=False, alternative='two-sided')\n", 204 | "print(f\"p: {round(p, 3)}\")\n", 205 | "\n", 206 | "if p<=(1-conf):\n", 207 | " print(\"Reject H0. Plasma globulin fraction looks likely to be affected by the treatments.\")\n", 208 | "else:\n", 209 | " print(\"Failed to reject H0. Plasma globulin fraction does not look likely to be affected by either treatments.\")\n", 210 | "\n", 211 | "# confidence interval\n", 212 | "diff_median = np.median( list(map(operator.sub, sample1, sample2)) )\n", 213 | "lower, upper = non_param_unpaired_CI(sample1, sample2, conf)\n", 214 | "\n", 215 | "print(f\"{100*conf} % confidence that the median of the samples' diff lies b/w {lower} and {upper}.\")" 216 | ], 217 | "execution_count": 4, 218 | "outputs": [ 219 | { 220 | "output_type": "stream", 221 | "text": [ 222 | "p: 0.075\n", 223 | "Failed to reject H0. Plasma globulin fraction does not look likely to be affected by either treatments.\n", 224 | "95.0 % confidence that the median of the samples' diff lies b/w -10 and 1.\n" 225 | ], 226 | "name": "stdout" 227 | } 228 | ] 229 | }, 230 | { 231 | "cell_type": "code", 232 | "metadata": { 233 | "id": "Y53xezOimbOF", 234 | "colab_type": "code", 235 | "colab": {} 236 | }, 237 | "source": [ 238 | "" 239 | ], 240 | "execution_count": 0, 241 | "outputs": [] 242 | }, 243 | { 244 | "cell_type": "markdown", 245 | "metadata": { 246 | "id": "Psw0BxGfJ0Zv", 247 | "colab_type": "text" 248 | }, 249 | "source": [ 250 | "###Wilcoxon rank test (used for paired data)\n", 251 | "###*for*\n", 252 | "###*(a) Ordinal output data or* \n", 253 | "###*(b) Quantitative output data (discrete or non-normal)*" 254 | ] 255 | }, 256 | { 257 | "cell_type": "code", 258 | "metadata": { 259 | "id": "iSjyrAvlM-yW", 260 | "colab_type": "code", 261 | "colab": {} 262 | }, 263 | "source": [ 264 | "# Boogert et al. used ultrasound to record\n", 265 | "# fetal movements before and after chorionic villus sampling. The\n", 266 | "# percentage of time the fetus spent moving is given in the Table below\n", 267 | "# for 10 pregnant women.\n", 268 | "\n", 269 | "# Ques Posed : Does the chorionic villus sampling process change the \n", 270 | "# fetus movement time?\n", 271 | "\n", 272 | "# If we are concerned that the differences in percentage of time\n", 273 | "# spent moving are unlikely to be Normally distributed we could use\n", 274 | "# the Wilcoxon signed rank test using the following assumptions:" 275 | ], 276 | "execution_count": 0, 277 | "outputs": [] 278 | }, 279 | { 280 | "cell_type": "code", 281 | "metadata": { 282 | "id": "MSenWFtjKIGH", 283 | "colab_type": "code", 284 | "colab": {} 285 | }, 286 | "source": [ 287 | "# Assumptions:\n", 288 | "# 1. The paired differences are independent.\n", 289 | "# 2. The differences come from a symmetrical distribution.\n", 290 | "\n", 291 | "# dataset :" 292 | ], 293 | "execution_count": 0, 294 | "outputs": [] 295 | }, 296 | { 297 | "cell_type": "markdown", 298 | "metadata": { 299 | "id": "_Gg4rSrxKK3v", 300 | "colab_type": "text" 301 | }, 302 | "source": [ 303 | "![image.png](data:image/png;base64,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ZwuyaPrBgEUCz1UQN4c3ZbYkbtDi0Z7RCJWz8I9JwOZDh7Fz/gDU41ioeiWDTuYS6OcmIVptyix8JxcHxgZDLg/FuN9o8sEEowReWhY35zNltihufB6f49yqwWiqkoORySBj3FG/1xwcplO5BDp56RCrYsqsvf89+nmz4CI/R4q6dDn0TuwELIsbmTKbyZ02PwsZaam4mvmc5tnM8KFNREAqBMiUWSqZojiJABFwGgJVXhXEachQQ4kAEZA0ARI3SaePgicCRMASARI3S2RoOxEgApImQOIm6fRR8ESACFgiQOJmiQxtJwJEQNIESNwknT4KnggQAUsESNwskaHtRIAISJoAiZuk00fBEwEiYIkAiZslMrSdCBABSRMgcZN0+ih4IkAELBEgcbNEhrYTASIgaQKVitvJkycxfvx4ehAD6gPUByTVByoVt++++04wYZbxSxjRgxhQH6A+IJU+UNm48+DBg4iNjaUHMaA+QH1AUn2g0pFbZeJHnxMBIkAExEiAxE2MWaGYiAARqDYBErdqI6QCiAARECMBEjcxZoViIgJEoNoESNyqjZAKIAJEQIwESNzEmBWKiQgQgWoTIHGrNkIqgAgQATESIHETY1YoJiJABKpNgMSt2gipACJABMRIgMRNjFmhmIgAEag2ARK3aiOkAogAERAjgf8PdX/+M+R+lasAAAAASUVORK5CYII=)" 304 | ] 305 | }, 306 | { 307 | "cell_type": "code", 308 | "metadata": { 309 | "id": "v6KClOeutLTs", 310 | "colab_type": "code", 311 | "colab": {} 312 | }, 313 | "source": [ 314 | "" 315 | ], 316 | "execution_count": 0, 317 | "outputs": [] 318 | }, 319 | { 320 | "cell_type": "code", 321 | "metadata": { 322 | "id": "f1BxtFVkKLJI", 323 | "colab_type": "code", 324 | "outputId": "c22a6525-8a33-428e-9a37-aedd3427b39b", 325 | "colab": { 326 | "base_uri": "https://localhost:8080/", 327 | "height": 68 328 | } 329 | }, 330 | "source": [ 331 | "import numpy as np\n", 332 | "from scipy import stats\n", 333 | "import operator\n", 334 | "\n", 335 | "# given\n", 336 | "conf = 0.95\n", 337 | "before = [25,24,28,15,20,23,21,20,20,27]\n", 338 | "after = [18,27,25,20,17,24,24,22,19,19]\n", 339 | "\n", 340 | "# wilcoxon\n", 341 | "statistic, p = stats.wilcoxon(before, after)\n", 342 | "print(f\"p: {round(p,3)}\")\n", 343 | "\n", 344 | "if p<=(1-conf):\n", 345 | " print(\"Reject H0. The sampling process seems to change fetal movements.\")\n", 346 | "else:\n", 347 | " print(\"Failed to reject H0. The sampling process does not seem to change fetal movements.\")\n", 348 | "\n", 349 | "# confidence interval\n", 350 | "diff_median = np.median( list(map(operator.sub, before, after)) )\n", 351 | "lower, upper = non_param_paired_CI(before, after, conf)\n", 352 | "\n", 353 | "print(f\"{100*conf} % confidence that the median of the samples' diff lies b/w {lower} and {upper}.\")" 354 | ], 355 | "execution_count": 6, 356 | "outputs": [ 357 | { 358 | "output_type": "stream", 359 | "text": [ 360 | "p: 0.681\n", 361 | "Failed to reject H0. The sampling process does not seem to change fetal movements.\n", 362 | "95.0 % confidence that the median of the samples' diff lies b/w -4.0 and 2.5.\n" 363 | ], 364 | "name": "stdout" 365 | } 366 | ] 367 | }, 368 | { 369 | "cell_type": "code", 370 | "metadata": { 371 | "id": "6NUmIDh-25v4", 372 | "colab_type": "code", 373 | "colab": {} 374 | }, 375 | "source": [ 376 | "" 377 | ], 378 | "execution_count": 0, 379 | "outputs": [] 380 | } 381 | ] 382 | } -------------------------------------------------------------------------------- /Non-parametric Confidence Interval/README.md: -------------------------------------------------------------------------------- 1 | #iamJustAStudent - Let's study AI/ML together : http://iamjustastudent.com 2 | # How to Calculate Confidence Intervals for Non-Parametric Statistical Tests in Python 3 | Complete python code with worked examples for Mann-Whitney U test and Wilcoxon signed-rank test. 4 | 5 | Read the complete tutorial at: https://towardsdatascience.com/prepare-dinner-save-the-day-by-calculating-confidence-interval-of-non-parametric-statistical-29d031d079d0 6 | 7 | View code in Google Colab: https://colab.research.google.com/drive/1E_l4-Z6132DGZoVRqpecn6I3Ny62Nksj 8 | -------------------------------------------------------------------------------- /PipelineFoundation/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 | -------------------------------------------------------------------------------- /PipelineFoundation/Pipeline_Experiment.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "Pipeline Experiment.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [], 9 | "authorship_tag": "ABX9TyMYwerXEgiwGSEXN767uP4N", 10 | "include_colab_link": true 11 | }, 12 | "kernelspec": { 13 | "name": "python3", 14 | "display_name": "Python 3" 15 | } 16 | }, 17 | "cells": [ 18 | { 19 | "cell_type": "markdown", 20 | "metadata": { 21 | "id": "view-in-github", 22 | "colab_type": "text" 23 | }, 24 | "source": [ 25 | "\"Open" 26 | ] 27 | }, 28 | { 29 | "cell_type": "markdown", 30 | "metadata": { 31 | "id": "U91hkLpi-SBV", 32 | "colab_type": "text" 33 | }, 34 | "source": [ 35 | "#Imports" 36 | ] 37 | }, 38 | { 39 | "cell_type": "code", 40 | "metadata": { 41 | "id": "8cjFGNq0P_re", 42 | "colab_type": "code", 43 | "colab": {} 44 | }, 45 | "source": [ 46 | "import numpy as np\n", 47 | "import pandas as pd\n", 48 | "import warnings\n", 49 | "warnings.filterwarnings('ignore')\n", 50 | "from sklearn.metrics import mean_squared_error\n", 51 | "\n", 52 | "from sklearn.preprocessing import StandardScaler, PowerTransformer\n", 53 | "from sklearn.compose import TransformedTargetRegressor\n", 54 | "from sklearn.pipeline import FeatureUnion, Pipeline, make_pipeline\n", 55 | "from sklearn.base import BaseEstimator, TransformerMixin\n", 56 | "\n", 57 | "from sklearn.linear_model import LinearRegression" 58 | ], 59 | "execution_count": 0, 60 | "outputs": [] 61 | }, 62 | { 63 | "cell_type": "markdown", 64 | "metadata": { 65 | "id": "aZ7KzRqK-KHL", 66 | "colab_type": "text" 67 | }, 68 | "source": [ 69 | "#Pipeline Experiment" 70 | ] 71 | }, 72 | { 73 | "cell_type": "code", 74 | "metadata": { 75 | "id": "D13TnX_2_mLi", 76 | "colab_type": "code", 77 | "colab": {} 78 | }, 79 | "source": [ 80 | "df = pd.DataFrame(columns=['X1', 'X2', 'y'], data=[\n", 81 | " [1,16,9],\n", 82 | " [4,36,16],\n", 83 | " [1,16,9],\n", 84 | " [2,9,8],\n", 85 | " [3,36,15],\n", 86 | " [2,49,16],\n", 87 | " [4,25,14],\n", 88 | " [5,36,17]\n", 89 | "])\n", 90 | "\n", 91 | "### y = X1 + 2 * sqrt(X2)\n", 92 | "\n", 93 | "train = df.iloc[:6]\n", 94 | "test = df.iloc[6:]\n", 95 | "\n", 96 | "train_X = train.drop('y', axis=1)\n", 97 | "train_y = train.y\n", 98 | "\n", 99 | "test_X = test.drop('y', axis=1)\n", 100 | "test_y = test.y" 101 | ], 102 | "execution_count": 0, 103 | "outputs": [] 104 | }, 105 | { 106 | "cell_type": "code", 107 | "metadata": { 108 | "id": "Wd_emlUpBbig", 109 | "colab_type": "code", 110 | "colab": { 111 | "base_uri": "https://localhost:8080/", 112 | "height": 90 113 | }, 114 | "outputId": "d33d7919-f565-4b51-d6b5-cd0dae60604d" 115 | }, 116 | "source": [ 117 | "# let's see if linear regression is able to predict this properly\n", 118 | "m1 = LinearRegression()\n", 119 | "fit1 = m1.fit(train_X, train_y)\n", 120 | "preds = fit1.predict(test_X)\n", 121 | "print(f\"\\n{preds}\")\n", 122 | "print(f\"RMSE: {np.sqrt(mean_squared_error(test_y, preds))}\\n\")" 123 | ], 124 | "execution_count": 29, 125 | "outputs": [ 126 | { 127 | "output_type": "stream", 128 | "text": [ 129 | "\n", 130 | "[13.72113586 16.93334467]\n", 131 | "RMSE: 0.20274138822160603\n", 132 | "\n" 133 | ], 134 | "name": "stdout" 135 | } 136 | ] 137 | }, 138 | { 139 | "cell_type": "code", 140 | "metadata": { 141 | "id": "zQayYrzmDWE7", 142 | "colab_type": "code", 143 | "colab": { 144 | "base_uri": "https://localhost:8080/", 145 | "height": 145 146 | }, 147 | "outputId": "b9b3321c-e5b9-4777-d673-8bb07def11d3" 148 | }, 149 | "source": [ 150 | "# what if we square-root X2 and multiply by 2?\n", 151 | "train_X.X2 = 2 * np.sqrt(train_X.X2)\n", 152 | "test_X.X2 = 2 * np.sqrt(test_X.X2)\n", 153 | "print(test_X)\n", 154 | "m2 = LinearRegression()\n", 155 | "fit2 = m2.fit(train_X, train_y)\n", 156 | "preds = fit2.predict(test_X)\n", 157 | "print(f\"\\n{preds}\")\n", 158 | "print(f\"RMSE: {np.sqrt(mean_squared_error(test_y, preds))}\\n\")" 159 | ], 160 | "execution_count": 30, 161 | "outputs": [ 162 | { 163 | "output_type": "stream", 164 | "text": [ 165 | " X1 X2\n", 166 | "6 4 10.0\n", 167 | "7 5 12.0\n", 168 | "\n", 169 | "[14. 17.]\n", 170 | "RMSE: 1.2560739669470201e-15\n", 171 | "\n" 172 | ], 173 | "name": "stdout" 174 | } 175 | ] 176 | }, 177 | { 178 | "cell_type": "code", 179 | "metadata": { 180 | "id": "xMrbwYDDNFKu", 181 | "colab_type": "code", 182 | "colab": {} 183 | }, 184 | "source": [ 185 | "# a perfect prediction, because the data after transformation, fits a perfect linear trend.\n", 186 | "# let's restore the data back to original, and do this via custom transformers using pipeline.\n", 187 | "train = df.iloc[:6]\n", 188 | "test = df.iloc[6:]\n", 189 | "\n", 190 | "train_X = train.drop('y', axis=1)\n", 191 | "train_y = train.y\n", 192 | "\n", 193 | "test_X = test.drop('y', axis=1)\n", 194 | "test_y = test.y" 195 | ], 196 | "execution_count": 0, 197 | "outputs": [] 198 | }, 199 | { 200 | "cell_type": "code", 201 | "metadata": { 202 | "id": "SD08IkZP-Lam", 203 | "colab_type": "code", 204 | "colab": {} 205 | }, 206 | "source": [ 207 | "# references: \n", 208 | "# https://towardsdatascience.com/custom-transformers-and-ml-data-pipelines-with-python-20ea2a7adb65\n", 209 | "# https://machinelearningmastery.com/how-to-transform-target-variables-for-regression-with-scikit-learn/\n", 210 | "# http://zacstewart.com/2014/08/05/pipelines-of-featureunions-of-pipelines.html\n", 211 | "# https://stackoverflow.com/questions/43308042/transformer-initialize-twice-in-pipeline\n", 212 | "\n", 213 | "class ExperimentalTransformer(BaseEstimator, TransformerMixin):\n", 214 | " def __init__(self):\n", 215 | " print('\\n>>>>>>>init() called.\\n')\n", 216 | "\n", 217 | " def fit(self, X, y = None):\n", 218 | " print('\\n>>>>>>>fit() called.\\n')\n", 219 | " return self\n", 220 | "\n", 221 | " def transform(self, X, y = None):\n", 222 | " print('\\n>>>>>>>transform() called.\\n')\n", 223 | " X_ = X.copy() # creating a copy to avoid changes to original dataset\n", 224 | " X_.X2 = 2 * np.sqrt(X_.X2)\n", 225 | " return X_" 226 | ], 227 | "execution_count": 0, 228 | "outputs": [] 229 | }, 230 | { 231 | "cell_type": "code", 232 | "metadata": { 233 | "id": "spUiscMUPY83", 234 | "colab_type": "code", 235 | "colab": { 236 | "base_uri": "https://localhost:8080/", 237 | "height": 145 238 | }, 239 | "outputId": "961ad4f6-5143-442a-8a19-bc986910479d" 240 | }, 241 | "source": [ 242 | "# without input transformation - to validate that we get the same results as before\n", 243 | "print(\"create pipeline 1\")\n", 244 | "pipe1 = Pipeline(steps=[\n", 245 | " ('linear_model', LinearRegression())\n", 246 | "])\n", 247 | "print(\"fit pipeline 1\")\n", 248 | "pipe1.fit(train_X, train_y)\n", 249 | "print(\"predict via pipeline 1\")\n", 250 | "preds1 = pipe1.predict(test_X)\n", 251 | "print(f\"\\n{preds1}\") # should be [13.72113586 16.93334467]\n", 252 | "print(f\"RMSE: {np.sqrt(mean_squared_error(test_y, preds1))}\\n\") " 253 | ], 254 | "execution_count": 33, 255 | "outputs": [ 256 | { 257 | "output_type": "stream", 258 | "text": [ 259 | "create pipeline 1\n", 260 | "fit pipeline 1\n", 261 | "predict via pipeline 1\n", 262 | "\n", 263 | "[13.72113586 16.93334467]\n", 264 | "RMSE: 0.20274138822160603\n", 265 | "\n" 266 | ], 267 | "name": "stdout" 268 | } 269 | ] 270 | }, 271 | { 272 | "cell_type": "code", 273 | "metadata": { 274 | "id": "OFTnGVww_kIi", 275 | "colab_type": "code", 276 | "colab": { 277 | "base_uri": "https://localhost:8080/", 278 | "height": 363 279 | }, 280 | "outputId": "a86df4fa-fa17-4a43-f87a-07167fff174c" 281 | }, 282 | "source": [ 283 | "# with input transformation\n", 284 | "print(\"create pipeline 2\")\n", 285 | "pipe2 = Pipeline(steps=[\n", 286 | " ('experimental_trans', ExperimentalTransformer()), # this will trigger a call to __init__\n", 287 | " ('linear_model', LinearRegression())\n", 288 | "])\n", 289 | "\n", 290 | "# an alternate, shorter syntax to do the above, without naming each step, is:\n", 291 | "#pipe2 = make_pipeline(ExperimentalTransformer(), LinearRegression())\n", 292 | "\n", 293 | "print(\"fit pipeline 2\")\n", 294 | "pipe2.fit(train_X, train_y)\n", 295 | "print(\"predict via pipeline 2\")\n", 296 | "preds2 = pipe2.predict(test_X)\n", 297 | "print(f\"\\n{preds2}\") # should be [14. 17.]\n", 298 | "print(f\"RMSE: {np.sqrt(mean_squared_error(test_y, preds2))}\\n\")" 299 | ], 300 | "execution_count": 34, 301 | "outputs": [ 302 | { 303 | "output_type": "stream", 304 | "text": [ 305 | "create pipeline 2\n", 306 | "\n", 307 | ">>>>>>>init() called.\n", 308 | "\n", 309 | "fit pipeline 2\n", 310 | "\n", 311 | ">>>>>>>fit() called.\n", 312 | "\n", 313 | "\n", 314 | ">>>>>>>transform() called.\n", 315 | "\n", 316 | "predict via pipeline 2\n", 317 | "\n", 318 | ">>>>>>>transform() called.\n", 319 | "\n", 320 | "\n", 321 | "[14. 17.]\n", 322 | "RMSE: 1.2560739669470201e-15\n", 323 | "\n" 324 | ], 325 | "name": "stdout" 326 | } 327 | ] 328 | }, 329 | { 330 | "cell_type": "code", 331 | "metadata": { 332 | "id": "7QAxS_dkSpnC", 333 | "colab_type": "code", 334 | "colab": {} 335 | }, 336 | "source": [ 337 | "# we've assumed in the transform() function of our ExperimentalTransformer that the column name is X2. Let's not do so and\n", 338 | "# pass the column name via the constructor, __init__()" 339 | ], 340 | "execution_count": 0, 341 | "outputs": [] 342 | }, 343 | { 344 | "cell_type": "code", 345 | "metadata": { 346 | "id": "qB8bhqpdS-2m", 347 | "colab_type": "code", 348 | "colab": {} 349 | }, 350 | "source": [ 351 | "class ExperimentalTransformer_2(BaseEstimator, TransformerMixin):\n", 352 | " # add another additional parameter, just for fun, while we are at it\n", 353 | " def __init__(self, feature_name, additional_param = \"Himanshu\"): \n", 354 | " print('\\n>>>>>>>init() called.\\n')\n", 355 | " self.feature_name = feature_name\n", 356 | " self.additional_param = additional_param\n", 357 | "\n", 358 | " def fit(self, X, y = None):\n", 359 | " print('\\n>>>>>>>fit() called.\\n')\n", 360 | " print(f'\\nadditional param ~~~~~ {self.additional_param}\\n')\n", 361 | " return self\n", 362 | "\n", 363 | " def transform(self, X, y = None):\n", 364 | " print('\\n>>>>>>>transform() called.\\n')\n", 365 | " X_ = X.copy() # creating a copy to avoid changes to original dataset\n", 366 | " X_[self.feature_name] = 2 * np.sqrt(X_[self.feature_name])\n", 367 | " return X_" 368 | ], 369 | "execution_count": 0, 370 | "outputs": [] 371 | }, 372 | { 373 | "cell_type": "code", 374 | "metadata": { 375 | "id": "A_WkBgdkTOLU", 376 | "colab_type": "code", 377 | "colab": {} 378 | }, 379 | "source": [ 380 | "# take care to keep the parameter name exactly the same in the function argument as well as \n", 381 | "# the class' variable (feature_name). Changing that will cause problems later when we also\n", 382 | "# try to transform the target feature (y). It causes a double-call to __init__ for some reason." 383 | ], 384 | "execution_count": 0, 385 | "outputs": [] 386 | }, 387 | { 388 | "cell_type": "code", 389 | "metadata": { 390 | "id": "GB6WV6pUTuu-", 391 | "colab_type": "code", 392 | "colab": { 393 | "base_uri": "https://localhost:8080/", 394 | "height": 417 395 | }, 396 | "outputId": "bdd1ecc7-285d-4d39-f8f3-d6101bdeeef7" 397 | }, 398 | "source": [ 399 | "print(\"create pipeline 2\")\n", 400 | "pipe2 = Pipeline(steps=[\n", 401 | " ('experimental_trans', ExperimentalTransformer_2('X2')),\n", 402 | " ('linear_model', LinearRegression())\n", 403 | "])\n", 404 | "print(\"fit pipeline 2\")\n", 405 | "pipe2.fit(train_X, train_y)\n", 406 | "print(\"predict via pipeline 2\")\n", 407 | "preds2 = pipe2.predict(test_X)\n", 408 | "print(f\"\\n{preds2}\") # should be [14. 17.]\n", 409 | "print(f\"RMSE: {np.sqrt(mean_squared_error(test_y, preds2))}\\n\")" 410 | ], 411 | "execution_count": 38, 412 | "outputs": [ 413 | { 414 | "output_type": "stream", 415 | "text": [ 416 | "create pipeline 2\n", 417 | "\n", 418 | ">>>>>>>init() called.\n", 419 | "\n", 420 | "fit pipeline 2\n", 421 | "\n", 422 | ">>>>>>>fit() called.\n", 423 | "\n", 424 | "\n", 425 | "additional param ~~~~~ Himanshu\n", 426 | "\n", 427 | "\n", 428 | ">>>>>>>transform() called.\n", 429 | "\n", 430 | "predict via pipeline 2\n", 431 | "\n", 432 | ">>>>>>>transform() called.\n", 433 | "\n", 434 | "\n", 435 | "[14. 17.]\n", 436 | "RMSE: 1.2560739669470201e-15\n", 437 | "\n" 438 | ], 439 | "name": "stdout" 440 | } 441 | ] 442 | }, 443 | { 444 | "cell_type": "code", 445 | "metadata": { 446 | "id": "jBLKFfxcVhE5", 447 | "colab_type": "code", 448 | "colab": {} 449 | }, 450 | "source": [ 451 | "# let's take this a step further by modifying the dataframe to have target as squares of current values:" 452 | ], 453 | "execution_count": 0, 454 | "outputs": [] 455 | }, 456 | { 457 | "cell_type": "code", 458 | "metadata": { 459 | "id": "uqY60SOGViBG", 460 | "colab_type": "code", 461 | "colab": {} 462 | }, 463 | "source": [ 464 | "df = pd.DataFrame(columns=['X1', 'X2', 'y'], data=[\n", 465 | " [1,16,81],\n", 466 | " [4,36,256],\n", 467 | " [1,16,81],\n", 468 | " [2,9,64],\n", 469 | " [3,36,225],\n", 470 | " [2,49,256],\n", 471 | " [4,25,196],\n", 472 | " [5,36,289]\n", 473 | "])\n", 474 | "\n", 475 | "### sqrt(y) = X1 + 2 * sqrt(X2)\n", 476 | "\n", 477 | "train = df.iloc[:6]\n", 478 | "test = df.iloc[6:]\n", 479 | "\n", 480 | "train_X = train.drop('y', axis=1)\n", 481 | "train_y = train.y\n", 482 | "\n", 483 | "test_X = test.drop('y', axis=1)\n", 484 | "test_y = test.y" 485 | ], 486 | "execution_count": 0, 487 | "outputs": [] 488 | }, 489 | { 490 | "cell_type": "code", 491 | "metadata": { 492 | "id": "FSAo6KGzViSe", 493 | "colab_type": "code", 494 | "colab": { 495 | "base_uri": "https://localhost:8080/", 496 | "height": 145 497 | }, 498 | "outputId": "2b16b778-bcda-4b00-a700-6e85bc162e30" 499 | }, 500 | "source": [ 501 | "# let's see model's performance with no input & target transformations:\n", 502 | "print(\"create pipeline 1\")\n", 503 | "pipe1 = Pipeline(steps=[\n", 504 | " ('linear_model', LinearRegression())\n", 505 | "])\n", 506 | "print(\"fit pipeline 1\")\n", 507 | "pipe1.fit(train_X, train_y)\n", 508 | "print(\"predict via pipeline 1\")\n", 509 | "preds1 = pipe1.predict(test_X)\n", 510 | "print(f\"\\n{preds1}\") \n", 511 | "print(f\"RMSE: {np.sqrt(mean_squared_error(test_y, preds1))}\\n\") " 512 | ], 513 | "execution_count": 41, 514 | "outputs": [ 515 | { 516 | "output_type": "stream", 517 | "text": [ 518 | "create pipeline 1\n", 519 | "fit pipeline 1\n", 520 | "predict via pipeline 1\n", 521 | "\n", 522 | "[200.34790002 279.04738423]\n", 523 | "RMSE: 7.679804528409077\n", 524 | "\n" 525 | ], 526 | "name": "stdout" 527 | } 528 | ] 529 | }, 530 | { 531 | "cell_type": "code", 532 | "metadata": { 533 | "id": "i_PwqZaTVihG", 534 | "colab_type": "code", 535 | "colab": { 536 | "base_uri": "https://localhost:8080/", 537 | "height": 417 538 | }, 539 | "outputId": "eb81b244-93a0-42fc-a80e-18a2dc259262" 540 | }, 541 | "source": [ 542 | "# with input transformation but no target transformation\n", 543 | "print(\"create pipeline 2\")\n", 544 | "pipe2 = Pipeline(steps=[\n", 545 | " ('experimental_trans', ExperimentalTransformer_2('X2')),\n", 546 | " ('linear_model', LinearRegression())\n", 547 | "])\n", 548 | "print(\"fit pipeline 2\")\n", 549 | "pipe2.fit(train_X, train_y)\n", 550 | "print(\"predict via pipeline 2\")\n", 551 | "preds2 = pipe2.predict(test_X)\n", 552 | "print(f\"\\n{preds2}\") \n", 553 | "print(f\"RMSE: {np.sqrt(mean_squared_error(test_y, preds2))}\\n\")" 554 | ], 555 | "execution_count": 42, 556 | "outputs": [ 557 | { 558 | "output_type": "stream", 559 | "text": [ 560 | "create pipeline 2\n", 561 | "\n", 562 | ">>>>>>>init() called.\n", 563 | "\n", 564 | "fit pipeline 2\n", 565 | "\n", 566 | ">>>>>>>fit() called.\n", 567 | "\n", 568 | "\n", 569 | "additional param ~~~~~ Himanshu\n", 570 | "\n", 571 | "\n", 572 | ">>>>>>>transform() called.\n", 573 | "\n", 574 | "predict via pipeline 2\n", 575 | "\n", 576 | ">>>>>>>transform() called.\n", 577 | "\n", 578 | "\n", 579 | "[207.42690058 280.94152047]\n", 580 | "RMSE: 9.887192456534303\n", 581 | "\n" 582 | ], 583 | "name": "stdout" 584 | } 585 | ] 586 | }, 587 | { 588 | "cell_type": "code", 589 | "metadata": { 590 | "id": "9Ug-zMF0YISg", 591 | "colab_type": "code", 592 | "colab": {} 593 | }, 594 | "source": [ 595 | "# we'll now write a custom target transformer.\n", 596 | "# this needs 2 functions, one to transform and another to inverse-transform" 597 | ], 598 | "execution_count": 0, 599 | "outputs": [] 600 | }, 601 | { 602 | "cell_type": "code", 603 | "metadata": { 604 | "id": "TskWUHTcVit_", 605 | "colab_type": "code", 606 | "colab": {} 607 | }, 608 | "source": [ 609 | "def target_transform(target):\n", 610 | " print('\\n*****************target_transform() called.\\n')\n", 611 | " target_ = target.copy() \n", 612 | " target_ = np.sqrt(target_)\n", 613 | " return target_\n", 614 | "\n", 615 | "def inverse_target_transform(target):\n", 616 | " print('\\n*****************inverse_target_transform() called.\\n')\n", 617 | " target_ = target.copy() \n", 618 | " target_ = target_ ** 2\n", 619 | " return target_" 620 | ], 621 | "execution_count": 0, 622 | "outputs": [] 623 | }, 624 | { 625 | "cell_type": "code", 626 | "metadata": { 627 | "id": "OwNd-9__Ywx9", 628 | "colab_type": "code", 629 | "colab": { 630 | "base_uri": "https://localhost:8080/", 631 | "height": 799 632 | }, 633 | "outputId": "da2ba50d-8f3d-405d-f137-b8abcb7d2c6d" 634 | }, 635 | "source": [ 636 | "# with input transformation & target transformation\n", 637 | "print(\"create pipeline 3\")\n", 638 | "# no change in input pipeline\n", 639 | "pipe3 = Pipeline(steps=[\n", 640 | " ('experimental_trans', ExperimentalTransformer_2('X2')),\n", 641 | " ('linear_model', LinearRegression())\n", 642 | "])\n", 643 | "\n", 644 | "# create a TargetTransformer \n", 645 | "model = TransformedTargetRegressor(regressor=pipe3, \n", 646 | " func=target_transform, \n", 647 | " inverse_func=inverse_target_transform)\n", 648 | "\n", 649 | "print(\"fit pipeline 3 [fit Model]\")\n", 650 | "# note the different syntax here; we fit the 'model' now, instead of 'pipe3'\n", 651 | "model.fit(train_X, train_y) \n", 652 | "print(\"predict via pipeline 3 [Model]\")\n", 653 | "preds3 = model.predict(test_X) # same here, using 'model' to predict\n", 654 | "print(f\"\\n{preds3}\") # should be [196. 289.]\n", 655 | "print(f\"RMSE: {np.sqrt(mean_squared_error(test_y, preds3))}\\n\")" 656 | ], 657 | "execution_count": 45, 658 | "outputs": [ 659 | { 660 | "output_type": "stream", 661 | "text": [ 662 | "create pipeline 3\n", 663 | "\n", 664 | ">>>>>>>init() called.\n", 665 | "\n", 666 | "fit pipeline 3 [fit Model]\n", 667 | "\n", 668 | "*****************target_transform() called.\n", 669 | "\n", 670 | "\n", 671 | "*****************inverse_target_transform() called.\n", 672 | "\n", 673 | "\n", 674 | "*****************target_transform() called.\n", 675 | "\n", 676 | "\n", 677 | "*****************inverse_target_transform() called.\n", 678 | "\n", 679 | "\n", 680 | "*****************target_transform() called.\n", 681 | "\n", 682 | "\n", 683 | ">>>>>>>init() called.\n", 684 | "\n", 685 | "\n", 686 | ">>>>>>>fit() called.\n", 687 | "\n", 688 | "\n", 689 | "additional param ~~~~~ Himanshu\n", 690 | "\n", 691 | "\n", 692 | ">>>>>>>transform() called.\n", 693 | "\n", 694 | "predict via pipeline 3 [Model]\n", 695 | "\n", 696 | ">>>>>>>transform() called.\n", 697 | "\n", 698 | "\n", 699 | "*****************inverse_target_transform() called.\n", 700 | "\n", 701 | "\n", 702 | "[196. 289.]\n", 703 | "RMSE: 4.0194366942304644e-14\n", 704 | "\n" 705 | ], 706 | "name": "stdout" 707 | } 708 | ] 709 | }, 710 | { 711 | "cell_type": "code", 712 | "metadata": { 713 | "id": "YYQ0HystcAmr", 714 | "colab_type": "code", 715 | "colab": {} 716 | }, 717 | "source": [ 718 | "# perfect predictions!" 719 | ], 720 | "execution_count": 0, 721 | "outputs": [] 722 | }, 723 | { 724 | "cell_type": "code", 725 | "metadata": { 726 | "id": "YTM-qswpcCwf", 727 | "colab_type": "code", 728 | "colab": {} 729 | }, 730 | "source": [ 731 | "# we can even use in-built Transformers instead of user-defined functions. Example-\n", 732 | "# model = TransformedTargetRegressor(regressor=pipe3, transformer=PowerTransformer())\n", 733 | "# or\n", 734 | "# model = TransformedTargetRegressor(regressor=pipe3, transformer=StandardScaler())\n", 735 | "# using a built-in transformer does not require us to specify the inverse_transformer() as that is taken care of internally." 736 | ], 737 | "execution_count": 0, 738 | "outputs": [] 739 | }, 740 | { 741 | "cell_type": "code", 742 | "metadata": { 743 | "id": "mmEs3zaKEneX", 744 | "colab_type": "code", 745 | "colab": {} 746 | }, 747 | "source": [ 748 | "# in case you want to have a custom transformer inside TransformedTargetRegressor, you can do that too. The only additional \n", 749 | "# function you'll have to implement would be inverse_transform(). Here's an example:" 750 | ], 751 | "execution_count": 0, 752 | "outputs": [] 753 | }, 754 | { 755 | "cell_type": "code", 756 | "metadata": { 757 | "id": "yBZ-S3y9_AQz", 758 | "colab_type": "code", 759 | "colab": {} 760 | }, 761 | "source": [ 762 | "class CustomTargetTransformer(BaseEstimator, TransformerMixin):\n", 763 | " # no need to implement __init__ in this particular case\n", 764 | " \n", 765 | " def fit(self, target):\n", 766 | " return self\n", 767 | "\n", 768 | " def transform(self, target):\n", 769 | " print('\\n%%%%%%%%%%%%%%%custom_target_transform() called.\\n')\n", 770 | " target_ = target.copy() \n", 771 | " target_ = np.sqrt(target_)\n", 772 | " return target_\n", 773 | "\n", 774 | " # need to implement this too\n", 775 | " def inverse_transform(self, target):\n", 776 | " print('\\n%%%%%%%%%%%%%%%custom_inverse_target_transform() called.\\n')\n", 777 | " target_ = target.copy() \n", 778 | " target_ = target_ ** 2\n", 779 | " return target_" 780 | ], 781 | "execution_count": 0, 782 | "outputs": [] 783 | }, 784 | { 785 | "cell_type": "code", 786 | "metadata": { 787 | "id": "rsCBFs6o-gBN", 788 | "colab_type": "code", 789 | "colab": { 790 | "base_uri": "https://localhost:8080/", 791 | "height": 581 792 | }, 793 | "outputId": "6ea392f9-7a0a-45d1-a7d5-05a1a0ac0d41" 794 | }, 795 | "source": [ 796 | "# with input transformation & target transformation\n", 797 | "print(\"create pipeline 3.1\")\n", 798 | "# no change in input pipeline\n", 799 | "pipe3_1 = Pipeline(steps=[\n", 800 | " ('experimental_trans', ExperimentalTransformer_2('X2')),\n", 801 | " ('linear_model', LinearRegression())\n", 802 | "])\n", 803 | "\n", 804 | "# create a TargetTransformer \n", 805 | "# By default, the provided functions are checked at each fit to be the inverse of each other. However, it is \n", 806 | "# possible to bypass this checking by setting check_inverse to False.\n", 807 | "model = TransformedTargetRegressor(regressor=pipe3_1, \n", 808 | " transformer=CustomTargetTransformer(),\n", 809 | " check_inverse=False) # avoid repeated calls\n", 810 | "\n", 811 | "print(\"fit pipeline 3.1 [fit Model]\")\n", 812 | "model.fit(train_X, train_y) \n", 813 | "print(\"predict via pipeline 3.1 [Model]\")\n", 814 | "preds3_1 = model.predict(test_X) \n", 815 | "print(f\"\\n{preds3_1}\") # should be [196. 289.]\n", 816 | "print(f\"RMSE: {np.sqrt(mean_squared_error(test_y, preds3_1))}\\n\")" 817 | ], 818 | "execution_count": 50, 819 | "outputs": [ 820 | { 821 | "output_type": "stream", 822 | "text": [ 823 | "create pipeline 3.1\n", 824 | "\n", 825 | ">>>>>>>init() called.\n", 826 | "\n", 827 | "fit pipeline 3.1 [fit Model]\n", 828 | "\n", 829 | "%%%%%%%%%%%%%%%custom_target_transform() called.\n", 830 | "\n", 831 | "\n", 832 | ">>>>>>>init() called.\n", 833 | "\n", 834 | "\n", 835 | ">>>>>>>fit() called.\n", 836 | "\n", 837 | "\n", 838 | "additional param ~~~~~ Himanshu\n", 839 | "\n", 840 | "\n", 841 | ">>>>>>>transform() called.\n", 842 | "\n", 843 | "predict via pipeline 3.1 [Model]\n", 844 | "\n", 845 | ">>>>>>>transform() called.\n", 846 | "\n", 847 | "\n", 848 | "%%%%%%%%%%%%%%%custom_inverse_target_transform() called.\n", 849 | "\n", 850 | "\n", 851 | "[196. 289.]\n", 852 | "RMSE: 4.0194366942304644e-14\n", 853 | "\n" 854 | ], 855 | "name": "stdout" 856 | } 857 | ] 858 | }, 859 | { 860 | "cell_type": "code", 861 | "metadata": { 862 | "id": "Ly2iew-uEhdU", 863 | "colab_type": "code", 864 | "colab": {} 865 | }, 866 | "source": [ 867 | "# let's now see how to get and set parameters of the model. We'll also cache the transformer to \n", 868 | "# avoid repeated computation and make it more efficient." 869 | ], 870 | "execution_count": 0, 871 | "outputs": [] 872 | }, 873 | { 874 | "cell_type": "code", 875 | "metadata": { 876 | "id": "I0KB3cjDC5ho", 877 | "colab_type": "code", 878 | "colab": { 879 | "base_uri": "https://localhost:8080/", 880 | "height": 490 881 | }, 882 | "outputId": "e17e937f-9ff3-485a-8730-846e2851a6da" 883 | }, 884 | "source": [ 885 | "# get all the params of our model\n", 886 | "model.get_params()" 887 | ], 888 | "execution_count": 52, 889 | "outputs": [ 890 | { 891 | "output_type": "execute_result", 892 | "data": { 893 | "text/plain": [ 894 | "{'check_inverse': False,\n", 895 | " 'func': None,\n", 896 | " 'inverse_func': None,\n", 897 | " 'regressor': Pipeline(memory=None,\n", 898 | " steps=[('experimental_trans',\n", 899 | " ExperimentalTransformer_2(additional_param='Himanshu',\n", 900 | " feature_name='X2')),\n", 901 | " ('linear_model',\n", 902 | " LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None,\n", 903 | " normalize=False))],\n", 904 | " verbose=False),\n", 905 | " 'regressor__experimental_trans': ExperimentalTransformer_2(additional_param='Himanshu', feature_name='X2'),\n", 906 | " 'regressor__experimental_trans__additional_param': 'Himanshu',\n", 907 | " 'regressor__experimental_trans__feature_name': 'X2',\n", 908 | " 'regressor__linear_model': LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False),\n", 909 | " 'regressor__linear_model__copy_X': True,\n", 910 | " 'regressor__linear_model__fit_intercept': True,\n", 911 | " 'regressor__linear_model__n_jobs': None,\n", 912 | " 'regressor__linear_model__normalize': False,\n", 913 | " 'regressor__memory': None,\n", 914 | " 'regressor__steps': [('experimental_trans',\n", 915 | " ExperimentalTransformer_2(additional_param='Himanshu', feature_name='X2')),\n", 916 | " ('linear_model',\n", 917 | " LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False))],\n", 918 | " 'regressor__verbose': False,\n", 919 | " 'transformer': CustomTargetTransformer()}" 920 | ] 921 | }, 922 | "metadata": { 923 | "tags": [] 924 | }, 925 | "execution_count": 52 926 | } 927 | ] 928 | }, 929 | { 930 | "cell_type": "code", 931 | "metadata": { 932 | "id": "h729iuXW26OI", 933 | "colab_type": "code", 934 | "colab": {} 935 | }, 936 | "source": [ 937 | "from tempfile import mkdtemp\n", 938 | "from shutil import rmtree\n", 939 | "# read about caching and side effect at: https://scikit-learn.org/stable/modules/compose.html?highlight=transformedtargetregressor#pipeline-chaining-estimators" 940 | ], 941 | "execution_count": 0, 942 | "outputs": [] 943 | }, 944 | { 945 | "cell_type": "code", 946 | "metadata": { 947 | "id": "ev2o5jU-Cpcb", 948 | "colab_type": "code", 949 | "colab": { 950 | "base_uri": "https://localhost:8080/", 951 | "height": 635 952 | }, 953 | "outputId": "374c1b5f-6618-4ca7-cd43-72b6f83c008b" 954 | }, 955 | "source": [ 956 | "cachedir = mkdtemp()\n", 957 | "print(\"create pipeline 4\")\n", 958 | "pipe4 = Pipeline(steps=[\n", 959 | " # incorrect column name passed\n", 960 | " ('experimental_trans', ExperimentalTransformer_2('X1')), \n", 961 | " ('linear_model', LinearRegression())\n", 962 | "], memory=cachedir)\n", 963 | "# create a TargetTransformer\n", 964 | "model = TransformedTargetRegressor(regressor=pipe4, \n", 965 | " func=target_transform, \n", 966 | " inverse_func=inverse_target_transform, \n", 967 | " check_inverse=False) \n", 968 | "# correcting the column name using set_params()\n", 969 | "model.set_params(regressor__experimental_trans__feature_name = 'X2') \n", 970 | "\n", 971 | "print(\"fit pipeline 4 [fit Model]\")\n", 972 | "model.fit(train_X, train_y) \n", 973 | "print(\"predict via pipeline 4 [Model]\")\n", 974 | "preds4 = model.predict(test_X) \n", 975 | "print(f\"\\n{preds4}\") # should be [196. 289.]\n", 976 | "print(f\"RMSE: {np.sqrt(mean_squared_error(test_y, preds4))}\\n\")\n", 977 | "\n", 978 | "# Clear the cache directory when you don't need it anymore\n", 979 | "rmtree(cachedir)" 980 | ], 981 | "execution_count": 54, 982 | "outputs": [ 983 | { 984 | "output_type": "stream", 985 | "text": [ 986 | "create pipeline 4\n", 987 | "\n", 988 | ">>>>>>>init() called.\n", 989 | "\n", 990 | "fit pipeline 4 [fit Model]\n", 991 | "\n", 992 | "*****************target_transform() called.\n", 993 | "\n", 994 | "\n", 995 | ">>>>>>>init() called.\n", 996 | "\n", 997 | "\n", 998 | ">>>>>>>init() called.\n", 999 | "\n", 1000 | "\n", 1001 | ">>>>>>>fit() called.\n", 1002 | "\n", 1003 | "\n", 1004 | "additional param ~~~~~ Himanshu\n", 1005 | "\n", 1006 | "\n", 1007 | ">>>>>>>transform() called.\n", 1008 | "\n", 1009 | "predict via pipeline 4 [Model]\n", 1010 | "\n", 1011 | ">>>>>>>transform() called.\n", 1012 | "\n", 1013 | "\n", 1014 | "*****************inverse_target_transform() called.\n", 1015 | "\n", 1016 | "\n", 1017 | "[196. 289.]\n", 1018 | "RMSE: 4.0194366942304644e-14\n", 1019 | "\n" 1020 | ], 1021 | "name": "stdout" 1022 | } 1023 | ] 1024 | }, 1025 | { 1026 | "cell_type": "code", 1027 | "metadata": { 1028 | "id": "_5ZCrirHIADe", 1029 | "colab_type": "code", 1030 | "colab": {} 1031 | }, 1032 | "source": [ 1033 | "# NEXT STEPS:\n", 1034 | "\n", 1035 | "# 1. FeatureUnion and ColumnTransformer\n", 1036 | "# Some great examples:\n", 1037 | "# https://scikit-learn.org/stable/modules/compose.html#featureunion-composite-feature-spaces \n", 1038 | "# https://scikit-learn.org/stable/modules/generated/sklearn.compose.ColumnTransformer.html#sklearn.compose.ColumnTransformer\n", 1039 | "\n", 1040 | "\n", 1041 | "# 2. Using GridSearch with Pipelines\n", 1042 | "# Example: https://scikit-learn.org/stable/auto_examples/compose/plot_feature_union.html?highlight=pipeline\n" 1043 | ], 1044 | "execution_count": 0, 1045 | "outputs": [] 1046 | }, 1047 | { 1048 | "cell_type": "code", 1049 | "metadata": { 1050 | "id": "M7b3qRdI3EMB", 1051 | "colab_type": "code", 1052 | "colab": {} 1053 | }, 1054 | "source": [ 1055 | "" 1056 | ], 1057 | "execution_count": 0, 1058 | "outputs": [] 1059 | } 1060 | ] 1061 | } -------------------------------------------------------------------------------- /PipelineFoundation/README.md: -------------------------------------------------------------------------------- 1 | #iamJustAStudent - Let's study AI/ML together : http://iamjustastudent.com 2 | # Pipelines & Custom Transformers in scikit-learn: The step-by-step guide (with Python code) 3 | Understand the basics and workings of scikit-learn pipelines from the ground up, so that you can build your own.. 4 | 5 | Watch the video tutorial at: https://youtu.be/mOYJCR0IDk8
6 | or
7 | Read the complete tutorial at: https://towardsdatascience.com/pipelines-custom-transformers-in-scikit-learn-the-step-by-step-guide-with-python-code-4a7d9b068156 8 | -------------------------------------------------------------------------------- /Predicted_R-squared/PredictedR2.csv: -------------------------------------------------------------------------------- 1 | X,Y 2 | 70,23 3 | 68,30 4 | 76,26 5 | 69,11 6 | 82,10 7 | 83,3 8 | 79,9 9 | 78,12 10 | 88,7 11 | 91,39 12 | 89,23 13 | 73,19 14 | -------------------------------------------------------------------------------- /Predicted_R-squared/README.md: -------------------------------------------------------------------------------- 1 | #iamJustAStudent - Let's study AI/ML together : http://iamjustastudent.com 2 | # Predicted R-squared 3 | An awesome metric you haven't heard of! 4 | 5 | ## Step by Step Guide: 6 | https://iamjustastudent.com/2020/09/07/predicted-r-squared-an-awesome-metric-you-havent-heard-of/ 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # MachineLearning 2 | Let's study AI/ML together. 3 | -------------------------------------------------------------------------------- /SleepyOne/README.md: -------------------------------------------------------------------------------- 1 | #iamJustAStudent - Let's study AI/ML together : http://iamjustastudent.com 2 | # SleepyOne 3 | A Fun Project (Pose Detector) With Google's Teachable Machine 4 | 5 | ## Step by Step Guide: 6 | https://medium.com/@himanshuhc/a-fun-project-pose-detector-with-googles-teachable-machine-6c7c8d650be1 7 | -------------------------------------------------------------------------------- /SleepyOne/index.html: -------------------------------------------------------------------------------- 1 |
Teachable Machine Pose Model
2 | 3 |
4 |
5 |



6 | 10 | 11 | 12 | 100 | --------------------------------------------------------------------------------