Python机器学习 ch02代码学习1
1 import numpy as np 2 3 4 class Perceptron(object): 5 """Perceptron classifier. 6 7 Parameters 8 ------------ 9 eta : float 10 Learning rate (between 0.0 and 1.0) 11 n_iter : int 12 Passes over the training dataset. 13 random_state : int 14 Random number generator seed for random weight 15 initialization. 16 17 Attributes 18 ----------- 19 w_ : 1d-array 20 Weights after fitting. 21 errors_ : list 22 Number of misclassifications (updates) in each epoch. 23 24 """ 25 def __init__(self, eta=0.01, n_iter=50, random_state=1): 26 #注意,这里的random_state是控制随机数的种子,让他为固定值是为了让W权重的值大家运行都一样 27 #是作者便于理解添加的,其实可以省去。 28 self.eta = eta #学习速率 29 self.n_iter = n_iter #预设运行50次 30 self.random_state = random_state #随机数种子 31 32 #补充理解,这里视频在理解实例化的时候提到了,self就是后面调用这个的变量 33 #所以我们在后面使用的时候是 XXX.eta 这样的类型,其实这时候XXX就代表的是self 34 #便于理解和记忆实例化的格式 35 36 37 def fit(self, X, y): 38 """Fit training data. 39 40 Parameters 41 ---------- 42 X : {array-like}, shape = [n_samples, n_features] 43 Training vectors, where n_samples is the number of samples and 44 n_features is the number of features. 45 y : array-like, shape = [n_samples] 46 Target values. 47 48 Returns 49 ------- 50 self : object 51 52 """ 53 #关于python中的shape要注意的是 54 #shape定义的是矩阵,而不是列表序列元组这种东西 55 #所以定义上述的时候 56 #定义单一行向量或者列向量的时候,记得使用[X,],[,X]的形式 57 #而不要使用[X,1]这样的形式 58 #因为计算机会认为这是二维的,而不是一维的 59 60 rgen = np.random.RandomState(self.random_state) 61 self.w_ = rgen.normal(loc=0.0, scale=0.01, size=1 + X.shape[1]) 62 #鸢尾花只有四组数据,但是我们在公式中,添加了W0和X0组成的截距项 63 #所以这里一共要取出5个数 64 #而X.shape[1]=4,X.shape[0]=150;因为鸢尾花共150组数据 65 #在同一个类中,也是可以继续定义self的数据来实例化的 66 #看个人喜好来 67 self.errors_ = [] 68 #用于存储有误的数据 69 70 """ 71 网摘 normal函数的意义和使用 72 这是的np是numpy包的缩写,np.random.normal()的意思是一个正态分布,normal这里是正态的意思。 73 我在看孪生网络的时候看到这样的一个例子:numpy.random.normal(loc=0,scale=1e-2,size=shape) ,意义如下: 74 参数loc(float):正态分布的均值,对应着这个分布的中心。loc=0说明这一个以Y轴为对称轴的正态分布, 75 参数scale(float):正态分布的标准差,对应分布的宽度,scale越大,正态分布的曲线越矮胖,scale越小,曲线越高瘦。 76 参数size(int 或者整数元组):输出的值赋在shape里,默认为None。 77 """ 78 79 #注意这个地方,因为我们不需要在迭代中使用到这个数据 80 #所以我们直接简化成 _ 作为变量从0变化到49完成50次 81 for _ in range(self.n_iter): 82 errors = 0 83 for xi, target in zip(X, y): 84 update = self.eta * (target - self.predict(xi)) 85 self.w_[1:] += update * xi 86 self.w_[0] += update 87 errors += int(update != 0.0) 88 #存贮判断错误了多少次 89 self.errors_.append(errors) 90 #用append函数来添加数据 91 return self 92 #zip函数,及讲数据两两组合到一起 93 #然后通过in 分别转给xi 和 target ,就是xi保存的是X的数据,target保存的是y的数据 94 #xi是原数据,target保存的是正确答案 95 96 #self.w_[1:] += update * xi 97 #这段其实做的是切片操作 98 #意思是讲w_序列从w_[1]开始,并包括w_[1],和后面一起组成一个序列 99 #这样的意义是,在原公式中是 变化后的W=原来的的W+update*对应的X 100 #我们知道W0的值一定是1 101 #所以分开来计算上述的W 102 """ 103 网摘 104 a = [1,2,3] 105 b = [4,5,6] 106 c = [4,5,6,7,8] 107 zipped = zip(a,b) # 打包为元组的列表 108 [(1, 4), (2, 5), (3, 6)] 109 zip(a,c) # 元素个数与最短的列表一致 110 [(1, 4), (2, 5), (3, 6)] 111 zip(*zipped) # 与 zip 相反,*zipped 可理解为解压,返回二维矩阵式 112 [(1, 2, 3), (4, 5, 6)] 113 """ 114 115 116 def net_input(self, X): 117 """Calculate net input""" 118 return np.dot(X, self.w_[1:]) + self.w_[0] 119 #另外测试这串代码 120 121 def predict(self, X): 122 """Return class label after unit step""" 123 return np.where(self.net_input(X) >= 0.0, 1, -1) 124 #这里就是上面的self.predict的调用 125 #这里的where就相当于一个逻辑式 126 """ 127 if self.net_input>=0.0 128 return 1 129 else 130 return -1 131 132 """
刚刚开始学,如果有问题希望您能指出,谢谢
悟已往之不谏,知来者之可追