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 """
python ikpt 机器人运动学 python机器人代码
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章