一个与或非感知机

感知机 一个简单的 二分类模型 支持向量机 支持向量机的目的是为了找到一条曲线或者一个超平面,能够将两种类别最大程度地分离开来 以二元函数为例 对于任意函数 ax1+bx2+c=0且a,b≠0 ax_1+bx_2+c=0 且 a,b \not=0ax1​+bx2​+c=0且a,b​=0 为了简化 令a,b,c=1 x1+x2+1=0且a,b≠0 x_1+x_2+1=0 且 a,b \not=0x1​+x2​+1=0且a,b​=0 这样我们可以做出图形 此时我们从图上任意取一个曲线上方的点,比如(9,-6)可以看出在曲线的 阅读详情

分享个python实例,自己写的一个感知机,仅供学习,自行调整参数,修改代码!

效果图:
在这里插入图片描述

代码分享:

import numpy as np
import matplotlib.pyplot as plt

class Perceptron(object):
    """
    根据课上所学,实现了一个感知机,包括AND, OR, NOT, 可以使用正态分布的样本数据
    感知机原理可参考:https://zhuanlan.zhihu.com/p/29836398  https://zhuanlan.zhihu.com/p/42438035
    https://blog.youkuaiyun.com/u012759262/article/details/101943109
    """

    def __init__(self, kind='AND'):
        self.weights = np.array([0.2, 0.4], ndmin=2)  # 初始化权重,为图方便硬编码了
        self.bias = 0.1  # 初始化偏置,为图方便硬编码了
        self.inputs = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])  # (m,2)矩阵 m:=dataSize,每个样本数据为二维,即2个特征,(f1, f2)
        if kind.upper() == 'AND':
            self.labels = np.array([[-1], [-1], [-1], [1]])  # AND  (m,1)矩阵
        elif kind.upper() == 'OR':
            self.labels = np.array([[-1], [1], [1], [1]])  # OR
        elif kind.upper() == 'NOT':
            # NOT, w2 cannot be zero, let w1 be zero, so have to make labels like this
            self.labels = np.array([[-1], [1], [-1], [1]])
        else:  # default is AND perceptron
            self.labels = np.array([[-1], [-1], [-1], [1]])  # AND  (m,1)矩阵
        self.dataSize = self.labels.size
        self.misclassifiedSet = np.array(np.zeros((self.dataSize, 1), dtype=int))  # 错分集标识初始化,(m,1)矩阵
        self.learningRate = 0.1  # adjust this when necessary
        self.errors = np.array([])  # errors in each iteration
        self.fig, self.axes = plt.subplots(1, 2)  # for plotting diagram
        self.initDiagram()
        self.firstPlot = True  # just for special usage

    def __str__(self):
        """
        输出训练后的感知机学习到的权重、偏置
        """
        return 'weights\t:%s\nbias\t:%f\n' % (self.weights, self.bias)

    def initDiagram(self):
        self.fig.set_size_inches(10, 5)  # set figure window size (10 inches * 5 inches)
        # plt.figure(figsize=(10, 5))
        self.axes[0].set_title('Perceptron Demo')
        self.axes[0].axis('scaled')
        # self.axes[0].axis('square')
        # self.axes[0].axis([-1, 2, -1, 2])
        self.axes[0].axis([0, 9, 0, 9])
        self.axes[0].set_xlabel('feature 1')
        self.axes[0].set_ylabel('feature 2')
        self.axes[0].grid()

        # self.axes[1].axis('scaled')
        self.axes[1].set_title('Cost Curve')
        # self.axes[1].axis([0, 30, -10, 0.5])
        self.axes[1].set_xlabel('iteration times')
        self.axes[1].set_ylabel('errors', color='C0')
        self.axes[1].set_xticks(range(0, 50))
        self.axes[1].grid()

    def plotBoundary(self):
        """
        图形可视化,绘制样本点分布,绘制决策边界线,要和show()配合使用
        """
        # .T就是转置, *是numpy特有的,类似C++的指针解引用,这里是二维数组解引用,即降维。而且是先运算的.T然后解引用迭代器
        # plt.plot(*self.inputs.T, 'o')  # [0 0 1 1] [0 1 0 1]
        if self.firstPlot == True:
            for i in range(self.dataSize):
                if self.labels[i] == -1:
                    self.axes[0].plot(*self.inputs[i], 'c.')  # negative sample with marker style 'c.'
                elif self.labels[i] == 1:
                    self.axes[0].plot(*self.inputs[i], 'r+')  # positive sample with maker style 'r+'
        x1 = np.linspace(-1, 6, num=3)  # not necessary to calculate too many points for it's a straight line
        if self.weights[0, 1] != 0:
            x2 = (-self.bias * np.ones(3) - self.weights[0, 0] * x1) / self.weights[0, 1]
            self.axes[0].plot(x1, x2)  # plot decision boundary line
        costX = np.arange(0, self.errors.size, 1)
        print('costX:%s' % costX)
        print('costY:%s' % self.errors)
        self.axes[1].plot(costX, self.errors, 'k-')  # plot cost curve
        plt.pause(0.1)
        self.firstPlot = False  # try comment this line *_<

    def show(self):
        plt.show()

    def adjLearningRate(self, learningRate):
        self.learningRate = learningRate

    def activation(self):
        z = self.weights.dot(self.inputs.T) + self.bias  # 激活输出Z = W·X^T+b  z.shape():=(1,m)
        return z.T  # (m,1)矩阵
        # return 1 if z >= 0 else -1

    def genMisclassifiedSet(self):
        # print('activation output:->\n%s\n<--' % self.activation())
        y = self.activation() * self.labels  # y still is (m,1)
        # print('activation multiplied by label:->\n%s\n<--' % y)
        self.misclassifiedSet.fill(0)  # remember to reset
        errSum = 0
        for i in range(self.dataSize):
            if y[i, 0] <= 0.1:  # criterion, adjust this when necessary
                errSum += y[i, 0]
                self.misclassifiedSet[i] = 1
        self.errors = np.append(self.errors, errSum)
        # print('misclassifiedSet:->\n%s\n<--' % self.misclassifiedSet)

    def training(self, iterationTimes=10):
        if iterationTimes == 10:
            iterationTimes = 50
        iterationCnt = 0
        self.genMisclassifiedSet()
        # until all samples are classified correctly, otherwise just iterate 50 times for it is linearly inseparable
        while self.misclassifiedSet.any() and iterationCnt < iterationTimes:
            iterationCnt += 1
            print('--iteration %d times--' % iterationCnt)
            for i in range(self.dataSize):
                if self.misclassifiedSet[i] == 1:
                    print('--to update param for sample %s--' % self.inputs[i])
                    # print("it's label: " + str(self.labels[i]))
                    # fixed-increment and update once by every misclassified single-sample
                    # that is, a SGD(Stochastic Gradient Descent) algorithm
                    # Cost function: C(w, b) = -Σ y·(w·x + b)  sum on every misclassified sample
                    self.weights += self.learningRate * self.labels[i] * self.inputs[i]  # 核心部分,更新权重
                    print('updated weights: ' + str(self.weights))
                    self.bias += self.learningRate * self.labels[i]  # 核心部分,更新偏置
                    print('updated bias: ' + str(self.bias))
                    # print('--updated param for sample %s--' % self.inputs[i])
            self.genMisclassifiedSet()
            # self.plotBoundary()  # 看过程
        self.plotBoundary()  # 看结果
        self.show()

    def getTraningDataset(self, inputVec, labels):
        """
        支持传入外部训练集学习参数
        :param inputVec: (m,2)矩阵,即m个样本,每个样本2个特征
        :param labels: (m,1)矩阵,即m个样本的标签值
        """
        self.inputs = inputVec
        self.labels = labels
        self.dataSize = self.labels.size
        self.misclassifiedSet = np.array(np.zeros((self.dataSize, 1), dtype=int))
        # print(self.inputs.shape)
        print(self.inputs)
        # print(self.labels.shape)
        print(self.labels)
        # print(self.dataSize)

    def normalDistribData(self, sampleAmount, kind='AND'):
        """
        调用此成员函数,将取代默认的简化感知机,使用高斯正态分布生成模拟样本数据。
        :param sampleAmount: 样本总量
        :param kind: 感知机类型,['AND', 'OR', 'NOT']三选一,不用在意大小写
        """
        if kind.upper() not in ['AND', 'OR', 'NOT']:
            return
        sampleNum = sampleAmount // 4
        mean = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
        cov = np.eye(2) * 0.01  # more bigger the coefficient more a mess
        samples = np.zeros((0, 2))  # (0,2)
        labels = np.zeros((0, 1))  # (0,1)
        for i in range(4):
            temp = np.random.multivariate_normal(mean[i], cov, sampleNum)  # 2-D normal Distribution
            samples = np.append(samples, temp, axis=0)
            if 'AND' == kind.upper():
                isPossitive = mean[i, 0] and mean[i, 1]
            elif 'OR' == kind.upper():
                isPossitive = mean[i, 0] or mean[i, 1]
            elif 'NOT' == kind.upper():
                isPossitive = mean[i, 1]  # 不考虑f1,直接取f2的值即可
            else:
                isPossitive = mean[i, 0] and mean[i, 1]
            if isPossitive:
                labels = np.append(labels, np.ones((sampleNum, 1)), axis=0)
            elif not isPossitive:
                labels = np.append(labels, np.ones((sampleNum, 1)) * -1, axis=0)
        self.getTraningDataset(samples, labels)


