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


Posted in Python onJune 18, 2021
目录
  • 一、题目
  • 二、数学求解过程
  • 三、感知器算法原理及步骤
  • 四、python代码实现及结果

 

一、题目

详解如何用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)

到此这篇关于详解如何用Python实现感知器算法的文章就介绍到这了,更多相关Python实现感知器算法内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python标准库os.path包、glob包使用实例
Nov 25 Python
Python中实现对Timestamp和Datetime及UTC时间之间的转换
Apr 08 Python
深入理解Python中的内置常量
May 20 Python
python 实现求解字符串集的最长公共前缀方法
Jul 20 Python
python使用PIL给图片添加文字生成海报示例
Aug 17 Python
Python3 导入上级目录中的模块实例
Feb 16 Python
基于Python的Post请求数据爬取的方法详解
Jun 14 Python
基于pytorch 预训练的词向量用法详解
Jan 06 Python
如何基于pythonnet调用halcon脚本
Jan 20 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
Apr 16 Python
python使用建议技巧分享(三)
Aug 18 Python
python3判断IP地址的方法
Mar 04 Python
python中24小时制转换为12小时制的方法
Jun 18 #Python
用Python selenium实现淘宝抢单机器人
python中pandas对多列进行分组统计的实现
python 常用的异步框架汇总整理
Jun 18 #Python
Opencv中cv2.floodFill算法的使用
Python下opencv使用hough变换检测直线与圆
python 网络编程要点总结
Jun 18 #Python
You might like
用PHP将数据导入到Foxmail的实现代码
2010/09/05 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
小型js框架veryide.librar源代码
2009/03/05 Javascript
在Javascript中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别
2013/04/15 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
jquery自定义表单验证插件
2016/10/12 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
2016/11/02 Javascript
基于JavaScript实现简单的音频播放功能
2018/01/07 Javascript
AngularJS 应用模块化的使用
2018/04/04 Javascript
微信小程序如何像vue一样在动态绑定类名
2018/04/17 Javascript
JS Ajax请求会话过期处理问题解决方法分析
2019/11/16 Javascript
javaScript中indexOf用法技巧
2019/11/26 Javascript
vue使用exif获取图片旋转,压缩的示例代码
2020/12/11 Vue.js
python简单获取本机计算机名和IP地址的方法
2015/06/03 Python
Python图形绘制操作之正弦曲线实现方法分析
2017/12/25 Python
解析Python的缩进规则的使用
2019/01/16 Python
将pip源更换到国内镜像的详细步骤
2019/04/07 Python
用python3 urllib破解有道翻译反爬虫机制详解
2019/08/14 Python
详解Python IO口多路复用
2020/06/17 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
2020/07/02 Python
opencv 图像轮廓的实现示例
2020/07/08 Python
Python爬虫代理池搭建的方法步骤
2020/09/28 Python
Pycharm在指定目录下生成文件和删除文件的实现
2020/12/28 Python
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
HTML5实现移动端复制功能
2018/04/19 HTML / CSS
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
STRATHBERRY苏贝瑞包包官网:西班牙高级工匠手工打造
2020/11/10 全球购物
拖鞋店创业计划书
2014/01/15 职场文书
2014政务公开实施方案
2014/02/19 职场文书
社区居务公开实施方案
2014/03/27 职场文书
运动会开幕式主持词
2014/03/28 职场文书
酒后驾车标语
2014/06/30 职场文书
高中教师个人总结
2015/02/10 职场文书
环保守法证明
2015/06/24 职场文书
详解JAVA的控制语句
2021/11/11 Java/Android
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android