Python机器学习ch02 代码学习2
1 #############第二部分#################### 2 3 v1 = np.array([1, 2, 3]) 4 v2 = 0.5 * v1 5 np.arccos(v1.dot(v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))) 6 7 import pandas as pd 8 9 df = pd.read_csv('https://archive.ics.uci.edu/ml/' 10 'machine-learning-databases/iris/iris.data', header=None) 11 df.tail() 12 #tail方法 13 #tail()方法一般用来对数据集进行矩阵形式的显示,默认显示为数据集的最后5行 14 #tail可以用来显示对应数据的倒数的几行数据 15 16 #反之可以使用head()来打印前面的数据 ,head也是默认5行 17 18 #%matplotlib inline 19 #这是在Jupyter中的一个指令 20 #意思是在当前代码段结束后生成画布 21 #对应你这段代码中的plot,所以直接用Python打开是会报错的 22 23 import matplotlib.pyplot as plt 24 import numpy as np 25 26 # select setosa and versicolor 27 y = df.iloc[0:100, 4].values 28 y = np.where(y == 'Iris-setosa', -1, 1) 29 #通过判断y是否等于这个种类,来分出两个数据来 30 31 ''' 32 iloc 表示,切割矩阵,XXX.iloc[行,列] 33 #视频中台湾老师认为行=列 列=栏 34 这里的行0:100即从0行,一直到往后走100行的数据都保存,所以会保存到99行 35 后面的.value是返还一个迭代器,目的是让后面数据可以被numpy操作 36 ''' 37 38 # extract sepal length and petal length 39 X = df.iloc[0:100, [0, 2]].values 40 #这里是选择了前100行数据,的第0列和第2列的数据进行的提取 41 42 # plot data 43 plt.scatter(X[:50, 0], X[:50, 1], 44 color='red', marker='o', label='setosa') 45 plt.scatter(X[50:100, 0], X[50:100, 1], 46 color='blue', marker='x', label='versicolor') 47 48 plt.xlabel('sepal length [cm]') 49 plt.ylabel('petal length [cm]') 50 plt.legend(loc='upper left') 51 52 ''' 53 这里plt.scatter绘制散点图 54 前两个位置为X,Y,用来导入数据的,marker控制形状 label表示这类数据的名称 55 plt.xlabel('sepal length [cm]') 56 plt.ylabel('petal length [cm]') 57 这里的用法就是和matlab一致,坐标轴的名称设置 58 59 plt.legend(loc='upper left') 60 这里是控制之前设置的两个变量的名称显示的位置,一般填0让电脑自己去找最合适的位置 61 62 ''' 63 64 # plt.savefig('images/02_06.png', dpi=300) 65 plt.show() 66 #显示画布 67 68 69 ppn = Perceptron(eta=0.1, n_iter=10) 70 #实例化ppn,并重新定义eta学习速率,和n_iter学习次数 71 ppn.fit(X, y) 72 #运行我们之前写的机器学习的算法 73 plt.plot(range(1, len(ppn.errors_) + 1), ppn.errors_, marker='o') 74 plt.xlabel('Epochs') 75 plt.ylabel('Number of updates') 76 77 ''' 78 range()用来建立一个可迭代对象 79 range(1,5)表示从1开始,到5结束()但是不包括5 80 所以真正的数据只有1,2,3,4. 81 len()用来求数据长度,每次运行一次 82 都会返还一个error,返还的error会在后面不断叠加来变化长度 83 84 plot和上面的scatter类似,就不多说了 85 86 ''' 87 88 # plt.savefig('images/02_07.png', dpi=300) 89 plt.show() 90 #输出画板 91 92 93 94 from matplotlib.colors import ListedColormap 95 #Python这个ListedColormap本身是存在的,作用是从cool到warm来调整颜色 96 def plot_decision_regions(X, y, classifier, resolution=0.02): 97 #原数据 正确答案 实例化后的数据 分辨率设置,或者说是待会撒点的步长 98 99 # setup marker generator and color map 100 markers = ('s', 'x', 'o', '^', 'v') 101 colors = ('red', 'blue', 'lightgreen', 'gray', 'cyan') 102 cmap = ListedColormap(colors[:len(np.unique(y))]) 103 104 ''' 105 markers中常用三个,o原点 ,x叉叉 ,s正方形 106 cmap = ListedColormap(colors[:len(np.unique(y))]) 107 建立一个新变量 cmap 让他调用ListedColormap,然后对colors做切片[:XXX] 108 例如colors[:3]即得到的是'red', 'blue', 'lightgreen' 109 之后调用len(np.unique(y)) 110 unique是numpy中用来找有一个不同的量的方法 111 在正确答案中找到了几种不同类型,用len求出长度,就得到了应该做几种的颜色分类 112 113 114 ''' 115 116 # plot the decision surface 117 x1_min, x1_max = X[:, 0].min() - 1, X[:, 0].max() + 1 118 x2_min, x2_max = X[:, 1].min() - 1, X[:, 1].max() + 1 119 #求出x1,x2数据的边界 120 121 xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), 122 np.arange(x2_min, x2_max, resolution)) 123 #建立一个两个相同shape的矩阵。 124 125 Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T) 126 #通过ravel()将二维的矩阵拉成一维的,再通过array将其组成数组, 127 #这个时候其数据是一个2*N的和长的矩阵 128 #是上下两两对应的,我们通过.T来转置成N*2的矩阵,这样就是左右两两对应的了 129 #通过上面一整套调用到predict完成对Z数据的分类 130 #这个时候的Z就是1和-1的内容了 131 Z = Z.reshape(xx1.shape) 132 #通过reshape方法将Z转化成和Z一样的格式 133 plt.contourf(xx1, xx2, Z, alpha=0.3, cmap=cmap) 134 plt.xlim(xx1.min(), xx1.max()) 135 plt.ylim(xx2.min(), xx2.max()) 136 #定义x,y轴的范围 137 138 ''' 139 range()和arange() 140 range只能迭代产生整数,而arange可以产生小数,numpy.arange(0,1,0.2) 141 产生从0到1,但是不能碰到1, 每次变化0.2的一组数据 142 143 plt.contourf(xx1, xx2, Z, alpha=0.3, cmap=cmap) 144 用于绘制等高线,xx1 xx2表示导入的点的x,y轴的数据,Z就表示其含义,或者说是Z轴的数据,虽然只有1和-1 145 alpha表示透明度, cmap即调色板,这里因为我们上面重写了调色板,所以这里调用的是上面的调色板 146 147 148 ''' 149 150 #下面这一段是将原始的数据,就是上面第一张产生的图给画进来 151 # plot class samples 152 for idx, cl in enumerate(np.unique(y)): 153 plt.scatter(x=X[y == cl, 0], 154 y=X[y == cl, 1], 155 alpha=0.8, 156 c=colors[idx], 157 marker=markers[idx], 158 label=cl, 159 edgecolor='black') 160 ''' 161 enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。 162 这里我们读取y类,y中的数据是花的类型,所以这里产生的是两个数据 163 通过np.unique将y找出为两种即成为[A类,B类] 164 用enumerate将其自动排序成0,1并存储至idx中 165 cl保存的是y的原数据 166 ''' 167 168 plot_decision_regions(X, y, classifier=ppn) 169 plt.xlabel('sepal length [cm]') 170 plt.ylabel('petal length [cm]') 171 plt.legend(loc='upper left') 172 173 174 # plt.savefig('images/02_08.png', dpi=300) 175 plt.show()
悟已往之不谏,知来者之可追