实验二 势函数算法的迭代训练

2023-11-18

实验二 势函数算法的迭代训练

一.实验目的

通过本实验的学习,使学生了解或掌握模式识别中利用势函数思想设计非线性判别函数的方法,能够实现模式的分类。学会运用已学习的先导课程如数据结构和算法设计知识,选用合适的数据结构完成算法的设计和程序的实现。并通过训练数据来建立非线性判别函数,通过代待分类样本进行分类预测,通过检查预测结果和数据的几何分布特性检验分类器的正确性。通过选用此种分类方法进行分类器设计实验,强化学生对非线性分类器的了解和应用,从而牢固掌握模式识别课程内容知识。

二. 势函数法基本思想

假设要划分属于两种类别
和 的模式样本,这些样本可看成是分布在 维模式空间中的点

把属于
的点比拟为某种能源点,在点上,电位达到峰值。
随着与该点距离的增大,电位分布迅速减小,即把样本附近空间点上的电位分布,看成是一个势函数

对于属于
的样本集群,其附近空间会形成一个"高地",这些样本点所处的位置就是"山头"。
同理,用电位的几何分布来看待属于
的模式样本,在其附近空间就形成"凹地"。
只要在两类电位分布之间选择合适的等高线,就可以认为是模式分类的判别函数。

三.实验内容

假定对病人3项主要指标检查得到正常( 类)和非正常( 类)的数据如下:
类: (1,2, 5), (1,1, 2),(3,3,6);
类: (5,6,10),(7,6,11),(8,7,12).

四.实验步骤

1、选定势函数(3个双变量对称基函数中选1;或做成多选的,实现人工自动选择);
2、确定合适数据结构,以便分别完成势函数和判别函数的正确表示;
3、对训练样本加以训练学习,建立判别函数,使其满足分类要求
4、记录并输出训练轮次;
5、对所有样本的类别用你的分类器加以判断(分类决策),比较与实际类别的差异;
6、对待分类样本进行判断,得到其类别(预测),如可能,以几何分布情况加以说明;
7、输出你的判别函数的表达形式(注意:表达形式要求便于阅读理解)。

五.测试

1、先测试已有样本的正确性。
2、用待分类数据加以分类。这里,对样本: (2,3,5),(6,7,10)
分别测试,检查它们几何分布情况是否与得到的分别属于 类和 类的结果相符,从而确认所设计的分类器是正确的。

六.实现提示

1)样本存放在矩阵s中,s的每一行是一个样本,为方便编程,可将类别号增加在每个样本中,作为最后一维;
2)为了保存和计算判别函数,可使用一个辅助的结构数组ftbl,该数组的每个分量含两个成分:index和symbol。 index记录对应样本下标号,symbol记录该项的符号。

七. 代码实现

% 用势函数法设计非线性判别器

n=6;  % n表示样本总数。这里n=6,3个样本属于第一类,后三个样本属于第二类
m=30; % 判别函数最大的项数
d=3;  % d表示维长 
r=0;  % r表示在判别函数中所具有的项数(每项是一个基函数,含3个坐标分量(维度=3))
tag=1; %判断是否继续循环的标志量
g=0;
% 样本
s=[ 1,2, 5,1    
   1,1, 2,1    
   3,3, 6,1    
   5,6,11,2
   7,6,11,2  
   8,7,12,2];   %4列表示类别: 1表示属于第1% 2表示属于第2类
run=0; % run为轮次,初值置为0
while tag==1
   run=run+1;
   tag=0;
   for k=1:n  % n表示样本总数。
     if r==0   % r==0表示判别函数还不含任何项时   
	    r=r+1;            %r指向到目前为止所得到的势函数的最后一项,此时准备含第一个项
        % ftbl为结构数组,数组每个分量含index和symbol两个成分,分别记录样本号和符号
	    ftbl(r).symbol=1;  % 该项的符号。 1--正;-1--ftbl(r).index=1;   % 该项对应的样本下标号
	    continue;          
     else 
		  g=0;
          % 将当前的第k个样本先代入已建立的部分判别函数中进行计算,再判断分类是否正确
	      for i=1:r % i为扫描每一项的整数变量
		    temp=0;
	        for j=1:d    % d表示维长。这里,d实际上为3,即d=3
	          temp=temp+(s(k,j)-s(ftbl(i).index,j))*(s(k,j)-s(ftbl(i).index,j));
            end
	        g= g+ftbl(i).symbol*exp(-temp);  %每项都是一指数形式,求出共r项的和         
          end     
	      if ((g>0 &s(k,4)==1)||(g<0&s(k,4)==2)) 
              continue;  %正确分类时,不修改判别函数
          else  % 当前样本要构成一项保存到判别表达式中
			   tag=1;
               r=r+1; 
			   ftbl(r).index=k;
	  	       if(g>0& s(k,4)==2)  
				       ftbl(r).symbol=-1;
		       else if(g<0&s(k,4)==1)
				       ftbl(r).symbol=1;
                    end
               end
          end
   end
  end
