33、模糊逻辑中的函数与聚类方法详解

模糊逻辑中的函数与聚类方法详解

在模糊逻辑领域,有多种函数和算法可用于处理模糊集合和进行数据聚类。下面将详细介绍几个关键的函数和聚类方法。

1. sigmf 函数

sigmf 函数用于计算基于 S 形隶属函数的模糊隶属度值。

语法

y = sigmf(x,params)

描述
该函数通过 S 形隶属函数计算模糊隶属度值,也可以使用 fismf 对象来计算该隶属函数。相关的隶属函数还有 dsigmf 和 psigmf。计算公式为:
[f(x; a_k, c_k) = \frac{1}{1 + e^{-a_k(x - c_k)}}]
要定义隶属函数参数,需将 params 指定为向量 [a c] ,并为 x 中的每个输入值计算隶属度值。

示例

x = 0:0.1:10;
y = sigmf(x,[2 4]);
plot(x,y)
title('sigmf, P = [2 4]')
xlabel('x')
ylabel('Degree of Membership')
ylim([-0.05 1.05])

输入参数
| 参数 | 描述 |
| ---- | ---- |
| x | 输入值,可以是标量或向量,用于计算隶属度值。 |
| params | 隶属函数参数,为长度为 4 的向量 [a c] 。a 为负值时隶属函数向左开放,为正值时向右开放,a 的大小控制过渡区域的宽度,c 定义过渡区域的中心。 |

输出参数
| 参数 | 描述 |
| ---- | ---- |
| y | 隶属度值,返回为标量或向量,其维度与 x 匹配,y 中的每个元素是为 x 中对应元素计算的隶属度值。 |

替代功能
可以使用 fismf 对象实现 sigmf 隶属函数:

mf = fismf("sigmf",P);
Y = evalmf(mf,X);

这里的 X、P 和 Y 分别对应 sigmf 的 x、params 和 y 参数。

扩展功能
可以使用 MATLAB Coder 生成 C 和 C++ 代码。

2. smf 函数

smf 函数用于计算基于样条的 S 形隶属函数的模糊隶属度值。

语法

y = smf(x,params)

描述
该函数通过样条基 S 形隶属函数计算模糊隶属度值,也可使用 fismf 对象计算。相关的隶属函数有 zmf 和 pimf。计算公式如下:
[
f(x; a, b) =
\begin{cases}
0, & x \leq a \
2(\frac{x - a}{b - a})^2, & a \leq x \leq \frac{a + b}{2} \
1 - 2(\frac{x - b}{b - a})^2, & \frac{a + b}{2} \leq x \leq b \
1, & x \geq b
\end{cases}
]
要定义隶属函数参数,需将 params 指定为向量 [a b] ,并为 x 中的每个输入值计算隶属度值。

示例

x = 0:0.1:10;
y = smf(x,[1 8]);
plot(x,y)
title('smf, P = [1 8]')
xlabel('x')
ylabel('Degree of Membership')
ylim([-0.05 1.05])

输入参数
| 参数 | 描述 |
| ---- | ---- |
| x | 输入值,可以是标量或向量,用于计算隶属度值。 |
| params | 隶属函数参数,为长度为 2 的向量 [a b] ,a 定义隶属函数的底部,b 定义其肩部。 |

输出参数
| 参数 | 描述 |
| ---- | ---- |
| y | 隶属度值,返回为标量或向量,其维度与 x 匹配,y 中的每个元素是为 x 中对应元素计算的隶属度值。 |

替代功能
可以使用 fismf 对象实现 smf 隶属函数:

mf = fismf("smf",P);
Y = evalmf(mf,X);

这里的 X、P 和 Y 分别对应 smf 的 x、params 和 y 参数。

扩展功能
可以使用 MATLAB Coder 生成 C 和 C++ 代码。

3. subclust 函数

subclust 函数用于使用减法聚类查找聚类中心。

语法

centers = subclust(data,clusterInfluenceRange)
centers = subclust(data,clusterInfluenceRange,Name,Value)
[centers,sigma] = subclust( ___ )

描述
centers = subclust(data,clusterInfluenceRange) 使用指定的聚类影响范围对输入数据进行减法聚类,并返回计算出的聚类中心。减法聚类算法会估计输入数据中的聚类数量。 centers = subclust(data,clusterInfluenceRange,Name,Value) 使用一个或多个名称 - 值参数指定的算法选项对数据进行聚类。 [centers,sigma] 还会返回指定每个数据维度中聚类中心影响范围的 sigma 值。

