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()

 

posted @ 2021-03-03 16:48  想活出点人样  阅读(129)  评论(0编辑  收藏  举报