详解如何用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编程中运用闭包时所需要注意的一些地方
May 02 Python
Python中的choice()方法使用详解
May 15 Python
Python实现LRU算法的2种方法
Jun 24 Python
Python中Class类用法实例分析
Nov 12 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
May 08 Python
python遍历小写英文字母的方法
Jan 02 Python
python基于C/S模式实现聊天室功能
Jan 09 Python
TensorFlow-gpu和opencv安装详细教程
Jun 30 Python
django创建css文件夹的具体方法
Jul 31 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
Mar 04 Python
解决Python import .pyd 可能遇到路径的问题
Mar 04 Python
pandas:get_dummies()与pd.factorize()的用法及区别说明
May 21 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
第一节--面向对象编程
2006/11/16 PHP
dede3.1分页文字采集过滤规则详说(图文教程)续二
2007/04/03 PHP
zend framework配置操作数据库实例分析
2012/12/06 PHP
百度实时推送api接口应用示例
2014/10/21 PHP
php+mysql数据库查询实例
2015/01/21 PHP
php把数组值转换成键的方法
2015/07/13 PHP
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
下拉列表select 由左边框移动到右边示例
2013/12/04 Javascript
js面向对象编程之如何实现方法重载
2014/07/02 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
2015/05/06 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
2016/07/20 Javascript
JS 拼凑字符串的简单实例
2016/09/02 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
浅谈MVC+EF easyui dataGrid 动态加载分页表格
2016/11/10 Javascript
微信小程序开发实战教程之手势解锁
2016/11/18 Javascript
webpack中的热刷新与热加载的区别
2018/04/09 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
JavaScript Event Loop相关原理解析
2020/06/10 Javascript
Python实现国外赌场热门游戏Craps(双骰子)
2015/03/31 Python
使用Python下的XSLT API进行web开发的简单教程
2015/04/15 Python
对python3新增的byte类型详解
2018/12/04 Python
selenium+python自动化测试之环境搭建
2019/01/23 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
在pytorch中动态调整优化器的学习率方式
2020/06/24 Python
最新PyCharm 2020.2.3永久激活码(亲测有效)
2020/11/26 Python
python爬虫beautifulsoup解析html方法
2020/12/07 Python
AmazeUI 缩略图的实现示例
2020/08/18 HTML / CSS
应届毕业生自我评价分享
2013/12/15 职场文书
《月光启蒙》教学反思
2014/03/01 职场文书
学习退步检讨书
2014/09/28 职场文书
六一儿童节开幕词
2015/01/29 职场文书
2015年财务经理工作总结
2015/05/13 职场文书
七年级英语教学反思
2016/02/15 职场文书
学习师德师风的心得体会(2篇)
2019/10/08 职场文书
k-means & DBSCAN 总结
2021/04/27 Python
OpenCV-Python实现怀旧滤镜与连环画滤镜
2021/06/09 Python