Python numpy 小测试:均值标准化和数据分离 (十七)
均值标准化
在机器学习中,我们会使用大量数据训练我们的模型。某些机器学习算法可能需要标准化数据才能正常工作。标准化是指特征缩放,旨在确保所有数据都采用相似的刻度,即所有数据采用相似范围的值。例如,数据集的值范围在 0 到 5,000 之间。通过标准化数据,可以使值范围在 0 到 1 之间。
在此 Lab 中,你将执行一种特殊形式的特征缩放,称之为均值标准化。均值标准化不仅会缩放数据,而且会确保数据的均值为 0。
TODO:
首先,你将导入 NumPy 并创建一个秩为 2 的 ndarray,其中包含 0 到 5,000(含)之间的随机整数,共有 1000 行和 20 列。此数组将模拟一个值范围很广的数据集。请填充以下代码
# import NumPy into Python
import numpy as np
# Create a 1000 x 20 ndarray with random integers in the half-open interval [0, 5001).
# numpy.random.randint(low, high=None, size=None, dtype='l')
X = np.random.randint(0, 5001, 20000).reshape(1000, 20)
# print the shape of X
print(X.shape)
(1000, 20)
创建好数组后,我们将标准化数据。我们将使用以下方程进行均值标准化:
$\mbox{Norm_Col}_i = \frac{\mbox{Col}_i - \mu_i}{\sigma_i}$
其中 $\mbox{Col}_i$ 是 $X$ 的第 $i$ 列,$\mu_i$ 是 $X$ 的第 $i$ 列的平均值,$\sigma_i$ 是 $X$ 的第 $i$ 列的标准差。换句话说,均值标准化的计算方法是将值减去 $X$ 的每列的平均值,然后除以值的标准差。在下面的空白处,你首先需要计算 $X$ 的每列的平均值和标准差。
# Average of the values in each column of X
ave_cols = X.mean(axis=0)
# Standard Deviation of the values in each column of X
std_cols = X.std(axis=0)
如果你正确地完成了上述计算过程,则 ave_cols 和 std_cols 向量的形状都应该为 (20,),因为 $X$ 有 20 列。你可以通过填充以下代码验证这一点:
# Print the shape of ave_cols
print(ave_cols.shape)
# Print the shape of std_cols
print(std_cols.shape)
(20,)
(20,)
现在,你可以利用广播计算 $X$ 的均值标准化版本,借助上述方程,用一行代码就能搞定。请填充以下代码
# Mean normalize X
X_norm = (X - ave_cols) / std_cols
print(X_norm)
[[-1.09244009 1.20786002 0.76287604 ..., 0.64526733 -1.41998318
1.17164336]
[ 0.84061898 0.11577736 0.53107517 ..., 0.30592195 1.40700164
-0.74825693]
[ 0.69818305 0.57847736 0.71720781 ..., -1.68652026 -0.8152398
0.0664558 ]
...,
[ 0.34875894 -0.90714237 -1.55374878 ..., -0.66917664 -0.20564739
-1.45162098]
[-1.2025999 0.84198812 1.07494229 ..., -1.66920672 -1.12280688
-0.81050154]
[ 0.5543438 -0.34208123 -1.3620806 ..., -1.44066799 0.23907799
-1.45092937]]
如果你正确地完成了均值标准化过程,那么 $X_{\tiny{\mbox{norm}}}$ 中的所有元素的平均值应该接近 0。你可以通过填充以下代码验证这一点:
# Print the average of all the values of X_norm
print(X_norm.mean())
# Print the minimum value of each column of X_norm
print(X_norm.min(axis=0))
# Print the maximum value of each column of X_norm
print(X_norm.max(axis=0))
3.90798504668e-18
[-1.72112282 -1.72810634 -1.75510417 -1.73180046 -1.70567088 -1.75546874
-1.75310448 -1.67458958 -1.73767477 -1.69207709 -1.68425496 -1.77073212
-1.69909456 -1.75145458 -1.65293994 -1.70000118 -1.68762343 -1.68652026
-1.70746142 -1.73379653]
[ 1.77802983 1.72104895 1.70045867 1.75054243 1.78609535 1.7104575
1.78341753 1.76788895 1.72197691 1.73202726 1.75850722 1.75033426
1.77507248 1.70611506 1.77887509 1.7676166 1.72273456 1.7748027
1.75197552 1.71732107]
请注意,因为 $X$ 是使用随机整数创建的,因此上述值将有所变化。
数据分离
数据均值标准化后,通常在机器学习中,我们会将数据集拆分为三个集合:
- 训练集
- 交叉验证集
- 测试集
划分方式通常为,训练集包含 60% 的数据,交叉验证集包含 20% 的数据,测试集包含 20% 的数据。
在此部分,你需要将 X_norm 分离成训练集、交叉验证集和测试集。每个数据集将包含随机选择的 X_norm 行,确保不能重复选择相同的行。这样可以保证所有的 X_norm 行都能被选中,并且在三个新的数据集中随机分布。
首先你需要创建一个秩为 1 的 ndarray,其中包含随机排列的 X_norm 行索引。为此,你可以使用 np.random.permutation() 函数。np.random.permutation(N) 函数会创建一个从 0 到 N - 1的随机排列的整数集。我们来看一个示例:
# We create a random permutation of integers 0 to 4
np.random.permutation(5)
array([4, 3, 2, 1, 0])TODO
在下面的空白处,创建一个秩为 1 的 ndarray,其中包含随机排列的 X_norm 行索引。用一行代码就能搞定:使用 shape 属性提取 X_norm 的行数,然后将其传递给 np.random.permutation() 函数。注意,shape 属性返回一个包含两个数字的元组,格式为 (rows,columns)。
# Create a rank 1 ndarray that contains a random permutation of the row indices of `X_norm`
row_indices = np.random.permutation(X_norm.shape[0])
print(row_indices)
[530 679 250 649 202 527 682 949 842 881 492 699 632 835 713 897 210 257
538 558 578 124 989 891 404 182 219 268 78 651 197 355 818 624 609 254
564 768 581 893 741 864 161 328 321 878 231 361 496 147 409 695 267 610
614 52 358 498 307 980 518 479 541 179 6 345 805 526 240 85 489 226
336 770 617 573 340 819 45 326 142 915 91 569 921 439 999 509 674 505
929 484 750 661 174 352 707 575 583 930 613 430 169 333 303 56 13 51
554 400 625 105 686 136 593 664 34 867 180 415 923 337 368 760 884 706
252 673 410 888 418 535 467 716 435 608 965 408 633 168 874 870 461 759
184 576 623 722 844 663 605 401 887 979 104 683 388 802 150 454 140 414
931 906 175 82 351 698 851 832 718 764 39 742 77 487 520 382 546 285
781 503 705 725 803 292 570 766 289 745 288 577 671 207 841 847 282 667
325 531 18 843 737 259 757 916 753 957 17 974 588 411 19 1 919 762
40 937 260 291 265 459 810 629 701 171 712 774 752 971 274 442 655 245
592 536 869 70 700 596 122 488 48 60 880 471 543 349 947 183 675 112
582 115 3 668 200 909 448 814 364 10 338 696 74 273 374 922 493 96
542 42 788 853 830 680 211 32 904 907 93 598 31 346 263 305 98 65
604 872 836 12 83 628 627 378 348 331 302 69 146 73 306 777 453 76
761 643 652 158 812 779 821 963 775 334 902 561 726 466 396 92 665 983
826 206 678 417 464 64 397 217 478 490 507 905 297 59 405 723 37 772
139 936 253 984 703 129 375 4 380 165 729 463 116 982 602 152 377 132
248 137 143 425 831 446 630 839 135 603 615 403 121 955 744 545 589 871
234 90 758 813 7 166 857 271 634 890 236 861 877 26 58 75 519 892
424 407 647 786 251 106 362 223 350 903 549 393 738 773 782 657 754 188
392 185 616 650 172 269 243 384 485 66 279 62 228 315 555 889 981 833
255 160 935 310 811 765 480 552 433 262 914 79 164 693 800 736 763 823
817 35 571 621 514 943 568 798 797 739 24 390 324 294 399 908 208 563
895 117 125 344 449 689 456 304 477 529 28 296 865 500 511 584 804 196
43 422 502 917 956 946 214 925 550 134 825 708 110 994 357 975 123 720
222 920 286 879 783 828 317 419 913 434 327 850 157 365 952 229 416 181
472 437 198 443 55 20 684 145 749 962 339 221 677 423 506 293 721 653
309 468 369 619 421 342 389 235 704 547 524 845 816 383 648 941 429 203
100 371 790 385 178 660 515 63 224 335 497 264 912 740 94 815 491 719
379 256 232 9 595 475 755 15 438 84 281 215 987 928 441 144 944 516
854 809 343 451 658 154 25 953 622 278 49 959 330 533 452 201 318 641
314 612 97 868 218 567 126 562 687 191 57 299 458 50 958 394 990 715
186 697 5 261 690 606 635 927 730 148 978 585 213 525 746 537 838 767
991 977 114 470 747 934 225 220 27 780 457 402 940 499 482 194 794 948
130 939 829 645 778 14 611 985 242 131 732 153 970 852 187 426 193 363
353 495 301 494 367 574 796 532 734 356 685 860 162 996 120 319 395 656
528 11 372 523 636 308 785 53 156 876 227 295 22 177 238 899 717 8
2 341 359 107 539 398 81 88 71 276 969 938 287 553 534 731 16 113
637 960 856 756 354 709 246 597 901 444 599 964 128 834 669 460 320 866
670 329 875 642 280 199 420 988 230 862 283 885 565 23 882 101 626 86
993 820 784 950 728 590 127 548 360 918 954 792 102 735 557 387 711 639
579 47 38 41 694 587 910 173 391 376 837 373 654 29 381 681 666 247
239 951 997 313 859 972 277 44 676 36 450 540 412 556 233 209 61 848
447 933 512 522 791 141 469 508 801 714 486 510 807 151 216 638 481 192
771 432 572 195 644 244 691 33 743 566 436 163 769 30 560 204 133 883
386 733 618 799 476 205 109 440 898 822 995 776 67 966 46 513 873 967
445 976 789 406 473 992 72 551 428 501 87 727 462 483 600 149 945 427
710 808 521 108 316 886 586 631 258 559 266 176 80 591 620 21 640 167
968 646 827 290 284 849 702 275 322 942 840 748 601 89 659 688 863 795
272 961 580 986 311 806 932 504 237 249 900 431 894 190 793 855 998 926
824 95 138 103 751 212 924 724 474 544 787 298 370 896 155 607 323 118
846 170 0 111 594 119 159 99 692 54 366 911 413 858 332 189 455 312
517 662 270 241 672 973 465 300 68 347]
现在,你可以使用 row_indices ndarray 创建三个数据集,并选择进入每个数据集的行。注意,训练集包含 60% 的数据,交叉验证集包含 20% 的数据,测试集包含 20% 的数据。每个集合都只需一行代码就能创建。请填充以下代码
# Make any necessary calculations.
# You can save your calculations into variables to use later.
# Create a Training Set
X_train =
# Create a Cross Validation Set
X_crossVal =
# Create a Test Set
X_test =
如果你正确地完成了上述计算步骤,那么 X_tain 应该有 600 行和 20 列,X_crossVal 应该有 200 行和 20 列,X_test 应该有 200 行和 20 列。你可以通过填充以下代码验证这一点:
# Print the shape of X_train
# Print the shape of X_crossVal
# Print the shape of X_test
为者常成,行者常至
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)