数模学习(模糊数学篇)——模糊识别(python实现)
目录
一、储备知识
1.课本定义:
2.通俗理解:
① 引入小例
② 如何识别
二、模糊识别方法
1.最大隶属度原则
① 计算方法
② 使用方向
2.择近原则
① 择近度计算方法和使用方向
三、模糊识别例题
例题1——湖泊水质识别
1. 指标库标准化和样品库标准化:
2.计算各个样本对应各个模式的贴近度:
例题2——土壤质量识别
四、总结
一、储备知识
1.课本定义:
模糊识别属于判别一个对象属于哪个模式的问题,进行模糊识别需要两个条件:
① 事先已知若干标准模式,称作标准模式库;
② 有待识别的对象;
2.通俗理解:
就是判断一个样本属于什么类别的问题啦(诸如汽车牌照识别、空气污染等级识别、土壤质量识别、生态环境识别、湖泊水质识别等)
① 引入小例
比如:有一个评价体系有五个标准以及若干评价指标
指标\等级 | 极好 | 好 | 一般 | 差 | 极差 |
---|---|---|---|---|---|
指标A | 5 | 4 | 3 | 2 | 1 |
指标B | 5 | 4 | 3 | 2 |
1 |
还有一个样本u,指标A的评分是3.5分,指标B的评分是5分,当然肯定还存在其他评价指标,此处就以“……”略过了。向量形式就是 U={3.5 5 …… },那么模糊识别就是判断样本u属于这个评价体系中的哪一个等级(极好、好……)。
那为什么称其为模糊呢?其实也很简单,就是因为这个评价指标是模糊不清的。以指标A为例,假设它的评分范围是[0,6]中的任何实数,那4.5分是什么等级,4.3分呢?1.5分呢?那么这个时候也不能拍脑袋说4.3分,介于好和一般之间,更偏向于一般,所以一般。逻辑上确实没问题,但是如果再加一个指标B是4.6分呢?再加一个呢?就很难很准确的凭借感觉来判断了。
所以就有了模糊识别这么一个伟大的数学创造。那肯定想问,在指标很多的情况下又如何去精准识别呢?
② 如何识别
现在这里说通俗点的,就是看谁更靠近谁、谁更属于谁(有点舔狗那味儿) ,就是通过一种手段来拟合这种靠近程度、涵纳程度。具体的也没办法用很通俗的话讲清楚。那就直接上硬货吧。
二、模糊识别方法
1.最大隶属度原则
“ (直接抽象一些,n维,即n个待识别对象)”
根据定义,此处有m个标准模式,然后有n个待识别对象。则A(xi)=max{A(x1),A(x2)……},即该识别对象为xi模式(通俗点就是把一个识别对象n1,和m和标准模式进行核算隶属度,然后隶属度最大的便是该对象所处的模式中)
① 计算方法
构建隶属函数。这里不再赘述了,因为CSDN上有很多隶属函数构建方法的讲解。笔者一般喜欢用下列三种:
其中式1适用于指标越大越好的情况;式3适用于指标越小越好的情况;式2则折中。一个模式中的隶属度可能存在多种函数的参与计算。
② 使用方向
计算标准指标库的隶属度矩阵;计算样品指标库的隶属度矩阵
Python代码实现为:
import math as mdef lsd(a,minx): #计算隶属度函数b=[]c=[]for i in range(0,len(a)):b=a[i]for j in range(0,len(b)):if j!=2 and j!=1:if b[j]<=minx[j]:c.append(1)elif b[j]>minx[j]:c.append(round(m.exp(-((b[j]-minx[j])**2)),4))elif j==2:if b[j]<=minx[j]:c.append(0)elif b[j]>minx[j]:c.append(round(1-m.exp(-((b[j]-minx[j])**2)),4))else:if b[j]<0.09:c.append(round(m.exp(-((b[j]-0.09)**2)),4))elif b[j]>0.09:c.append(round(1-m.exp(-((b[j]-0.09)**2)),4))else:c.append(1)return cdef main():s=[] #输入标准库指标,一个模式是一个行向量输入t=[] #输入样品库指标,一个模式是一个行向量输入miny=[] #输入每个指标的最小值print(lsd(s,miny))print(lsd(t,miny))if __name__ == "__main__":main()
2.择近原则
择近原则衡量的是两个集合之间的贴近程度,通常是用σ(A,B)来表达。贴近度越大则表明两个模糊集越相近,越相似。(不知道理解的对不对,经管专业的话,其实可以拿OLS的原理来思考这个问题)
① 择近度计算方法和使用方向
择近度计算方法有很多,常见的如格贴近度、最小最大贴近度、最小平均贴近度、海明贴近度、欧几里得贴近度等。此处重点介绍最小最大贴近度。通过计算每一个样本对每一个模式的贴近度,再根据择近原则选定越接近的那个模式,则成为该样品的模式。
Python代码实现:
import numpy as npdef minMaxDist(x,y):x = np.array(x,np.float16).reshape(-1)y = np.array(y,np.float16).reshape(-1)map_xy = np.vstack((x,y))return np.sum(np.min(map_xy,axis=0))/np.sum(np.max(map_xy,axis=0))def main():s=[] #输入标准库指标,一个模式是一个行向量输入t=[] #输入样品库指标,一个模式是一个行向量输入miny=[] #输入每个指标的最小值# 最小最大值评价度量thd1=[]for i in range(0,3):p=lsd(t,miny)[0+i*4:4+i*4]for j in range(0,5):q=lsd(s,miny)[0+j*4:4+j*4]thd1.append(minMaxDist(p,q))for m in range(0,3):print(thd1[0+5*m:5+5*m])#输出每个样本的贴近度if __name__ == "__main__":main()
注意:此处并没有加入lsd函数,因此在调用时记得补上lsd函数。
三、模糊识别例题
例题1——湖泊水质识别
可以发现,总磷、总氮指标是越低越好;耗氧量是居中为佳;透明度为越高越好。可能有人会有疑问怎么定义这个好,其实可以看等级水平:极贫营养的湖泊一般来说对人直接饮用或使用是最方便、健康以及无害的。因此从人类实用主义角度出发认为极贫营养是最好的,那么指标就是一一对应的关系了。由于笔者是文科生,只知道富营养化不好,如果上述逻辑有误,请读者予以斧正!
1. 指标库标准化和样品库标准化:
import math as mdef lsd(a,minx):b=[]c=[]for i in range(0,len(a)):b=a[i]for j in range(0,len(b)):if j!=2 and j!=1:if b[j]<=minx[j]:c.append(1)elif b[j]>minx[j]:c.append(round(m.exp(-((b[j]-minx[j])**2)),4))elif j==2:if b[j]<=minx[j]:c.append(0)elif b[j]>minx[j]:c.append(round(1-m.exp(-((b[j]-minx[j])**2)),4))else:if b[j]<0.09:c.append(round(m.exp(-((b[j]-0.09)**2)),4))elif b[j]>0.09:c.append(round(1-m.exp(-((b[j]-0.09)**2)),4))else:c.append(1)return cdef main():s=[[1,0.09,37,0.02],[4,0.36,12,0.06],[23,1.8,2.4,0.31],[110,0,0.55,1.20],[660,0,0.17,4.6]]t=[[0.559,0.051,42,0.015],[22.127,1.779,4.942,0.240],[24.736,2.621,1.530,1.182]]miny=[1,0,0.17,0.02]print(lsd(s,miny))print(lsd(t,miny))if __name__ == "__main__":main()
得到标准库的隶属度矩阵如下:
1 |
1 |
1.0 |
1 |
0.0001 |
0.0703 |
1.0 |
0.9984 |
0.0 |
0.9463 |
0.9931 |
0.9193 |
0.0 |
0.9919 |
0.1345 |
0.2485 |
0.0 |
0.9919 |
0 |
0.0 |
得到样品库的隶属度矩阵如下:
1 |
0.9985 |
1.0 |
1 |
0.0 |
0.9423 |
1.0 |
0.9528 |
0.0 |
0.9983 |
0.8427 |
0.2592 |
2.计算各个样本对应各个模式的贴近度:
import numpy as np
import math as mdef lsd(a,minx):b=[]c=[]for i in range(0,len(a)):b=a[i]for j in range(0,len(b)):if j!=2 and j!=1:if b[j]<=minx[j]:c.append(1)elif b[j]>minx[j]:c.append(round(m.exp(-((b[j]-minx[j])**2)),4))elif j==2:if b[j]<=minx[j]:c.append(0)elif b[j]>minx[j]:c.append(round(1-m.exp(-((b[j]-minx[j])**2)),4))else:if b[j]<0.09:c.append(round(m.exp(-((b[j]-0.09)**2)),4))elif b[j]>0.09:c.append(round(1-m.exp(-((b[j]-0.09)**2)),4))else:c.append(1)return cdef minMaxDist(x,y):x = np.array(x,np.float16).reshape(-1)y = np.array(y,np.float16).reshape(-1)map_xy = np.vstack((x,y))return np.sum(np.min(map_xy,axis=0))/np.sum(np.max(map_xy,axis=0))def main():s=[[1,0.09,37,0.02],[4,0.36,12,0.06],[23,1.8,2.4,0.31],[110,0,0.55,1.20],[660,0,0.17,4.6]]t=[[0.559,0.051,42,0.015],[22.127,1.779,4.942,0.240],[24.736,2.621,1.530,1.182]]miny=[1,0,0.17,0.02]print(lsd(s,miny))print(lsd(t,miny))# 最小最大值评价度量thd1=[]for i in range(0,3):p=lsd(t,miny)[0+i*4:4+i*4]for j in range(0,5):q=lsd(s,miny)[0+j*4:4+j*4]thd1.append(minMaxDist(p,q))for m in range(0,3):print(thd1[0+5*m:5+5*m])if __name__ == "__main__":main()
得到湖泊1与各营养等级之间的贴近度为:
0.9995 |
0.5176 |
0.7153 |
0.344 |
0.248 |
湖泊2与各营养等级之间的贴近度为:
0.7236 |
0.688 |
0.9854 |
0.45 |
0.32 |
湖泊3与各营养等级之间的贴近度为:
0.5254 |
0.3909 |
0.704 |
0.6543 |
0.472 |
因此根据最大隶属度原则,可以知道三个湖泊水体营养等级分别为:极贫营养、中营养、中营养
注意:上述代码只需要改变标准库标准或样品库指标数据以及各个指标的最小值即可。
例题2——土壤质量识别
#只需要更改标准指标矩阵的值和样品指标矩阵的值就ok了 s=[[10,23.35,0.1204,74.88,0.092],[17,36.09,0.2523,99.54,0.2592],[30,150,0.6,150,0.45],[50,350,1.4,350,1.05],[70,500,2,500,1.5]]x=[[14,67.3,0.12,59.9,0.29],[4.33,37.1,0.21,53.6,0.15],[5.95,46.5,0.23,56.1,0.12]]miny=[10,23.35,0.1204,74.88,0.092]
结果报告省略了,这个题在很多教材上应该都会摆出来,就不贴题目了
四、总结
在模糊识别时一定要注意这个流程,在总结部分再次叙述一遍流程,也可以在目录中来看。
① 标准库隶属度转化
② 样本库隶属度转化
③ 样本库隶属度一一对应计算贴近度
④ 最大贴近度判断所述模式
最后,感谢您看到这里啦~笔者是数模学习小白,希望对你有帮助,如果有错误敬请斧正!一起加油!
数模学习(模糊数学篇)——模糊识别(python实现)相关推荐
- 数模学习(一)--AHP层次结构法
数模学习(一)-层次分析法 概要: AHP常用于评价类模型,根据专家经验或者自己意见(通常是自己的awa)对不同的指标评分,再利用一致性检验的方法来判断这类评价是否合理,如果合理,我们就可以通过指标一 ...
- 数学建模的基本办法和步骤 ##数模学习1
大三上学期的寒假才开始学习数模的渣. 一.基本方法 1.1 机理分析 机理分析是针对事物的客观规律,找到反映内部机理的数量规律,建立的模型常有明确的物理或现实意义. 1.2 测试分析 当事物的规律性或 ...
- 【数模学习笔记】【线性规划】巧用0-1变量
说明:本人是只挣扎在数模海洋里的小可怜,只是记录一下学习感悟.以下内容是在学习司守奎<数学建模算法与应用>(第三版) P21-23时的笔记. 1. 0-1变量的基本用法:0-1变量的特征 ...
- 非线性规划转化为线性规划问题(司守奎老师数模例题)-------数模学习笔记一
目录 一.非线性问题 1.问题描述与分析 2.问题解决思路 二.具体求解步骤 1.引入ui与vi变量 2.引入变量后新方程 3.matlab程序 总结 本文主要记录司守奎数模书中第一章所给例题 提示: ...
- 数模学习(10):灰色系统(老哥)
一.灰色预测的概念 (1)灰.白.黑色系统 白色系统:一个系统的内部特征是完全已知的,即系统的信息是完全充分的. 黑色系统:一个系统的内部信息对外接来说一无所知,只能通过它与外界的联系来加以观测研究. ...
- 【数模系列】02_三大相关系数+Python代码
文章目录 一.皮尔逊相关系数 1.公式推导 2.使用条件 3.Python绘图 二.斯皮尔曼秩相关系数 1.如何选择皮尔逊和斯皮尔曼 三.肯德尔秩相关系数 一.皮尔逊相关系数 在统计学中,皮尔逊相关系 ...
- 数模学习第三天--微分方程(传染病模型)
微分方程 定义 包含关于未知变量.未知变量的导数以及自变量的方程 第一类为可分离变量的微分方程. 在高数中我们学过相关内容,如: 建模准备 1.运用已知规律列方程 利用数学.力学.物理.化学等学科中的 ...
- 数模学习第四天---回归系数假设检验
直线回归系数的假设检验 对B=0进行假设检验 我们以下题数据为例作出解答: 并计算有关指标:(其中lxx.lxy为离均差平方和,lxy为离均差积和) 下面作出假设检验 并得出方差分析表 若用T检验 此 ...
- 【毕业设计】深度学习实现行人重识别 - python opencv yolo Reid
文章目录 0 前言 1 课题背景 2 效果展示 3 行人检测 4 行人重识别 5 其他工具 6 最后 0 前言
最新文章
- markdown语法中的空格_Markdown常用语法汇总
- jQuery 实现 select模糊查询 反射机制
- 使用SSM+Layui+Bootstrap实现汽车维保系统
- POJ 3617 Best Cow Line 贪心算法
- shell编程之文本处理工具sed
- 台式计算机时间不准,每天开机电脑时间都不正确怎么办?试试这个办法!
- html文件设置断点调试,断点调试
- CSDN博客添加微信公众号图片
- mysql编程流程控制_MySql流程控制结构
- JS数组操作之增删改查
- Linux内核分析-分析Linux内核创建一个新进程的过程
- 软件测试第四组第一周作业第一天
- apache cxf之 一个简单的JAX-WS服务程序
- STC学习:定时器和中断
- iOS开发初学者需要经常去的论坛或网站
- acer软件保护卡怎么解除_Acer软件保护卡使用说明资料
- android调用虚拟摄像头方法,Android设备虚拟摄像头技术实现
- TensorFlow 系列案例(2):自然语言处理-TensorFlow + Word2Vec
- 阿里云国际站怎么注册?
- 请教PCI卡的DMA方式问题