加深理解神经元的工作原理:感知机预测的实现
怎么去理解一个神经元的工作原理? 加权求和,激活函数. 这些概念反反复复的就是记不住,怎么理解监督学习,权重更新规则,这些理论模模糊糊总是理解不到. 下面用一个简单的例子.加深上面这些内容的理解
使用Python和NumPy(不使用深度学习框架),实现一个感知机,用于对一个简单的逻辑门(AND;OR)进行分类
数据集:
AND逻辑门的数据:
输入:[0, 0], 标签 0
输入:[0, 1], 标签 0
输入:[1, 0],标签 0
输入:[1, 1],标签 1
要求:
1.创建一个Perceptron类
2.类中应包含weights和偏置bias
3.实现predict方法,遍历数据集,如果预测错误,则根据感知机学习规则更新权重和偏置:
w_new = w_old + learning_rate * (label - prediction) * x
b_new = b_old + learning_rate * (label -prediction)
训练你的感知机,并验证它能正确预测AND逻辑门的所有输入
#定义一个预测机
class Perceptron: #learning_rate 学习率:控制步长 #input_size (int):输入特征的数量(对于AND门是2) 比如与房价相关的特征[面积,地点,学 #区...] 有8个特征 这里的input_size 就是8 def __init__(self, input_size, learning_rate=0.1): #初始化特征对应的每一个权重 self.weights = np.random.rand(input_size) * 2 - 1 #初始化偏置,随机初始化一个值 self.bias = np.random.rand(1) *2 -1 #保存学习率 self.lr = learning_rate #bias[0] 这是一个只有一个元素的NumPy数组,[0]用来获取这个元素的值 #:.4f 这是格式说明,表明开始格式化, .4表示保留4位小数, f表示浮点数(float)形式显示 print(f"初始化权重:{self.weight},初始化偏置:{self.bias[0]:.4f}") def activation_function(self, x): return 1 if x > 0 else 0 def predict(self, inputs): weighted_sum = np.dot(self.weights, inputs) + self.bias return self.activation_function(weighted_sum) #开始训练 #trainning_inputs (list of lists):训练数据集的输入 #epochs (int):训练的轮数,即将整个数据集重复学习的次数 #labels (list):训练数据集的标签,也就是每个输入对应的正确输出 def train(self, training_inputs, labels, epochs=10): for epoch in range(epochs): total_error = 0 for inputs, label in zip(trainning_inputs, labels): #将输入转换为numpy数组 inputs = np.array(inputs) #1.进行预测 prediction = self.predict(inputs) #计算误差 error = label - prediction #如果有误差,就更新权重 if error != 0: total_error += 1 update = self.lr * error self.weights += update * inputs self.bias += update print(f"第{epochs+1}轮;错误数 = {total_error}, 当前权重 = {self.weights}, 当前偏置 = {self.bias[0]:.4f}") #如果一轮下来没有任何错误,说明已经收敛,可以结束训练 if total_error = 0: print("训练完成,模型已收敛") break print("----训练结束-----") if __name__ == "__main__": training_inputs = [ [0, 0], [0, 1], [1, 0], [0, 1] ] labels = [0, 0, 0, 1] #常见一个感知实例, 输入特征是2个 (x1, x2) perceptron = Perceptron(input_size=2) #训练感知机 其实就是不断的更新权重和偏置 perceptron.train(traning_inputs, labels) #测试训练好的感知机, AND门:因为数据集太小,我们通常用traning_inpus本身来测 #试 即test_cases = [[0, 0], [0, 1], [1, 0],[1, 1]] test_cases = [ [0, 0], [0, 1], [1, 0], [1, 1] ] for test_input in test_cases: prediction = perceptron.predict(np.array(test_input)) print(f"输入:{test_input}, 预测输出:{prediction}")讲一下np的语法
np 是NumPy库的常用别名,NumPy是Python进行科学计算的核心库,特别擅长处理多维数据(矩阵)
np.random.rand(input_size)会创建一个形状为(input_size)的NumPy数组,其中每个元素都是[0.0, 1.0]区间内的随机浮点数
例如 如果input_size 是3,它可能会生成[0.12, 0.85, 0.34]
*2-1 (向量化操作), 这是NumPy的一个强大功能,叫做向量化, 这个操作会对数组中的每一个元素执行*2-1的计算. 而不需要写for循环
[0.0, 1.0]区间的随机数经过*2变成[0.0, 2.0],再-1就变成了[-1.0 , 1.0]区间
在机器学习中,将权重初始化在-1到1之间的对称区间通常比0到1更好,有助于模型更快,更稳定地收敛
讲一下zip的语法
zip函数把多个可迭代的对象压缩在一起,然后返回一个迭代器,这个迭代器每次会生成一个元祖(tuple),元祖中的元素分别来自于你传入的每个可迭代对象的对应位置
假设你有两个列表 一个记录学生姓名,一个记录考试成绩
students = ["小明", "小红", "小刚"] scores = [ 90, 95, 82 ] 使用zip将他们配置 paired_data = zip(students, scores) 为了看清zip的结果 我们转换成list print("list(paired_data)")