详解如何用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 cookielib 登录人人网的实现代码
Dec 19 Python
详解Python中open()函数指定文件打开方式的用法
Jun 04 Python
利用Python爬取微博数据生成词云图片实例代码
Aug 31 Python
python3设计模式之简单工厂模式
Oct 17 Python
使用Python机器学习降低静态日志噪声
Sep 29 Python
解决python3读取Python2存储的pickle文件问题
Oct 25 Python
Python模块、包(Package)概念与用法分析
May 31 Python
Python编写通讯录通过数据库存储实现模糊查询功能
Jul 18 Python
seek引发的python文件读写的问题及解决
Jul 26 Python
在python Numpy中求向量和矩阵的范数实例
Aug 26 Python
Python Pillow(PIL)库的用法详解
Sep 19 Python
Python 生成短8位唯一id实战教程
Jan 13 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
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
PHP+redis实现的悲观锁机制示例
2018/06/12 PHP
多广告投放代码 推荐
2006/11/13 Javascript
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
20款效果非常棒的 jQuery 插件小结分享
2011/11/18 Javascript
Javascript处理DOM元素事件实现代码
2012/05/23 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
Javascript封装DOMContentLoaded事件实例
2014/06/12 Javascript
原生JS和JQuery动态添加、删除表格行的方法
2015/05/28 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
Webpack path与publicPath的区别详解
2018/05/03 Javascript
jQuery Raty星级评分插件使用方法实例分析
2019/11/25 jQuery
六个窍门助你提高Python运行效率
2015/06/09 Python
利用PyInstaller将python程序.py转为.exe的方法详解
2017/05/03 Python
Python 多维List创建的问题小结
2019/01/18 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
Django 反向生成url实例详解
2019/07/30 Python
python Web flask 视图内容和模板实现代码
2019/08/23 Python
Python面向对象编程基础实例分析
2020/01/17 Python
浅析rem和em和px vh vw和% 移动端长度单位
2016/04/28 HTML / CSS
html5教程实现Photoshop渐变色效果
2013/12/04 HTML / CSS
Roxy美国官网:澳大利亚冲浪、滑雪健身品牌
2016/07/30 全球购物
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
初三家长会邀请函
2014/01/18 职场文书
班组长竞聘书
2014/03/31 职场文书
市政管理求职信范文
2014/05/07 职场文书
硕士生找工作求职信
2014/07/05 职场文书
反腐倡廉剖析材料
2014/09/30 职场文书
债务纠纷委托书范本
2014/10/14 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
2021/12/06 MySQL
详解JavaScript的计时器和按钮效果设置
2022/02/18 Javascript
Mysql 一主多从的部署
2022/05/20 MySQL
字节飞书面试promise.all实现示例
2022/06/16 Javascript