模糊逻辑中的函数与聚类方法详解
在模糊逻辑领域,有多种函数和算法可用于处理模糊集合和进行数据聚类。下面将详细介绍几个关键的函数和聚类方法。
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);
- 提取输入和输出变量数据:
inputData = data(:,1:M);
outputData = data(:,M+1:end);
- 生成 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”值,以获得更平滑的绘图效果。
通过对这些函数和聚类方法的了解和应用,可以更好地处理模糊逻辑问题,构建更有效的模糊系统。
超级会员免费看
14

被折叠的 条评论
为什么被折叠?