示例
- 使用相同影响范围查找聚类中心

load clusterDemo.dat
C = subclust(clusterDemo,0.6);

C 的每一行包含一个聚类中心。

  • 指定减法聚类的边界
load clusterDemo.dat
dataScale = [-0.2 -0.2 -0.2;
              1.2  1.2  1.2];
C = subclust(clusterDemo,0.5,'DataScale',dataScale);
  • 指定减法聚类的选项
load clusterDemo.dat
options = [2.0 0.8 0.7 0];
C = subclust(clusterDemo,[0.5 0.25 0.3],'Options',options);
  • 获取每个数据维度的聚类影响范围
load clusterDemo.dat
[C,S] = subclust(clusterDemo,0.5);

输入参数
| 参数 | 描述 |
| ---- | ---- |
| data | 要聚类的数据集,为 M×N 数组,M 是数据点的数量,N 是数据维度的数量。 |
| clusterInfluenceRange | 聚类中心的影响范围,可以是范围在 [0, 1] 内的标量值,也可以是向量。标量值表示对所有输入和输出使用相同的影响范围,向量表示对每个输入和输出使用不同的影响范围。较小的影响范围通常会创建更多更小的数据聚类,产生更多的模糊规则。 |

名称 - 值对参数
| 参数 | 描述 |
| ---- | ---- |
| DataScale | 数据缩放因子,默认值为 ‘auto’,也可以是 2×N 数组,用于将输入和输出数据归一化到单位超立方体中。当为 ‘auto’ 时,genfis 命令使用要聚类的数据中的实际最小值和最大值。 |
| Options | 聚类选项,为向量,包含以下元素:
- Options(1):压缩因子,默认值为 1.25,为正标量,较小的压缩因子会减少离群点被视为聚类一部分的可能性,通常会创建更多更小的数据聚类。
- Options(2):接受比率,默认值为 0.5,范围在 [0, 1] 内的标量值,定义为第一个聚类中心潜力的一部分,高于此值的另一个数据点将被接受为聚类中心,接受比率必须大于拒绝比率。
- Options(3):拒绝比率,默认值为 0.15,范围在 [0, 1] 内的标量值,定义为第一个聚类中心潜力的一部分,低于此值的另一个数据点将被拒绝为聚类中心,拒绝比率必须小于接受比率。
- Options(4):信息显示标志,默认值为 false,为布尔值,false 表示不显示聚类过程中的进度信息,true 表示显示。 |

输出参数
| 参数 | 描述 |
| ---- | ---- |
| centers | 聚类中心,返回为 J×N 数组,J 是聚类的数量,N 是数据维度的数量。 |
| sigma | 聚类中心的影响范围,为 N 元素行向量,所有聚类中心具有相同的 sigma 值集。 |

提示
要使用减法聚类生成模糊推理系统,可以使用 genfis 命令,步骤如下:
1. 配置聚类选项:

opt = genfisOptions('SubtractiveClustering');
opt.ClusterInfluenceRange = clusterInfluenceRange;
opt.DataScale = dataScale;
opt.SquashFactor = options(1);
opt.AcceptRatio = options(2);
opt.RejectRatio = options(3);
opt.Verbose = options(4);
  1. 提取输入和输出变量数据:
inputData = data(:,1:M);
outputData = data(:,M+1:end);
  1. 生成 FIS 结构:
fis = genfis(inputData,outputData,opt);

生成的模糊系统 fis 为每个聚类包含一个模糊规则,每个输入和输出变量每个聚类有一个隶属函数,使用减法聚类只能生成 Sugeno 模糊系统。

算法流程

graph TD;
    A[计算每个数据点成为聚类中心的可能性,基于周围数据点的密度] --> B[选择潜力最高的数据点作为第一个聚类中心];
    B --> C[移除第一个聚类中心附近的所有数据点,附近范围由 clusterInfluenceRange 确定];
    C --> D[选择剩余点中潜力最高的点作为下一个聚类中心];
    D --> E{所有数据是否都在聚类中心的影响范围内};
    E -- 否 --> C;
    E -- 是 --> F[结束];
4. surfview 函数

surfview 函数用于打开表面查看器。

语法

surfview(fis)
surfview(fileName)

