zoukankan      html  css  js  c++  java
  • 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         """

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

    悟已往之不谏,知来者之可追
  • 相关阅读:
    poj 2251 Dungeon Master-搜索进阶-暑假集训
    棋盘问题-POJ 1321
    Popular Cows
    The Factor
    整数解 (hdu 2092
    Strange fuction hdu 2899
    Factors and Multiples
    Trailing Zeroes (III) -;lightoj 1138
    Swap——hdu 2819
    Arithmetic Sequence
  • 原文地址:https://www.cnblogs.com/ljh-study/p/14421792.html
Copyright © 2011-2022 走看看