问题背景
三角形模糊识别产生的原因:
在古代,人们为了测量土地、计算角度和解决其他实际问题,需要研究三角形的性质和特征。如今,随着科技的发展,三角形作为一种基本的几何形状,其在数学、物理学、工程学等多领域都有广泛的应用。三角形识别问题的产生主要是由于实际应用的需要。
三角形模糊识别的应用:
随着计算机技术的发展,三角形识别问题在计算机图形学、计算机视觉、机器人导航等科技领域也得到了广泛的应用。例如,在计算机视觉中,可用于描述和识别图像中的物体,如人脸识别……
三角形模糊识别在其他专业领域也有很多应用。 例如,在医学诊断中,可用于评估症状的严重程度(细胞癌变程度识别),帮助医生确定诊断结果; 在法律判决中,可用于评估证据的可靠性和可信度……
这里介绍一下三角形模糊识别从人脸识别进一步推广到人脸情绪识别:想象一下,我们有一张人脸的图像。这张图像上有眼睛、嘴巴、鼻子等部位,它们形状、大小、位置的不同组合,就构成了人脸的各种表情。比如,当人们开心时,眼睛会笑成一条缝,嘴巴会大大的张开,鼻子会向上翘起。而当人们伤心时,眼睛可能会湿润,嘴角会向下垂,鼻子可能会皱起。
三角形模糊识别算法,就是可以帮助我们从这张图像中提取出这些特征。它会将眼睛、嘴巴、鼻子等部位分别看作一个个小的三角形区域,然后分析这些区域的形状、大小、位置等信息。比如,如果嘴巴区域的大小和位置告诉我们嘴巴是张开的,那么这可能表示这个人正在笑。
然后,根据这些特征,三角形模糊识别算法就可以“学习”到不同表情对应的特征组合。比如,它可能会“记住”笑的时候眼睛、嘴巴、鼻子是怎样的形状和位置。当它看到一张新的图片时,它就可以根据这些特征来判断这张图片上的人是在笑还是在哭,其情绪如何。
三角形模糊识别面临的挑战:
1、建立有效的隶属函数:
设计有效的隶属函数以描述三角形之间的相似性和差异,需要仔细考虑不同类型和特征的三角形以及其应用背景。
2、设计有效的多分类算法
三角形模糊识别问题实际上是一个多分类问题,但不同类型三角形之间的界限可能并不明显,因此需要设计有效的多分类算法以处理这种模糊性和不确定性。
3、实际使用中的抗干扰
噪声和干扰如测量误差、数据不完整等可能会影响隶属函数的计算和判断,因此需要研究有效的去噪和抗干扰方法以提高识别精度和可靠性。
4、提高计算效率
由于三角形模糊识别涉及大量的计算和比较,因此需关注如何提高计算效率,减少计算时间和资源消耗。
简单模式识别方法(传统方法)
问题重述:
将三角形分为5类,建立5个模式: 等腰三角形I 、直角三角形R 、正三角形E 、等腰直角三角形IR 和非典型三角形O 。 对未知类型三角形进行识别,判断其属于哪种类型 ?
该方法的优点:
简单:传统方法隶属函数定义简单易懂,计算量少。
易用 :通过最大隶属度原则可以直接得出三角形的近似所属模糊模式。
该方法的缺点:
识别的准确度低: 当多个三角形的隶属度相近或重叠时,最大隶属度原则无法明确区分它们,容易导致识别错误。
指数型隶属函数的三角形模糊识别方法
优点:
分类效果明显:相比于传统隶属函数,指数型方法求得的隶属度彼此之间区别更明显、差距更大、更便于识别。
识别更合理:使用带阈值的隶属函数,确保所识别类型在规定的合格指标因子之上,避免忽略次要隶属度,保证其合理性。
缺点:
计算复杂、准确度不够:相较于传统隶属函数,指数型隶属函数计算量较大,计算难度大,同样存在虚假隶属度问题。
对等腰直角三角形的识别效果不好:在对等腰直角三角形进行识别时,是对等腰三角型隶属度与直角三角形隶属度进行取小操作,无法明显识别出等腰直角三角形。
结论
指数方法不会直接按照最大隶属度原则将三角形归类,而是设置了一个阈值来综合考虑,但确定阈值的过程可能存在主观性,还需要找到一种方法综合分析三角形性质和特征来确定合适的阈值。
三角形模糊识别的展望:
随着计算机科技发展及三角形模糊识别的广泛应用,我们相信三角形模糊识别方法将有更进一步的探索和研究,隶属函数准确性、应用中的噪声和计算效率等问题将得到解决,这将推动三角形模糊识别的更广泛应用和发展。
代码
MATLAB代码:(带有可变阈值部分的代码应该有误还需改进)
clear
clc
disp('三角形模糊识别')
disp('请输入三角形三个角其中的任意两个角:');
x = input('输入第一个角度 x = ');
y = input('输入第二个角度 y = ');
z = 180 - x - y;
% 使用sort函数将x、y、z按从大到小的顺序排列
sorted_angles = sort([x, y, z], 'descend');
x = sorted_angles(1); % 最大值为x
y = sorted_angles(2); % 中间值为y
z = sorted_angles(3); % 最小值为z
% 显示结果
disp(['x = ', num2str(x)]);
disp(['y = ', num2str(y)]);
disp(['z = ', num2str(z)]);
if x+y+z~=180
error('三个角度数总和不为180°,请重新输入!')
end
if x<y||x<z||y<z
error('三个角度没有严格按照从大到小排序,请重新输入!')
end
if x>=180||z<=0
error('输入的内角度数不符合,请重新输入!')
end
%传统三角形模糊识别隶属函数
E=1-(1/180) * max(x-y,y-z);%等边三角形
I=1-(1/60) * min(x-y,y-z);%等腰三角形
R=1-(1/90) * abs(x-90);%直角三角形
IR=min(1-(1/60)*min(x-y,y-z),1-(1/90)*abs(x-90));%等腰直角三角形
O=min(min((1/60)*min(x-y,y-z),(1/90)*abs(x-90)),(1/180)*max(x-y,y-z));%非典型三角形
max1=0;
%判断三角形类型
if max1<I
max1=I;
F1='识别结果:这是一个等腰三角形!';
end
if max1<E
max1=E;
F1='识别结果:这是一个等边三角形!';
end
if max1<R
max1=R;
F1='识别结果:这是一个直角三角形!';
end
if max1<IR
max1=IR;
F1='识别结果:这是一个等腰直角三角形!';
end
if max1<O
max1=O;
F1='识别结果:这是一个非典型三角形!';
end
disp('传统三角形模糊识别:');
disp(F1);
disp('其隶属度分别为:');
disp(' 等边三角形 等腰三角形 直角三角形 等腰直角三角形 非典型三角形');
disp([E,I,R,IR,O]);
%指数型三角形模糊识别隶属函数
Ez=(1-((x-z)/180))^(x-z);%等边三角形
Iz=(1-(1/60)*min(x-y,y-z))^(min(x-y,y-z)^(1/2));%等腰三角形
Rz=(1-(1/90)*abs(x-90))^abs(x-90);%直角三角形
IRz=min(Iz,Rz);%等腰直角三角形
Oz=min(min(1-Ez,1-Iz),1-Rz);%非典型三角形
max2=0;
%判断三角形类型
if max2<Iz
max2=Iz;
F2='识别结果:这是一个等腰三角形!';
end
if max2<Ez
max2=Ez;
F2='识别结果:这是一个等边三角形!';
end
if max2<Rz
max2=Rz;
F2='识别结果:这是一个直角三角形!';
end
if max2<IRz
max2=IRz;
F2='识别结果:这是一个等腰直角三角形!';
end
if max2<Oz
max2=Oz;
F2='识别结果:这是一个非典型三角形!';
end
disp('指数型三角形模糊识别:');
disp(F2);
disp('其隶属度分别为:');
disp(' 等边三角形 等腰三角形 直角三角形 等腰直角三角形 非典型三角形');
disp([Ez,Iz,Rz,IRz,Oz]);
%基于可变阈值的三角形识别方法
Ex=(1-((x-z)/180))^(x-z);%等边三角形
Ix=(1-(1/60)*min(x-y,y-z))^(min(x-y,y-z)^(1/2));%等腰三角形
Rx=(1-(1/90)*abs(x-90))^abs(x-90);%直角三角形
IRx=min(min(Ix,Rx),(z/45)^z);%等腰直角三角形
Ox=min(min(1-Ex,1-Ix),1-Rx);%非典型三角形
max3=0;
%判断三角形类型
if max3<Ix
max3=Ix;
F3='识别结果:这是一个等腰三角形!';
end
if max3<Ex
max3=Ex;
F3='识别结果:这是一个等边三角形!';
end
if max3<Rx
max3=Rx;
F3='识别结果:这是一个直角三角形!';
end
if max3<IRx
max3=IRx;
F3='识别结果:这是一个等腰直角三角形!';
end
if max3<Ox
max3=Ox;
F3='识别结果:这是一个非典型三角形!';
end
disp('基于可变阈值的三角形识别:');
disp(F3);
disp('其隶属度分别为:');
disp(' 等边三角形 等腰三角形 直角三角形 等腰直角三角形 非典型三角形');
disp([Ex,Ix,Rx,IRx,Ox]);
%确定阈值的波动
e=0.3;
Ey=(1-2*e/60)^(2*e); %等边三角形
Iy=(1-e/90)^e; %等腰三角形
Ry=(1-2*e/180)^(2*e); %直角三角形
IRy=min(min(Iy,Ry),(z/45)^z); %等腰直角三角形
disp('三角形模糊识别的阈值:');
disp(' 等边三角形 等腰三角形 直角三角形 等腰直角三角形');
disp([Ey,Iy,Ry,IRy]);
Python代码:
import random
import pandas as pd
# 设置Pandas选项以显示完整的表格
pd.set_option("display.max_rows", None)
pd.set_option("display.max_columns", None)
# 方法一和方法二的隶属函数
# 简单方法和指数方法
def calculate_membership(method, x, y, z):
if method == 'traditional method':
E = 1 - (1/180) * max(x-y, y-z)
I = 1 - (1/60) * min(x-y, y-z)
R = 1 - (1/90) * abs(x-90)
IR = min(I, R)
O = min(1 - I, 1 - R, 1 - E)
return {'等边E': E, '等腰I': I, '直角R': R, 'IR': IR, '非典型O': O}
elif method == 'Exponential method':
t1 = x - z
t2 = min(x - y, y - z)
t3 = abs(x - 90)
E = (1 - t1/180) ** t1
I = (1 - t2/60) ** t2
R = (1 - t3/90) ** t3
IR = min(I, R)
O = min(1 - I, 1 - R, 1 - E)
return {'等边E': E, '等腰I': I, '直角R': R, 'IR': IR, '非典型O': O}
# 获取用户输入
user_choice = input("选择操作(输入 '1' 随机生成角度,输入 '2' 自己输入角度): ")
if user_choice == '1':
# 随机生成角度
alpha = random.randint(0, 180)
beta = random.randint(0, 180 - alpha)
gamma = 180 - alpha - beta
else:
# 用户输入角度
alpha = float(input("请输入角度 alpha: "))
beta = float(input("请输入角度 beta: "))
gamma = 180 - alpha - beta
# 检查角度和是否等于180度
if alpha + beta + gamma != 180:
raise ValueError("输入的角度和不等于180度,请重新输入。")
# 计算隶属度
methods = ['traditional method', 'Exponential method']
results = []
for method in methods:
membership = calculate_membership(method, alpha, beta, gamma)
results.append(membership)
# 创建一个表格来显示隶属度
df = pd.DataFrame(results, index=methods)
# 找到具有最高隶属度的类型
recognized_method_1 = df.loc['traditional method'].idxmax()
recognized_method_2 = df.loc['Exponential method'].idxmax()
# 打印结果
print("Input Angles (alpha, beta, gamma):", alpha, beta, gamma)
print(df)
print()
print("Recognized Triangle Type for traditional method:", recognized_method_1)
print("Recognized Triangle Type for Exponential method:", recognized_method_2)