end
fprintf('所循环的轮次= %d',run);
fprintf('\n输出判别函数的表达式:\n');
% 输出判别函数,即输出判别函数的每一项。通过输出结构数组ftbl中的每一分量
for i=1:r
    % 输出第i项 
    if(ftbl(i).symbol==1)
	    if i==1 
            fprintf('exp{-[(x1')
        else
            fprintf('+exp{-[(x1')
        end
     else
	     fprintf('-exp{-[(x1');
    end
     % 样本的第一个分量是正号,还是负号,决定输出分量数值前的符号
     if (s(ftbl(i).index,1)>0)  % 样本的第一个分量是正号 
	       fprintf('-')
           fprintf('%d',s(ftbl(i).index,1))
           fprintf(')^2+(x2')
     else if(s(ftbl(i).index,1)<0)  % 样本的第一个分量是负号
		          fprintf('+')
                  fprintf('%d',-s(ftbl(i).index,1)) % 负负得正
                  fprintf(')^2+(x2');
	     else  %s(ftbl(i).index,1)==0
			   fprintf(')^2+(x2');
         end
    end
    if (s(ftbl(i).index,2)>0)
	      fprintf('-')
          fprintf('%d',s(ftbl(i).index,2))
          fprintf(')^2+(x3')
    else if(s(ftbl(i).index,2)<0)
		          fprintf('+')
                  fprintf('%d',-s(ftbl(i).index,2))
                  fprintf(')^2+(x3');
		  else  
			   fprintf(')^2+(x3')
          end
    end
    if  (s(ftbl(i).index,3)>0)
	      fprintf('-')
          fprintf('%d',s(ftbl(i).index,3))
          fprintf(')^2]}');
    else
        if(s(ftbl(i).index,3)<0)
		       fprintf('+')
               fprintf('%d',-s(ftbl(i).index,3))
               fprintf(')^2]}');
		else 
			   fprintf(')^2]}')
        end
    end
end
fprintf('\n')

% 判别每一样本的类别:
fprintf('判别每一样本的类别:\n');
for k=1:n;
 g=0;
 for i=1:r
   temp=0;
   for j=1:d  %d表示维长
	temp=temp+(s(k,j)-s(ftbl(i).index,j))*(s(k,j)-s(ftbl(i).index,j));
   end
   g=g+ftbl(i).symbol*exp(-temp);  %共r项,每项都是一指数形式
 end
 if (g>0) 
   fprintf('第')
   fprintf('%d',k)
    fprintf('个样本的类别为: ')
              fprintf('%d\n',1)
		  else if (g<0)
			  fprintf('第')
              fprintf('%d',k)
              fprintf('个样本的类别为: ')
              fprintf('%d\n',2)
		  else  %g==1 
			  fprintf('第')
              fprintf('%d',k)
              fprintf('个样本的类别无法判别!  ')
		      fprintf('但第')
              fprintf('%d',k)
              fprintf('个样本的实际类别为: ')
              fprintf('%d\n',s(k,4));%输出实际类别
              end
          end
      end   
      % cout<<endl;
	  %判断(235),(6711)分别所属的类别:
       %先对第一个样本,即(235)

          a=[2,3,5];
	      g=0;
	      for i=1:r
		    temp=0;
	        for j=1:d  %d表示维长
	          temp=temp+(a(j)-s(ftbl(i).index,j))*(a(j)-s(ftbl(i).index,j));
            end
            g=g+ftbl(i).symbol*exp(-temp);  %共r项,每项都是一指数形式
          end
		  if g>0 
			  fprintf('样本a=(2,3,5)的类别为: ')
              fprintf('%d\n',1)
          else
              if (g<0)
			     fprintf('样本a=(2,3,5)的类别为: ')
                 fprintf('%d\n',2)
              else
                  fprintf('样本a=(2,3,5)的类别无法判别!\n')
              end
          end
          
		%现对第二个样本,即(6711)
		b=[6,7,11];
	    g=0;
	    for i=1:r
		  temp=0;
	      for j=1:d  % d表示维长
	        temp=temp+(b(j)-s(ftbl(i).index,j))*(b(j)-s(ftbl(i).index,j));
          end
          g=g+ftbl(i).symbol*exp(-temp);  %共r项,每项都是一指数形式
        end
		if g>0
			fprintf('样本b=(6,7,11)的类别为: ')
            fprintf('%d\n',1)
         else
            if (g<0)
			  fprintf('样本b=(6,7,11)的类别为: ')
              fprintf('%d\n',2)
            else
              fprintf('样本b=(6,7,11)的类别无法判别!\n') 
            end
        end
  fprintf('\n')