def gaussianData():
    positiveNum = int(200 * 0.6)
    negativeNum = int(800 * 0.6)
    mean = np.array([[2, 3], [5, 6]])
    cov = np.eye(2)
    samples = np.zeros((0, 2))
    labels = np.zeros((0, 1))
    temp = np.random.multivariate_normal(mean[0], cov, positiveNum)
    samples = np.append(samples, temp, axis=0)
    labels = np.append(labels, np.ones((positiveNum, 1)), axis=0)

    temp = np.random.multivariate_normal(mean[1], cov, negativeNum)
    samples = np.append(samples, temp, axis=0)
    labels = np.append(labels, np.ones((negativeNum, 1)) * -1, axis=0)
    # for i in range(positiveNum+negativeNum):
    #     if labels[i] == -1:
    #         plt.plot(*samples[i], 'c.')  # negative sample with marker style 'c.'
    #     elif labels[i] == 1:
    #         plt.plot(*samples[i], 'r+')  # positive sample with maker style 'r+'
    # plt.show()
    return samples, labels

if __name__ == '__main__':
    p = Perceptron('not')
    print(p)
    samples, labels = gaussianData()
    p.getTraningDataset(samples, labels)
    # p.normalDistribData(200, 'and')
    # p.normalDistribData(100, 'or')
    # p.normalDistribData(100, 'not')
    # p.genMisclassifiedSet()
    # p.plotBoundary()
    # p.show()
    # p.activation()
    p.training()
    print(p)
