📄 层次模糊聚类的算法实现.txt
字号:
3.3 把相似关系矩阵R转化为等价关系矩阵
在测试过程中,令我有点不明白的是不管R是否是等价矩阵,聚类结果基本一样。但是我还是在每次把R转化为等价矩阵再进行聚类。
//把关系矩阵转化为等价矩阵
private void getEquivalentR()
{
int time = 1;
float max;
bool same = false; //判断矩阵自乘后是否和先前相同的标识变量
float[,] Rl = new float[m, m]; //存放原矩阵的临时数组
float[,] Rh = new float[m, m]; //存放自乘矩阵的临时数组
//复制R的数据到RL,准备进行操作
for (int i = 0; i < m; i++)
for (int j = 0; j < m; j++)
Rl[i, j] = R[i, j];
//进行关系矩阵乘法
while (!same)
{
time++;
same = true;
for(int i=0;i<m;i++)
for (int j=0; j < m; j++)
{
max = 0;
for (int k = 0; k < m; k++)
{
max = Max(Min(Rl[i, k], Rl[k, j]), max);
}
Rh[i, j] = max;
}
for(int i=0;i<m;i++)
for (int j = 0; j < m; j++)
if (Rl[i, j] != Rh[i, j])
{
same = false;
break;
}
if (!same)
{
for (int i = 0; i < m; i++)
for (int j = 0; j < m; j++)
Rl[i, j] = Rh[i, j];
}
}
if (same)
{
//把R1结果存入类成员变量R中
for (int i = 0; i < m; i++)
for (int j = 0; j < m; j++)
R[i, j] = Rl[i, j];
}
}
3.4 模糊聚类算法的实现
//层次聚类分析方法
public string clustering(float lbd) // lbd即用户设定的λ值,λλ∈[0,1]。
{
getRMaxMin(); //调用最大最小法计算R
//getEquivalentR(); //计算等价矩阵R
int[] g = new int[m]; //用于标识样本分类情况,若样本i已分类则g[i]值为该集//合第一个元素的序号,否则g[i]=0
//聚类过程
for (int i = 0; i < m; i++)
if (g[i] == 0)
{
g[i] = i + 1;
groupg(g, i, i + 1, lbd); //groupg定义见后文
}
//拼出结果语句,作为输出
string result = "聚类结果是:";
for (int i = 0; i < m; i++)
if (g[i] != 0)
{
result += "{"+ Convert.ToString(i+1);
for (int j = i + 1; j < m; j++)
if (g[j] != 0 && g[j] == g[i])
{
result += "," + Convert.ToString(j + 1);
g[j] = 0;
}
result += "}";
g[i] = 0;
}
return result;
}
//用于分类的递归函数
private void groupg(int[] g,int pointer,int ancestor,float lbd)
{
for(int i=pointer+1;i<m;i++)
if (R[pointer, i] >= lbd && g[i] == 0)
{
g[i] = ancestor;
groupg(g, i, ancestor, lbd);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -