⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 层次模糊聚类的算法实现.txt

📁 层次模糊聚类的算法实现
💻 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 + -