Autosar进阶专栏索引 阅读详情

相关推荐

IEDA激活码失效?教你5分钟快速续期的方法

本文针对IEDA激活码失效问题,提供了一套从快速应急到深度排查的完整解决方案。文章不仅详解了5分钟快速续期与清理缓存等应急方法,更深入剖析了授权机制、离线激活流程,并指导如何构建可持续的授权管理策略,帮助开发者彻底解决激活困扰,确保开发环境稳定。

a0b1c2d3的专栏 273

机器学习算法——神经网络2(感知机)

感知机(Perception)是由两层神经元组成。输入层接收外界输入信号后传递给输出层,输出层是M-P神经元,亦称之为“阈值逻辑单元”,如下图所示。 图 两个输入神经元的感知机网络结构示意图 感知机能很容易的实现逻辑与、或、非运算(只考虑0和1的取值)。注意到,假设f是跃阶函数,有 “与”():令,则,仅在时,y=1。 “或”():令,则,仅在或时,y=1。 "非"(),令,则,仅在时,y=0;当时,y=1。 定义感知机: 假设输入空间(特征空间)是,输出空间是y={+1,-1} 输入表.

Vicky_xiduoduo的博客 1955

将Matlab程序打包成.exe独立可执行程序

将Matlab程序打包成.exe独立可执行程序,在未安装Matlab的电脑上也能运行Matlab程序。

简简单单的学习笔记,致力于帮助更多前进路上的朋友~ 5万+

深度学习入门-02通过与或非门实现简单的感知机代码

文章目录1.与门2. 或门3. 与非门4. 异或门 1.与门 与门作为计算机逻辑电路中最经常被提起的,我们将用深度学习思维通过以下代码实现与门的操作。 如果想要得到上图结果,其实就是典型的分类问题。我们要输入的解释变量有两个x1, x2的值,权重和阈值是前人经过反复训练得到的参数,输出的是概率,然后通过阶跃函数转换成0或者1。公式如下: 原生Python代码如下: def AND(x1, x2): w1, w2, theta = 0.5, 0.5, 0.7 # 前人经验 tmp = x1*w1 +

Hhjnv的博客 2877

高速电路的信号完整性分析

摘要:介绍了高速PCB设计中的信号完整性概念以及破坏信号完整性的原因,从理论和计算的层面上分析了高速电路设计中反射和串扰的形成原因,并介绍了IBIS仿真。 关键词:信号完整性 反射 串扰 IBIS仿真 随着半导体技术和深压微米工艺的不断发展,IC的开关速度目前已经从几十MHz增加到几百MHz,甚至达到几GHz。在高速PCB设计中,工程师经常会碰到误触发、阻尼振荡、过冲、欠冲、串...

bh_wang的专栏 1431

