?? 層次模糊聚類的算法實(shí)現(xiàn).txt
字號:
3.3 把相似關(guān)系矩陣R轉(zhuǎn)化為等價關(guān)系矩陣
在測試過程中,令我有點(diǎn)不明白的是不管R是否是等價矩陣,聚類結(jié)果基本一樣。但是我還是在每次把R轉(zhuǎn)化為等價矩陣再進(jìn)行聚類。
//把關(guān)系矩陣轉(zhuǎn)化為等價矩陣
private void getEquivalentR()
{
int time = 1;
float max;
bool same = false; //判斷矩陣自乘后是否和先前相同的標(biāo)識變量
float[,] Rl = new float[m, m]; //存放原矩陣的臨時數(shù)組
float[,] Rh = new float[m, m]; //存放自乘矩陣的臨時數(shù)組
//復(fù)制R的數(shù)據(jù)到RL,準(zhǔn)備進(jìn)行操作
for (int i = 0; i < m; i++)
for (int j = 0; j < m; j++)
Rl[i, j] = R[i, j];
//進(jìn)行關(guān)系矩陣乘法
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結(jié)果存入類成員變量R中
for (int i = 0; i < m; i++)
for (int j = 0; j < m; j++)
R[i, j] = Rl[i, j];
}
}
3.4 模糊聚類算法的實(shí)現(xiàn)
//層次聚類分析方法
public string clustering(float lbd) // lbd即用戶設(shè)定的λ值,λλ∈[0,1]。
{
getRMaxMin(); //調(diào)用最大最小法計算R
//getEquivalentR(); //計算等價矩陣R
int[] g = new int[m]; //用于標(biāo)識樣本分類情況,若樣本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定義見后文
}
//拼出結(jié)果語句,作為輸出
string result = "聚類結(jié)果是:";
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;
}
//用于分類的遞歸函數(shù)
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);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -