详解如何用Python实现感知器算法

作者:Julyers 时间:2023-11-02 13:32:20 

一、题目

详解如何用Python实现感知器算法

二、数学求解过程

详解如何用Python实现感知器算法
详解如何用Python实现感知器算法
详解如何用Python实现感知器算法

该轮迭代分类结果全部正确,判别函数为g(x)=-2x1+1

三、感知器算法原理及步骤

详解如何用Python实现感知器算法

四、python代码实现及结果

(1)由数学求解过程可知:

详解如何用Python实现感知器算法

(2)程序运行结果

详解如何用Python实现感知器算法

(3)绘图结果

详解如何用Python实现感知器算法


'''
20210610 Julyer 感知器
'''
import numpy as np
import matplotlib.pyplot as plt

def get_zgxl(xn, a):
   '''
   获取增广向量
   :param x: 数组
   :param a: 1或-1
   :return:
   '''
   temp = []
   if a == 1:
       xn.append(1)
   if a == -1:
       for i in range(len(xn)):
           temp.append(xn[i]*(-1))
       temp.append(-1)
       xn = temp
   # print('xn:'+ str(np.array(x).reshape(-1, 1)))
   return np.array(xn).reshape(-1, 1)

def calculate_w(w, xn):
   '''
   已知xn和初始值,计算w
   :param w: 列向量 --> wT:行向量
   :param xn: 列向量
   :return:
   '''
   # wT = w.reshape(1, -1)  # 列向量转变为行向量,改变w
   wT = w.T   # 列向量转变为行向量,不改变w
   wTx = np.dot(wT, xn).reshape(-1)  # 行向量乘以列向量, 维度降为1。
   #wTx = wT@xn  # 行向量乘以列向量
   if wTx > 0:
       w_value = w
   else:
       w_value = np.add(w, xn)

# print("w_update的shape" + str(w_update.shape))
   #print("wTx:" + str(wTx))
   return w_value, wTx     # w_value为列向量, wTx为一个数

def fit_one(w1, x1, x2, x3, x4):
   '''
   完成一轮迭代,遍历一次数据,更新到w5。
   :param w1: 初始值
   :param x1:
   :param x2:
   :param x3:
   :param x4:
   :return: 返回w5和wTx的列表。
   '''
   wTx_list = []
   update_w = w1

for i in range(0, len(x_data)): #len计算样本个数,通过循环更新w
       update_w, wTx = calculate_w(update_w, x_data[i])
       wTx_list.append(wTx)

#print(wTx_list)
   return update_w, wTx_list

def draw_plot(class1, class2, update_w):
   plt.figure()

x_coordinate = []
   y_coordinate = []
   for i in range(len(class1)):
       x_coordinate.append(class1[i][0])
       y_coordinate.append(class1[i][1])
   plt.scatter(x_coordinate, y_coordinate, color='orange', label='class1')

x_coordinate = []
   y_coordinate = []
   for i in range(len(class2)):
       x_coordinate.append(class2[i][0])
       y_coordinate.append(class2[i][1])
   plt.scatter(x_coordinate, y_coordinate, color='green', label='class2')

w_reshape = update_w.reshape(-1)
   #print

x = np.linspace(0, 2, 5)
   if w_reshape[1] == 0:
       plt.axvline(x = (-1) * w_reshape[2]/w_reshape[0])
   else:
       plt.plot(x, (x*w_reshape[0]*(-1) + w_reshape[2]*(-1))/w_reshape[1])

plt.title('result of perception')
   plt.xlabel('x1')
   plt.ylabel('x2')
   plt.legend()
   plt.show()

if __name__ == '__main__':
   x1 = [0, 0]
   x2 = [0, 1]
   x3 = [1, 0]
   x4 = [1, 1]
   class1 = [x1, x2]
   class2 = [x3, x4]

x1 = get_zgxl(x1, 1)
   x2 = get_zgxl(x2, 1)
   x3 = get_zgxl(x3, -1)
   x4 = get_zgxl(x4, -1)
   x_data = [x1, x2, x3, x4]
   # print(x_data)

w1 = np.zeros((3, 1))  # 初始值w1为列向量
   #print('w1:' + str(w1) + '\n')

update_w = w1
   update_w, wTx_list = fit_one(update_w, x1, x2, x3, x4)

count = 0
   iter_number = 0

for wTx in wTx_list:
       if wTx > 0:
           count += 1
       if count < 4:
           update_w, wTx_list = fit_one(update_w, x1, x2, x3, x4)
           iter_number += 1
       else:
           break

print('迭代次数为:' + str(iter_number))
   print('迭代终止时的w:'+'\n' + str(update_w))
   #print(wTx_list)
   draw_plot(class1, class2, update_w)

来源:https://blog.csdn.net/weixin_41631106/article/details/117899297

标签:Python,感知器,算法
0
投稿

猜你喜欢

  • python PyTorch参数初始化和Finetune

    2023-04-26 08:53:44
  • Flask框架踩坑之ajax跨域请求实现

    2023-12-25 01:28:02
  • python在命令行下使用google翻译(带语音)

    2023-06-02 13:47:17
  • Oracle 忘记密码的找回方法

    2009-03-06 11:12:00
  • 详解用Python处理HTML转义字符的5种方式

    2021-01-27 20:53:17
  • SQLite3数据库的介绍和使用教程(面向业务编程-数据库)

    2024-01-28 20:40:07
  • 利用hasOwnProperty给数组去重的面试题分享

    2023-08-06 20:48:37
  • PHP与Web页面交互操作实例分析

    2023-09-05 14:43:16
  • python 实现socket服务端并发的四种方式

    2022-08-09 22:19:46
  • php判断输入不超过mysql的varchar字段的长度范围

    2023-11-14 12:02:10
  • 使用Python中的pytesseract模块实现抓取图片中文字

    2021-05-06 18:10:28
  • django第一个项目127.0.0.1:8000不能访问的解决方案详析

    2021-05-21 14:01:38
  • pyecharts结合flask框架的使用

    2022-12-01 18:37:25
  • 适合所有表的添加、删除、修改的函数

    2008-04-15 15:29:00
  • javascript创建数组的最简代码

    2013-09-01 21:43:04
  • 在Django中实现添加user到group并查看

    2021-12-08 21:47:07
  • 细化解析:MySQL 搜索中的大小写敏感性

    2008-11-27 15:53:00
  • ASP初学者学习ASP指令

    2008-10-14 17:27:00
  • struts2.3.24+spring4.1.6+hibernate4.3.11+mysql5.5.25开发环境搭建图文教程

    2024-01-18 04:21:31
  • 浅谈pytorch池化maxpool2D注意事项

    2023-07-14 15:02:30
  • asp之家 网络编程 m.aspxhome.com