SOI LDMOS器件的Sentaurus TCAD建模与关键电学特性仿真研究

本文研究了SOI LDMOS器件的TCAD建模与电学特性仿真。通过Sentaurus TCAD平台建立了单RESURF结构的SOI LDMOS模型,详细阐述了器件结构原理和RESURF耐压机制。研究采用SDE进行几何定义和掺杂配置,在Sentaurus Device中构建了完整的物理模型体系,包括迁移率、复合和碰撞电离模型。通过系统仿真提取了器件的转移特性、输出特性和击穿特性等关键参数,分析了各参数对性能的影响规律。研究结果为功率半导体器件的仿真建模提供了规范化参考,有助于优化SOI LDMOS的性能设计。

huanghm88的专栏 134

机器学习:感知机(Perceptron)从理论到代码

机器学习:感知机算法数据定义模型介绍优化方法局限性 数据定义 假设DataSet∑i=1N(xi,yi)\sum_{i=1}^{N}(x_i,y_i)i=1∑N​(xi​,yi​),其中X∈Rpiid(N,σ2),Y∈(+1,−1)X \in R^{p} \dfrac{iid}{}\left( N,\sigma ^{2}\right),Y\in(+1,-1)X∈Rpiid​(N,σ2),Y∈(+1,−1)w∈Rpw\in R^pw∈Rp 模型介绍 感知机算法主要用来解决而分类问题,它的架构十分简单,采用了

Hanze的博客 1569

量化交易 米筐 案例:市值因子选股策略

案例:市值因子的选股策略 1.结果 获得超额收益 年化 49% 2. 从股票中选择市值小的股票 选定财务数据筛选 进行每日调仓(多因子选股调仓 周期频率会小一些) 3. 代码 估值有关指标 # 在沪深300股票中,选出市值比较小的10只股票 # 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。 def init(context): # 沪深300组合 stocks = index_components('000300.XSHG') # 沪深3

廷益_飞鸟的博客 2313

感知机与、或、 非门的训练

当我写到这个标题的时候感觉超级激动,因为一直以为那是一种被束之高阁的技术,哈哈;但是当我读到这一章的时候,感觉还可以。下面介绍一些,相关的概念和术语; 阈(yu)值[threshold]: 就是一个限制,如果值超过threshold 神经元就会兴奋,也就是输出正样本1 sigmoid函数 激活函数,将实数域的取值压缩到(0-1) M-P神经元 在M-P神经元模型中,神经元接收来自n个其他神经元传递过来的输入信号,再将接收到的输入信号按照某种权重叠加起来,叠加起来的刺激强度S可用公式S=∑i=1nwixiS

大侠isme 4973

若依框架二次开发——RuoYi-AI 本地部署流程

若依框架二次开发——RuoYi-AI 本地部署流程

bjzhang75的博客 1784

22、云数据中心网络(DCN)部署最佳实践

本文详细介绍了云数据中心网络(DCN)部署的最佳实践,涵盖SDN设计、服务网络规划、管理网络规划等方面。通过合理的架构设计、路由规划和组件协同,提升数据中心的自动化水平、可靠性及安全性,以满足不断增长的业务需求。

d6e7f8的博客 187

单层感知器算法(可用于与或非)

