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         """

刚刚开始学,如果有问题希望您能指出,谢谢

悟已往之不谏,知来者之可追
原文地址:https://www.cnblogs.com/ljh-study/p/14421792.html