C++实现感知器学习作业1

本文详细介绍了使用C++实现感知器学习算法的过程,包括初始化权重矩阵、施加输入、计算输出、调节权重系数等关键步骤,以及如何通过误差输出和图像绘制展示学习效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

</pre><pre name="code" class="cpp"></pre><pre name="code" class="cpp">#include<iostream>
#include"math.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>


using namespace cv;
using namespace std;
int main()
{
	double W[3];


	W[1]=0.5;
	W[2]=0.5;


	double X[4][3]={-1,1,1,
		-1,-0.5,-1,
		-1,3,1,
		-1,-2,-1};
	double d[4]={1,-1,1,-1};
	double e[4];
	double E[10]={0,0,0,0,0,0,0,0,0,0};
	double b=6;
	
	W[0]=b;
	cout<<"初始化权值矩阵为:"<<endl<<W[0]<<"  "<<W[1]<<"  "<<W[2]<<endl;
	double l=0.1;

	double Y[4]={0};
	for(int i=0;i<4;i++)
	{
		Y[i]=W[0]*X[i][0]+W[1]*X[i][1]+W[2]*X[i][2];
		
		if(Y[i]>=0)
			Y[i]=1;
		else
			Y[i]=-1;

		e[i]=abs(d[i]-Y[i]);
	}
	E[0]=e[0]+e[1]+e[2]+e[3];
	cout<<"误差变化如下:"<<endl<<"E{0]="<<E[0]<<endl;
	
	int n=0;
	while(E[n]>0)
	{
		n++;
		for(int i=0;i<4;i++)
		{

			W[1]=W[1]+l*(d[i]-Y[i])*X[i][1];
			W[2]=W[2]+l*(d[i]-Y[i])*X[i][2];
			//cout<<W[1]<<endl<<W[2]<<endl;
			Y[i]=W[0]*X[i][0]+W[1]*X[i][1]+W[2]*X[i][2];
			if(Y[i]>=0)
				Y[i]=1;
			else
				Y[i]=-1;

			e[i]=abs(d[i]-Y[i]);
			
		}

		E[n]=e[0]+e[1]+e[2]+e[3];
		
		
		cout<<"E["<<n<<"]="<<E[n]<<endl;

	}
	cout<<"所求权值矩阵W[]="<<endl;

	for(int j=0;j<3;j++)
		cout<<W[j]<<" ";
	cout<<endl;
	for(int i=0;i<4;i++)
	{
		if(Y[i]==1)
			cout<<"第"<<i<<"组属于第一类"<<endl;
		if(Y[i]==-1)
			cout<<"第"<<i<<"组属于第二类"<<endl;
	}
	
	cout<<"ok"<<endl;

	
	Mat img(400,400,CV_8UC3,Scalar(130,240,205));//3通道图像
	line(img,Point(200,0),Point(200,400),Scalar(0));
	line(img,Point(0,200),Point(400,200),Scalar(0));
		for(int i=0;i<4;i++)
		{
			//putText(img,"(X[i][1],200-40*X[i][2]",Point(200+40*X[i][1],200-40*X[i][2]),CV_FONT_HERSHEY_COMPLEX,1,Scalar(220,0,150));
                        circle(img,Point(200+40*X[i][1],200-40*X[i][2]),1,Scalar(220,0,150),1,8,0);
		}
		line(img,Point(200,200-40*b/W[2]),Point(200+40*b/W[1],200),Scalar(220,20,230));
        namedWindow("line Image");
	imshow("line Image",img );
	imwrite("img.bmp",img);
	Mat test(400,400,CV_8UC3,Scalar(130,240,205));//3通道图像
	line(test,Point(20,400-20),Point(20,0),Scalar(0));//因为mat型图像的原点在右上角,所以比较麻烦,要通过计算转换
	line(test,Point(20,400-20),Point(400,400-20),Scalar(0));

	
	for(int i=0;i<9;i++)
	{
		line(test,Point(20*(i+1),380-20*E[i]),Point(20*(i+2),380-20*E[i+1]),Scalar(220,0,150));
	}

	// Display the test image
	namedWindow("E Image");
	imshow("E Image",test);
	imwrite("test.bmp",test);
	waitKey();
	return 0;
}

智能计算第一次作业


 

1、            题目:

双输入单输出系统:

                 x1(1)=1                   x2(1)=1                        d(1)=1

                 x1(2)=-0.5              x2(2)=-1                       d(2)=-1

                 x1(3)=3                  x2(3)=1                        d(3)=1

                 x1(4)=-2                 x2(4)=-1                       d(4)=-1  

       建立一个感知器网络,实现上述样本的分类。

        计算出相应的网络权值矩阵W

2、            运算结果:

图1 实现误差输出,得出所求权值矩阵,并对样本实现分类:

 

 

 

 

 

 

 

 

图2 用opencv2的画线及画点函数实现样本分类及画出误差变化曲线。

3、            实现步骤及对以上结果的说明:

算法部分:

①初始化:建立一个神经元的感知器,开关函数采用  函数

   W阵的初值随机为[6,0.5,0.5],即b=6;步长为0.1.

        

②对网络施加四组输入, 计算感知器的输出

③计算误差:允许误差为E=0

       当E<0,则退出,网络训练结束,当E>=0时:

④调节网络权值系数

⑤令:n=n+1,转步骤2。

 

画图部分:

主要采用opencv2画线函数line(),画点函数circle()。

 

4、核心代码及说明:

while(E[n]>0)  //E[n]存储每一次循环的总误差,当总误差大于零,进行循环

    {

        n++;

        for(int i=0;i<4;i++)

        {

 

            W[1]=W[1]+l*(d[i]-Y[i])*X[i][1];//调节网络权值系数

            W[2]=W[2]+l*(d[i]-Y[i])*X[i][2];

            Y[i]=W[0]*X[i][0]+W[1]*X[i][1]+W[2]*X[i][2];

            if(Y[i]>=0)

                Y[i]=1;

            else

                Y[i]=-1;

 

            e[i]=abs(d[i]-Y[i]); //e[i]存储单个样本误差

        }

 

        E[n]=e[0]+e[1]+e[2]+e[3];//每次循环计算一次总误差

}

4、            总结

通过C++编程实现感知器学习,我对其的原理理解更深刻了,只有通过一次次修改代码和查阅资料才知道自己对算法的些地方存在错误的认识,再不断改进自己的算法。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值