输入为x,权重为w,n为输入个数,y为输出 bool output(double x*,double w*,int n,int &y) { while(x==NULL||w==NULL)     return false sum = 0.0 for(int i = 0;i {      sum+=(x[i]*w[i]) } if(sum>0.0)     y =

guorongronghe的博客 5374

AutosarMCAL开发——基于EB Wdg驱动

Autosar标准文件中提及的API共有5个,接口名传入参数说明返回参数函数功能ConfigPtr:Wdg配置指针,参数来自于EB生成代码voidWdg初始化ConfigPtr:Wdg配置指针Wdg初始化检查Wdg切换模式,需开启对应配置timeout:设置定时触发器计数(单位ms)void喂狗并重新设定计数值Wdg版本信息本文为博主个人学习总结记录,如有不正,欢迎指正。

qq_45583706的博客 2426

用R实现一个简单的感知机

1. 感知机模型 定义:假设输入空间(特征空间)是χ⊆Rn,输出空间是Y={+1,−1}。输入x∈X  表示实例的特征向量,对应于输入空间的点;输出y∈Y 表示实例的类别。由输入空间到输出空间的如下函数  f(x)=sign(w⋅x+b) 称为感知机。其中,w和b为感知机模型参数,w∈Rn叫做权值,b∈R     叫做偏置,w⋅x表示w和x的内积。sign为符号函数。

import_torch_as_tf 1879

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

使用Python来编写一个简单的感知机

https://blog.dbrgn.ch/2013/3/26/perceptrons-in-python/ 目前,我在HSR上参加了一个神经网络和机器学习的课程,其中学习到一个最简单的神经网络模型,就是感知机(perceptronperceptronperceptron)。 背景资料最简单的神经网络的模型就是感知机分类器,它有不同的输入(x1, x2,......xn),然后有不同的权重值(w1

大坡3D软件开发 6841

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

用python实现一个简单地感知机模型

'''今天看了几页李航老师的《统计学习方法》,感觉写的很透彻, 有点手痒按照书上的算法花几分钟写了一个简单至极的感知机模型,没有调用numpy, 全程用列表完成,所以内容上稍显复杂''' alist = [[3,3,1],[4,3,1],[1,1,-1]] #生成实例点 w = [0,0] b = 0 theta = 1#初始化w和b def l(x,w,b): #x,w为向量,b为数值 ...

KageYamaa的博客 1038

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

通过从零开始实现一个感知机模型,我学到了这些

对许多刚入门机器学习的开发者而言,许多参数和定义都显得抽象、难以理解,可能许多人直到开始进入实际的项目研发,都还没能真正搞清楚这些参数和定义的确切含义。为此,我在这里故意避开 scikit-learn 等现成的算法工具,从零开始自己用 Python 实现了一个感知机二元分类器,一方面通过实际代码深入认识了感知机的内部原理和相关参数的具体含义,另一方面也...

weixin_33719619的博客 413

用numpy实现一个简单的多层感知机

最近在搞神经网络,不适用pytorch或是tensorflow灯框架自己实现一个多层感知机,所需要的numpy函数一览,最后附上自己实现的多层感知机代码。 import numpy as np 1、np.random.randn() np.random.randn(d0,d1,…,dn) randn 函数返回一个或一组样本,具有标准正态分布。 dn 表格每个维度 返回值为指定维度的array np.random.randn(2,1) array([[-0.18537434], [ 0.

YT学习记录 1414

计算一个简单的两层感知机的梯度

计算一个简单的两层感知机的梯度 损失函数: L=12K∑i=1K‖yi−W2W1xi‖22=12K‖Y−W2W1X‖2FL=12K∑i=1K‖yi−W2W1xi‖22=12K‖Y−W2W1X‖F2\begin{eqnarray*} L &amp;=\frac1{2K}\sum_{i=1}^K\| y_i-W^2W^1x_i\|^2_2 \\ &amp;=\frac1{2K}\| Y-W^2W^1X\|^2_F...

a2832079925的博客 759

利用Python实现一个感知机学习算法

  本文主要参考英文教材Python Machine Learning第二章。pdf文档下载链接: https://pan.baidu.com/s/1nuS07Qp 密码: gcb9。   本文主要内容包括利用Python实现一个感知机模型并利用这个感知机模型完成一个分类任务。   Warren和McCullock于1943年首次提出MCP neuron神经元模型[1],之后,Frank Ro...

weixin_30415801的博客 272

java实现一个感知机_感知机学习算法Java实现

感知机学习算法Java实现。Perceptron类用于实现感知机,其中的perceptronOriginal()方法用于实现感知机学习算法的原始形式;perceptronAnother()方法用于实现感知机学习算法的对偶形式(此处仍有bug)。import java.util.Scanner;public class Perceptron {private static final int max...

weixin_39637260的博客 2667

一天学懂一个算法之感知机

对偶形式

weixin_47532216的博客 443

第一个感知机的代码解读

第三遍看这个代码了,以前只是根据注释和命名规则去看每条代码是要干嘛,这次读了部分源码,找到了很多疑问的答案,也有还没解决的 先上看代码前的基础链接,基础不牢地动山摇啊java中Set的用法JAVA 8 ‘::’ 关键字java泛型中<?>和有什么区别?神经网络的 Delta 学习规则(learning rule)delta法则(梯度下降) 对代码的解读都在代码的注释里了`import...

zb_tjw的博客 613

【MATLAB编程实战】机器学习——手搓一个感知机

以上就基本上是完整的核心代码了,可以运行,基础较差的不会修改的同学可以下载完整版的脚本:下载连接。

qq1406433326 432

【PyTorch入门】之二十分钟使用PyTorch搭建一个多层感知机

二十分钟使用PyTorch搭建一个多层感知机并训练这个模型识别图像

拇指笔记 1803
上一篇: Qt httpserver 理解与使用
下一篇: windows编译Qt5.15 MySql驱动
觉行无量
博客等级 码龄8年 24粉丝 20原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值