%%%%
%%%
function g=calfun(s,ftbl,r)
% s存放样本;ftbl存放样本号和符号;r为项数
  g=1;
  for i=1:r
	   temp=1;
	   for j=1:d   % d表示维长
	     temp= temp+(s(k,j)-s(ftbl(i).index,j))*(s(k,j)-s(ftbl(i).index,j));
	     g= g+ftbl(i).symbol*exp(-temp);  %共r项,每项都是一指数形式
       end
    end
end

八. 运行结果

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实验二 势函数算法的迭代训练 的相关文章

随机推荐

  • Spark大数据分析与实战笔记(第一章 Scala语言基础-3)

    文章目录 1 3 Scala的数据结构 1 3 1 数组 数组的遍历 数组转换 1 3 2 元组 创建元组 获取元组中的值 拉链操作 1 3 3 集合 List Set Map 1 3 Scala的数据结构 对于每一门编程语言来说 数组 A
  • Linux下使用system函数获取命令执行返回结果

    在Linux C语言中 需要获取设备挂载和空间容量信息 这时候最简单的方式就是使用命令工具进行查询 但是system函数调用之能返回进行执行的状态 不能返回执行的结果 所以这里自己实现system函数返回命令执行的结果 以获取设备挂载信息和
  • 第1周编程题-表示分数类的Fraction

    题目内容 设计一个表示分数的类Fraction 这个类用两个int类型的变量分别表示分子和分母 这个类的构造函数是 Fraction int a int b 构造一个a b的分数 这个类要提供以下的功能 double toDouble 将分
  • R语言数据拆分

    博主的话 大家好 这里是bio 先赞后看养成习惯 还没关注的小伙伴点点关注不迷路 今天是南方的小年 祝福大家小年快乐 目录 博主的话 前言 一 split 函数 二 subset 函数 总结 前言 今天继续学习R语言 我们之前已经介绍过了数
  • 用python对训练集和测试集进行特征规范化处理

    这里的规范化处理指对提取后的特征集进行处理 不是对原始的数据信号进行处理 包括归一化和标准化 规范化的原因 不同特征具有不同量级时会导致 a 数量级的差异将导致量级较大的特征占据主导地位 b 数量级的差异将导致迭代收敛速度减慢 c 依赖于样
  • 从ChatGPT出发:大模型与自然语言模型

    目录 引言 基石 故事的开始 Transformer 异姓兄弟 GPT Bert与GPT 2 GPT Bert GPT 2 大力出奇迹 GPT3 模型的进化 InstructGPT ChatGPT 代码库 Transformer GPT 2
  • 【Linux】进程篇---进程概念及原理

    目录 1 什么是进程 2 操作系统是如何管理进程的 3 进程标识符 PID 3 1查看进程标识符 3 2getpid 和getppid 4 进程当前状态 4 1进程状态粗分 4 2Linux下进程状态 4 2 1linux下进程状态概念 4
  • 【深度学习】端到端的“即插即用“卷积模块以替代传统Conv层

    文章参考 大盘点 十大即插即用的涨点神器 360doc com CompConv 一种用于高效特征学习的紧凑型卷积模块 知乎 zhihu com 紧凑型深度卷积神经网络在图像识别中的应用 ceaj org
  • 浪潮服务器通过DHCP获取地址进入IPMI,BMC管理后台的方法,可实现远程安装系统、温度运行状态监测、风扇转速调整、远程开关机、KVM控制台显示器等功能

    前言 这里主要介绍通过DHCP进入BMC管理后台的方法 在官方网站有介绍的地方会直接给链接 这里就不在赘述 配置网络 DHCP获取地址 这个方法适用于没有手动设置过BMC地址的情况 这里用到的DHCP工具是 深度远程启动管理器 深度远程启动
  • 面试准备:MySQL建立索引的原则

    文章目录 建立索引 1 和in可以乱序 2 最左前缀匹配原则 3 尽量选择区分度高的列作为索引 4 索引列不能参与计算 5 尽量的扩展索引 不要新建索引 6 为经常需要排序 分组和联合操作的字段建立索引 7 为常作为查询条件的字段建立索引
  • 【山河送书第十一期】:朋友圈大佬都去读研了,这份备考书单我码住了,考研书籍五本!!

    朋友圈大佬都去读研了 这份备考书单我码住了 数据结构与算法分析 计算机网络 自顶向下方法 现代操作系统 深入理解计算机系统 概率论基础教程 原书第10版 线性代数 原书第10版 线性代数及其应用 重磅推荐 参与方式 往期赠书回顾 八九月的朋
  • AlmaLinux 安装过程解析

    此文将对AlmaLinux操作系统安装过程进行解析 对于经常使用Linux系统的大佬 可能对此安装过程有些乏味 但鉴于目前为止 似乎没有一篇安装的过程解析 那不妨由笔者写下一篇吧 笔者软件安装环境 VMware VMware Worksta
  • 提升模型效果的途径

    模型效果不佳 可以考虑从以下几个方面进行改进 数据增广 1 基于图像处理的数据增广 几何变换 旋转 缩放 翻转 剪裁 平移 仿射变换 颜色空间变换 亮度 对比度 饱和度调整 颜色空间转行 色彩调整 添加噪声和滤波 注入高斯噪声 椒盐噪声 模
  • Python模糊控制库使用(基本操作与仿真结果3D显示)

    Python模糊控制库使用 模糊控制库安装 示例 定义模糊控制变量 模糊隶属函数 模糊规则 激活模糊控制器 3D可视化结果 完整代码 模糊控制库安装 模糊控制库github 链接 Github python pip安装 pip instal
  • 第三十九章、PyQt显示部件:OpenGL Widget部件功能简介及使用其显示图片

    专栏 Python基础教程目录 专栏 使用PyQt开发图形界面Python应用 专栏 PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一 概述 OpenGL Widget部件是一个OpenGL Open Graphics L
  • java反射机制 (属性,注解)(代码)

    博学谷IT学习技术支持 1案例的类 import com example demo3 fanshe MyAnnotation import lombok Data author zw Description 描述 create 2022 2
  • YOLOv8+BoT-SORT多目标跟踪(行人车辆计数与越界识别)

    课程链接 https edu csdn net course detail 38919 BoT SORT是发表于2022年的先进的多目标跟踪算法 它结合了运动和外观信息 相机运动补偿和更准确的卡尔曼滤波状态向量 并把这些改进集成到ByteT
  • vue的环境搭建2023,idea,vscode踩坑记录

    由于看了19 20年的几篇博客 导致搭建vue环境一部分环节出大问题 大家还是看官方文档吧 血泪教训 不说废话直接开始 1 nodejs下载 下载地址 https nodejs org zh cn 下载稳定版 安装过程我是一路next 就是
  • python之折半查找算法

    折半查找算法也叫二分查找算法 算法的细节我就不讲了 但是必须说一下二分查找是基于我们之前的数据是有序的 如果没有序该算法是没有意义的 个人觉得代码比较直观 所以我这里就直接上代码了 折半查找非递归算法 折半查找非递归算法 折半查找函数 参数
  • 实验二 势函数算法的迭代训练

    实验二 势函数算法的迭代训练 一 实验目的 通过本实验的学习 使学生了解或掌握模式识别中利用势函数思想设计非线性判别函数的方法 能够实现模式的分类 学会运用已学习的先导课程如数据结构和算法设计知识 选用合适的数据结构完成算法的设计和程序的实