当前位置: 首页 > news >正文

C#,数值计算——分类与推理Gaumixmod的计算方法与源程序

1 文本格式

using System;
using System.Collections.Generic;

namespace Legalsoft.Truffer
{
    public class Gaumixmod
    {
        private int nn { get; set; }
        private int kk { get; set; }
        private int mm { get; set; }
        private double[,] data { get; set; }
        private double[,] means { get; set; }
        private double[,] resp { get; set; }
        private double[] frac { get; set; }
        private double[] lndets { get; set; }
        private double[,,] sig { get; set; }
        private double loglike { get; set; }

        public Gaumixmod(double[,] ddata, double[,] mmeans)
        {
            int mmstat = ddata.GetLength(1);

            this.nn = ddata.GetLength(0);
            this.kk = mmeans.GetLength(0);
            this.mm = mmstat;
            this.data = Globals.CopyFrom(ddata);
            this.means = Globals.CopyFrom(mmeans);
            this.resp = new double[nn, kk];
            this.frac = new double[kk];
            this.lndets = new double[kk];
            this.sig = new double[kk, mmstat, mmstat];

            for (int k = 0; k < kk; k++)
            {
                frac[k] = 1.0 / kk;
                for (int i = 0; i < mm; i++)
                {
                    for (int j = 0; j < mm; j++)
                    {
                        sig[k, i, j] = 0.0;
                    }
                    sig[k, i, i] = 1.0e-10;
                }
            }

            estep();
            mstep();
        }

        public double estep()
        {
            double[] u = new double[mm];
            double[] v = new double[mm];
            double oldloglike = loglike;
            for (int k = 0; k < kk; k++)
            {
                //Cholesky choltmp = new Cholesky(sig[k]);
                Cholesky choltmp = new Cholesky(Globals.CopyFrom(k, sig));
                lndets[k] = choltmp.logdet();
                for (int n = 0; n < nn; n++)
                {
                    for (int m = 0; m < mm; m++)
                    {
                        u[m] = data[n, m] - means[k, m];
                    }
                    choltmp.elsolve(u, v);
                    double sum = 0.0;
                    for (int m = 0; m < mm; m++)
                    {
                        sum += Globals.SQR(v[m]);
                    }
                    resp[n, k] = -0.5 * (sum + lndets[k]) + Math.Log(frac[k]);
                }
            }
            loglike = 0;
            for (int n = 0; n < nn; n++)
            {
                double max = -99.9e99;
                for (int k = 0; k < kk; k++)
                {
                    if (resp[n, k] > max)
                    {
                        max = resp[n, k];
                    }
                }
                double sum = 0.0;
                for (int k = 0; k < kk; k++)
                {
                    sum += Math.Exp(resp[n, k] - max);
                }
                double tmp = max + Math.Log(sum);
                for (int k = 0; k < kk; k++)
                {
                    resp[n, k] = Math.Exp(resp[n, k] - tmp);
                }
                loglike += tmp;
            }
            return loglike - oldloglike;
        }

        public void mstep()
        {
            for (int k = 0; k < kk; k++)
            {
                double wgt = 0.0;
                for (int n = 0; n < nn; n++)
                {
                    wgt += resp[n, k];
                }
                frac[k] = wgt / nn;
                for (int m = 0; m < mm; m++)
                {
                    double sum = 0.0;
                    for (int n = 0; n < nn; n++)
                    {
                        sum += resp[n, k] * data[n, m];
                    }
                    means[k, m] = sum / wgt;
                    for (int j = 0; j < mm; j++)
                    {
                        sum = 0.0;
                        for (int n = 0; n < nn; n++)
                        {
                            sum += resp[n, k] * (data[n, m] - means[k, m]) * (data[n, j] - means[k, j]);
                        }
                        sig[k, m, j] = sum / wgt;
                    }
                }
            }
        }
    }
}
 

2 代码格式

using System;
using System.Collections.Generic;namespace Legalsoft.Truffer
{public class Gaumixmod{private int nn { get; set; }private int kk { get; set; }private int mm { get; set; }private double[,] data { get; set; }private double[,] means { get; set; }private double[,] resp { get; set; }private double[] frac { get; set; }private double[] lndets { get; set; }private double[,,] sig { get; set; }private double loglike { get; set; }public Gaumixmod(double[,] ddata, double[,] mmeans){int mmstat = ddata.GetLength(1);this.nn = ddata.GetLength(0);this.kk = mmeans.GetLength(0);this.mm = mmstat;this.data = Globals.CopyFrom(ddata);this.means = Globals.CopyFrom(mmeans);this.resp = new double[nn, kk];this.frac = new double[kk];this.lndets = new double[kk];this.sig = new double[kk, mmstat, mmstat];for (int k = 0; k < kk; k++){frac[k] = 1.0 / kk;for (int i = 0; i < mm; i++){for (int j = 0; j < mm; j++){sig[k, i, j] = 0.0;}sig[k, i, i] = 1.0e-10;}}estep();mstep();}public double estep(){double[] u = new double[mm];double[] v = new double[mm];double oldloglike = loglike;for (int k = 0; k < kk; k++){//Cholesky choltmp = new Cholesky(sig[k]);Cholesky choltmp = new Cholesky(Globals.CopyFrom(k, sig));lndets[k] = choltmp.logdet();for (int n = 0; n < nn; n++){for (int m = 0; m < mm; m++){u[m] = data[n, m] - means[k, m];}choltmp.elsolve(u, v);double sum = 0.0;for (int m = 0; m < mm; m++){sum += Globals.SQR(v[m]);}resp[n, k] = -0.5 * (sum + lndets[k]) + Math.Log(frac[k]);}}loglike = 0;for (int n = 0; n < nn; n++){double max = -99.9e99;for (int k = 0; k < kk; k++){if (resp[n, k] > max){max = resp[n, k];}}double sum = 0.0;for (int k = 0; k < kk; k++){sum += Math.Exp(resp[n, k] - max);}double tmp = max + Math.Log(sum);for (int k = 0; k < kk; k++){resp[n, k] = Math.Exp(resp[n, k] - tmp);}loglike += tmp;}return loglike - oldloglike;}public void mstep(){for (int k = 0; k < kk; k++){double wgt = 0.0;for (int n = 0; n < nn; n++){wgt += resp[n, k];}frac[k] = wgt / nn;for (int m = 0; m < mm; m++){double sum = 0.0;for (int n = 0; n < nn; n++){sum += resp[n, k] * data[n, m];}means[k, m] = sum / wgt;for (int j = 0; j < mm; j++){sum = 0.0;for (int n = 0; n < nn; n++){sum += resp[n, k] * (data[n, m] - means[k, m]) * (data[n, j] - means[k, j]);}sig[k, m, j] = sum / wgt;}}}}}
}

http://www.lryc.cn/news/195516.html

相关文章:

  • 【Android】Intel HAXM installation failed!
  • 2023年中国自动驾驶卡车市场发展趋势分析:自动驾驶渗透率快速增长[图]
  • 力扣第17题 电话号码的字母组合 c++ 回溯 经典提升题
  • 华纳云:怎么判断VPS的ip是不是公网ip
  • QT学习笔记1-Hello, QT
  • 水滴卡片效果实现
  • 【算法题】2899. 上一个遍历的整数
  • Python+unittest+requests接口自动化测试框架搭建 完整的框架搭建过程
  • 系统架构设计:19 论数据挖掘技术的应用
  • 如何选择高防CDN和高防IP?
  • 【html】利用生成器函数和video元素,取出指定时间的视频画面
  • 第五十九章 学习常用技能 - 将数据从一个数据库移动到另一个数据库
  • 虚拟示波器的设计与实现
  • ImgPlus:基于CodeFormer的图片增强
  • 2024华为校招面试真题汇总及其解答(二)
  • 编译链接(Compile Link)
  • 14 幂等生产者和事务生产者
  • zabbix部署与监控
  • Python 编程基础 | 第五章-类 | 5.8、运算符重载
  • 【前端设计模式】之解释器模式
  • TiDB 7.4 发版:正式兼容 MySQL 8.0
  • QT 网络编程 服务端 客户端 QTcpServer
  • Stm32_标准库_16_串口蓝牙模块_手机与蓝牙模块通信_手机传入信息能对芯片时间日期进行更改
  • 137.【SpringCloud-快速搭建】
  • 计算机网络第2章-CDN(4)
  • Linux常见的指令合集
  • 字符串_哈希
  • python 之enumerate()函数
  • 【LeetCode刷题(数据结构与算法)】:用队列实现栈
  • “客户端到服务器的数据传递”和“服务器上的数据传递”这两种数据传递的方式的区别