描述
使用表面查看器查看模糊系统的输出表面,需要指定 FIS 的输入和输出变量、它们对应的隶属函数以及系统的模糊规则。 surfview(fis) 打开表面查看器并加载模糊推理系统 fis, surfview(fileName) 打开表面查看器并从指定文件加载模糊推理系统。

示例

fis = readfis('tipper');
surfview(fis)

输入参数
| 参数 | 描述 |
| ---- | ---- |
| fis | 模糊推理系统,可以是 mamfis 对象、sugfis 对象、mamfistype2 对象或 sugfistype2 对象。 |
| fileName | 文件名,指定为字符串或字符向量,可以包含或不包含 .fis 扩展名,该文件必须在当前工作目录或 MATLAB 路径中。 |

提示
- 对于有两个以上输入变量的系统,可以查看任意两个输入的输出表面,需使用参考输入值为其他输入信号指定常量参考值。
- 默认情况下,当更改输入或输出变量选择或网格点数时,表面图会自动更新。要禁用自动绘图更新,在选项菜单中清除“Always evaluate”选项,禁用后,点击“Evaluate”更新绘图。
- 要创建更平滑的绘图,增加“Plot points”值。
- 要从不同角度查看表面,在绘图区域点击并拖动。

兼容性考虑
从 R2019b 开始警告,未来版本将移除对将模糊推理系统表示为结构的支持,建议使用 mamfis 和 sugfis 对象。可以使用 convertfis 函数将现有的模糊推理系统结构转换为对象。

5. trapmf 函数

trapmf 函数用于计算基于梯形隶属函数的模糊隶属度值。

语法

y = trapmf(x,params)

描述
该函数通过梯形隶属函数计算模糊隶属度值,也能使用 fismf 对象来计算。相关的隶属函数有 trimf、linsmf 和 linzmf。计算公式为:
[f(x; a, b, c, d) = \max\left(\min\left(\frac{x - a}{b - a}, 1, \frac{d - x}{d - c}\right), 0\right)]
要定义隶属函数参数,需将 params 指定为向量 [a b c d] ,并为 x 中的每个输入值计算隶属度值。

示例

x = 0:0.1:10;
y = trapmf(x,[1 5 7 8]);
plot(x,y)
title('trapmf, P = [1 5 7 8]')
xlabel('x')
ylabel('Degree of Membership')
ylim([-0.05 1.05])

输入参数
| 参数 | 描述 |
| ---- | ---- |
| x | 输入值,可以是标量或向量,用于计算隶属度值。 |
| params | 隶属函数参数,为长度为 4 的向量 [a b c d] 。b 和 c 定义隶属函数的肩部,a 和 d 定义其底部。隶属函数的形状取决于 b 和 c 的相对值,当 c > b 时为梯形;当 b = c 时等同于参数为 [a b d] 的三角形隶属函数;当 c < b 时为最大值小于 1 的三角形。 |

输出参数
| 参数 | 描述 |
| ---- | ---- |
| y | 隶属度值,返回为标量或向量,其维度与 x 匹配,y 中的每个元素是为 x 中对应元素计算的隶属度值。 |

替代功能
可以使用 fismf 对象实现 trapmf 隶属函数:

mf = fismf("trapmf",P);
Y = evalmf(mf,X);

这里的 X、P 和 Y 分别对应 trapmf 的 x、params 和 y 参数。

扩展功能
可以使用 MATLAB Coder 生成 C 和 C++ 代码。

6. trimf 函数

trimf 函数用于计算基于三角形隶属函数的模糊隶属度值。

语法

y = trimf(x,params)

描述
该函数通过三角形隶属函数计算模糊隶属度值,也可使用 fismf 对象计算。相关的隶属函数有 trapmf、linsmf 和 linzmf。计算公式如下:
[
f(x; a, b, c) =
\begin{cases}
0, & x \leq a \
\frac{x - a}{b - a}, & a \leq x \leq b \
\frac{c - x}{c - b}, & b \leq x \leq c \
0, & c \leq x
\end{cases}
]
或更简洁地表示为:
[f(x; a, b, c) = \max\left(\min\left(\frac{x - a}{b - a}, \frac{c - x}{c - b}\right), 0\right)]
要定义隶属函数参数,需将 params 指定为向量 [a b c] ,并为 x 中的每个输入值计算隶属度值。

示例

x = 0:0.1:10;
y = trimf(x,[3 6 8]);
plot(x,y)
title('trimf, P = [3 6 8]')
xlabel('x')
ylabel('Degree of Membership')
ylim([-0.05 1.05])

