直线机

人工智能的诞生Rosenblatt感知

发布时间:2022/6/10 14:32:27   
北京白癜风治疗的价格高吗 http://m.39.net/pf/bdfyy/

二分类问题可以让人类窥探到智能的起源。

年FrankRosenblatt就为最基本的二分类问题设计了一套算法,是专为二分类问题而生的感知机。

本文将通过最简单的一次函数来介绍二分类感知机的核心。

假设现在有一个平面上存在无数个点。而这些点被一条线分成了两类。绿色点和蓝色点。

我们可以轻易用一条线将这两类不同颜色的点分割开来。但是对于机器来说,这些点只不过是一个个二维向量,机器没有视觉和智能,所以需要通过算法来分类。

分类的方法也很简单。我们都学过直线方程,直线方程的一般形式如下:

确定一条直线只需要知道A,B,C三个量,只要电脑能猜对这三个量,就可以把这些点分开。

Rosenblatt发明的感知机是这样操作的,每次给定一个数据点(例如2,9是绿点)并且告诉这个点是绿点还是蓝点,如果计算机将这个点带入猜测的方程,验证正确,即绿点的确在这条线的上方,则说明满足条件。但是如果计算机验证不正确,也就是本该在方程上方的点带入却发现在方程下方,那么计算机就调整A,B,C的值,然后再进行验证。问题是,A,B,C可以是任意一个值,计算机如何确认这三个值。

Rosenblatt发明的感知机是这样处理的,如果一个蓝色的点(本该在方程上面),但是计算机验证发现在方程的下面,用数学语言表达则是带入的x和y小于0,但是应该大于0才对,因此计算机在知道自己算错的情况下,判断这条线应该向上移动还是向下移动,比如说蓝点本应在直线下方,但是带入发现在直线上方,说明此时的f(x,y)0,

正确答案应是f(x,y)0,在一般式中,斜率表示为(-A/B),如果想要让蓝色在下方,就要让直线向上移动(向上翘),也就是增大斜率,A应该减小,B应该增大,C应该增大,为了确定每个值应该增大还是减小,我们设一个Δ值代表每个量的增量,A减小也就是说明ΔA应该是负数,ΔB应该是正数,ΔC应该是正数。我们用f(x,y)的值减0来得到确定正负的方法,如果f(x,y)0,则f(x,y)-00,我们将f(x,y)-0的正负用y0表示,而蓝色本该在下的这个确定结果用Y表示,y0一定是正的,Y应该是负的,按照这样的推论我们就可以得到ΔA,ΔB,ΔC的正负是(Y-y0)。

但是确定了正负,还没有确定应该调整多少,我们知道如果这条线和点偏离的越多,那么坐标点就要越大,同理,如果坐标点没偏离多少,那么需要调整的就越小。因此调整的系数就应该在(Y-y0)的基础上乘上带入的坐标x,y。

以上就是Rosenblatt感知器的全部思路,基于对系数的调整,我们就可以改变直线的形式,让直线找到正确的位置。为何这样的分类会和人工智能有关系。

在智能行为最简单的分类动作中,带入坐标点的动作便是收到信号,计算坐标是否合理的过程就是处理信号,而判断点是否合理的动作就是智能的判断行为。

如果带入点具有意义,例如xy坐标系的横轴代表某生物的体长,纵轴代表某生物的重量。再把生物的体长和重量放入图中,就可以通过点的位置关系分类出生物的种类。

举个例子,蛇的体长一般都很长,但是体重却很轻。同比之下,鳄鱼的体长也并不短,但是和蛇相比,鳄鱼的重量要比蛇重很多倍,这样把一些蛇和鳄鱼的数据都放在图里,我们就能分出一条2米长1千克的生物应该是蛇,而同样2米长但是千克重的一定是鳄鱼,因为就算是巨蟒也不应该那么重。这时我们将数据带入到上面的公式中,机器虽然根本不知道鳄鱼和蛇的概念,但是也能同人一样将两种生物分别开来。这便是我们通过计算机模拟智能的一种思路。

下面我们来实现如何将上述算法应用到计算机中,并让计算机区分出蛇和鳄鱼。

首先我们定义一条直线方程的基本形式,为了代码描述方便,我们不再使用xy,而是用x统一代表输入,w统一代表系数,b来代表场数。那么下面两个公式就是等价的:

首先我们需要定义一些常量:

constintpx1=2;constintpx2=-3;constintpb=5;constintdata_num=;intiter_times=;classFactor{public:intx1;intx2;intmark;};std::vectorFactorG_factors;//存放随机数据

首先人为定义出一条直线用来生成数据,我们的目的就是看看机器能否生成一条和我们给出的直线相似的直线。

直线的表达式为:

px1*x1+px2*x2+pb

因此我们定义出的直线为

2x-3y+5=0

Factor类中存随机生成的x1,x2,和判断后的y(mark)

iter_times为迭代次数

data_num是生成随机数的数量。

然后使用随机数生成器来生成len个随机数:

voidrandom_generator(intlen){srand(time(nullptr));intp1,p2;for(inti=0;ilen;i++){p1=rand()%20+1;p2=rand()%20+1;Factorf;f.x1=p1;f.x2=p2;if(px1*p1+px2*p2+pb0)f.mark=1;elsef.mark=0;G_factors.push_back(f);}}

并通过mark给出正确答案。

现在我们需要做的是编写一个迭代函数,自动调整w1和w2的值。

由于Δ的存在,上面的值可以拆解成:

迭代代码如下:

voiditeration(){intdw1,dw2,db;//deltaw1deltaw1anddeltabintY,y;while(iter_times--0){for(autoi:G_factors){if((i.x1*dw1+i.x2*dw2+db)0)y=1;elsey=0;Y=i.mark;if(y==Y)continue;else{dw1+=(Y-y)*i.x1;dw2+=(Y-y)*i.x2;db+=Y-y;}}}verify(dw1,dw2,db);}

最后一个验证函数便是验证dw1,dw2和db的正确性。

由于自动迭代纠偏是无关初值的,不论初值是何,最终都能找到正确值。

一个能判断正确率的验证函数:

voidverify(intdw1,intdw2,intdb){intY,y;intrets=0;intt=0,c=0;printf("DeltaW1=%d\nDeltaW2=%d\nDeltab=%d\n",dw1,dw2,db);for(autoi:G_factors){c++;Y=i.mark;rets=i.x1*dw1+i.x2*dw2+db;if(rets0){y=1;}elsey=0;if(y==Y)t++;}printf("%dtested\nCorrectRate:%.2f%%\n",c,((float)t/(float)c)*);printf("Proportion:%.2f%%\n",(float)dw1/(float)dw2);}

当我们随机给出个数据集并且迭代10次的正确率如下:

正确率为97.4%,迭代次便可达到%

斜率也极为接近正确值。

实际上上面的代码已经模拟了一个最基本的二参数二分类细胞

通过调整权重来达到输出正确,而神经网络便是无数个这样的单元堆叠在一起,分层,处理上个细胞的信号,大脑神经元的构造也是如此,因此Rosenblatt感知机可以认为是现代人工智能感知机的原型。

预览时标签不可点收录于合集#个上一篇下一篇
转载请注明:http://www.aideyishus.com/lkzp/537.html
------分隔线----------------------------

热点文章

  • 没有热点文章

推荐文章

  • 没有推荐文章