输入参数
| 参数 | 描述 |
| ---- | ---- |
| x | 输入值,可以是标量或向量,用于计算隶属度值。 |
| params | 隶属函数参数,为长度为 3 的向量 [a b c] ,a 和 c 定义隶属函数的底部,b 定义其峰值。 |

输出参数
| 参数 | 描述 |
| ---- | ---- |
| y | 隶属度值,返回为标量或向量,其维度与 x 匹配,y 中的每个元素是为 x 中对应元素计算的隶属度值。 |

替代功能
可以使用 fismf 对象实现 trimf 隶属函数:

mf = fismf("trimf",P);
Y = evalmf(mf,X);

这里的 X、P 和 Y 分别对应 trimf 的 x、params 和 y 参数。

扩展功能
可以使用 MATLAB Coder 生成 C 和 C++ 代码。

函数对比总结

函数名 功能 输入参数 输出参数 相关函数 替代功能 扩展功能
sigmf 计算 S 形隶属函数的模糊隶属度值 x(标量或向量),params(向量 [a c] y(标量或向量) dsigmf、psigmf fismf 对象 C/C++ 代码生成
smf 计算样条基 S 形隶属函数的模糊隶属度值 x(标量或向量),params(向量 [a b] y(标量或向量) zmf、pimf fismf 对象 C/C++ 代码生成
subclust 使用减法聚类查找聚类中心 data(M×N 数组),clusterInfluenceRange(标量或向量)等 centers(J×N 数组),sigma(N 元素行向量)
surfview 打开表面查看器 fis(模糊推理系统对象),fileName(文件名)
trapmf 计算梯形隶属函数的模糊隶属度值 x(标量或向量),params(向量 [a b c d] y(标量或向量) trimf、linsmf、linzmf fismf 对象 C/C++ 代码生成
trimf 计算三角形隶属函数的模糊隶属度值 x(标量或向量),params(向量 [a b c] y(标量或向量) trapmf、linsmf、linzmf fismf 对象 C/C++ 代码生成

操作建议

  • 隶属函数使用 :在选择隶属函数时,根据实际问题的特点进行选择。例如,如果需要一个平滑过渡的隶属函数,可以选择 sigmf 或 smf;如果需要简单的线性隶属函数,可以选择 trapmf 或 trimf。
  • 聚类操作 :在使用 subclust 进行聚类时,合理设置聚类影响范围和其他参数。较小的聚类影响范围会产生更多的聚类,但可能会导致过拟合;较大的聚类影响范围会产生较少的聚类,但可能会丢失一些细节信息。
  • 表面查看 :使用 surfview 查看模糊系统输出表面时,根据需要调整绘图参数,如“Plot points”值,以获得更平滑的绘图效果。

通过对这些函数和聚类方法的了解和应用,可以更好地处理模糊逻辑问题,构建更有效的模糊系统。

【故障诊断】【pytorch】基于CNN-LSTM故障分类的轴承故障诊断研究[西储大学数据](Python代码实现)内容概要:本文介绍了基于CNN-LSTM神经网络模型的轴承故障分类方法,利用PyTorch框架实现,采用西储大学(Case Western Reserve University)公开的轴承故障数据集进行实验验证。该方法结合卷积神经网络(CNN)强大的特征提取能力和长短期记忆网络(LSTM)对时序数据的建模优势,实现对轴承不同故障类型和严重程度的高精度分类。文中详细阐述了数据预处理、模型构建、训练流程及结果分析过程,并提供了完整的Python代码实现,属于典型的工业设备故障诊断领域深度学习应用研究。; 适合人群:具备Python编程基础和深度学习基础知识的高校学生、科研人员及工业界从事设备状态监测故障诊断的工程师,尤其适合正在开展相关课题研究或希望复现EI级别论文成果的研究者。; 使用场景及目标:① 学习如何使用PyTorch搭建CNN-LSTM混合模型进行时间序列分类;② 掌握轴承振动信号的预处理特征学习方法;③ 复现并改进基于公开数据集的故障诊断模型,用于学术论文撰写或实际工业场景验证; 阅读建议:建议读者结合提供的代码逐行理解模型实现细节,重点关注数据加载、滑动窗口处理、网络结构设计及训练策略部分,鼓励在原有基础上尝试不同的网络结构或优化算法以提升分类性能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值