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

news2025/1/11 12:54:55

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.coloradmin.cn/o/1100068.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣第17题 电话号码的字母组合 c++ 回溯 经典提升题

题目 17. 电话号码的字母组合 中等 相关标签 哈希表 字符串 回溯 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。…

Elasticsearch系列组件:Logstash强大的日志管理和数据分析工具

Elasticsearch 是一个开源的、基于 Lucene 的分布式搜索和分析引擎&#xff0c;设计用于云计算环境中&#xff0c;能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。它具有高度的可扩展性&#xff0c;可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个…

sqlserver系统存储过程添加用户学习

sqlserver有一个系统存储过程sp_adduser&#xff1b;从名字看是添加用户的&#xff1b;操作一下&#xff0c; 从错误提示看还需要先添加一个登录名&#xff0c;再执行一个系统过程sp_addlogin看一下&#xff0c; 执行完之后看一下&#xff0c;安全性-登录名下面有了rabbit&…

【ARM Coresight Debug 系列 -- Linux 断点 BRK 中断使用详细介绍】

文章目录 1.1 ARM BRK 指令1.2 BRK 立即数宏定义介绍1.3 断点异常处理流程1.3.1 el1_sync_handler1.3.2 el1_dbg 跟踪 1.4 debug 异常处理函数注册1.4.1 brk 处理函数的注册 1.1 ARM BRK 指令 ARMv8 架构的 BRK 指令是用于生成一个软件断点的。当处理器执行到 BRK 指令时&…

电脑办公助手之桌面便签,助力高效率办公

在现代办公的快节奏中&#xff0c;大家有应接不暇的工作&#xff0c;每天面对着复杂的工作任务&#xff0c;总感觉时间不够用&#xff0c;而且工作无厘头。对于这种状态&#xff0c;大家可以选择在电脑上安装一款好用的办公便签软件来辅助日常办公。 敬业签是一款专为办公人士…

android--屏幕适配

基础概念 像素密度 dpi &#xff08; √宽^2高^2 &#xff09; / 屏幕大小 手机分辨率 1080 * 1920 1080代表宽 1920代表高 单位为px像素 屏幕大小为英寸 标准的像素密度 mdpi 160dpi dp 密度无关像素 dp与px的转换 density (dpi / 16…

python 之enumerate()函数

文章目录 enumerate() 是 Python 中的一个内置函数&#xff0c;它用于在遍历可迭代对象&#xff08;如列表、元组、字符串等&#xff09;时同时获取每个元素的索引和值。这个函数非常有用&#xff0c;因为它允许您在迭代过程中轻松地访问元素的索引&#xff0c;而不需要手动维护…

基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定义业务表单流程(二)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 之前讲到了流程保存的时候还要看是否是自定义业务流程应用类型&#xff0c;若是保存的时候不再检查是否有关…

常见三维建模软件有哪些?各自的特点是什么?

常见的三维建模软件包括以下这些&#xff1a; 1. 3DS Max 3D Studio Max&#xff0c;简称3DS MAX&#xff0c;是当今世界上销售量最大的三维建模、动画及渲染软件。它的应用范围广泛&#xff0c;包括计算机游戏中的动画制作、影视片的特效制作等。3DS MAX的操作相对容易&#…

幸运的袋子(递归+回溯)

目录 一、题目 二、代码 一、题目 幸运的袋子__牛客网 二、代码 #include <iostream> #include <vector> #include <algorithm> using namespace std;static int _count 0; static int sum 0; static int product 1;void Combination(vector<int>…

JAVA学习(6)-全网最详细~

&#x1f308;write in front&#x1f308; &#x1f9f8;大家好&#xff0c;我是Aileen&#x1f9f8;.希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流. &#x1f194;本文由Aileen_0v0&#x1f9f8; 原创 CSDN首发&#x1f412; 如…

【Proteus仿真】【51单片机】电蒸锅温度控制系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD1602液晶、按键开关、蜂鸣器、DS18B20温度传感器&#xff0c;液位传感器、继电器控制加热保温装置等。 主要功能&#xff1a; 系统运行后&#…

Elasticsearch7.9.3保姆级安装教程

Linux版本Elasticsearch版本(待安装)Kibana版本(待安装)CentOS 77.9.37.9.3 一、下载地址 1、官网下载 打开地址 https://www.elastic.co/cn/downloads/past-releases#elasticsearch&#xff0c;按如图所示选择对应版本即可 2、采用wget下载 为了不必要的麻烦&#xff0c;建…

nginx.3——local的优先级和匹配方式

在http模块有server模块,在server模块才有location模块, location匹配的是uri location 匹配一旦成功&#xff0c;就不向下匹配 一、location的分类&#xff1a; 1.精确匹配 location /test 2.正则匹配 location ^~ :前缀匹配&#xff0c;以什么为开头 location ~ 区…

【RocketMQ系列四】消息示例-简单消息的实现

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

十五届蓝桥选拔赛Scratch-2023.08.20STEMA测评试题解析

2023年8月20日举行的第15届蓝桥杯STEMA测评Scratch编程中级组 T2 飞驰的高铁 具体要求: 1). 点击绿旗,角色、背景如图所示; 2). 按下一次数字1按键之后,画面中的景色持续向左侧水平移动(参照程序演示视频); 3). 按下一次数字2按键之后,程序结束。 评判标准: 5分:…

“岗课赛证”融通的物联网综合实训室建设方案

一、概述 随着5G技术的普及应用和产业经济的革新发展,物联网产业所呈现的广阔前景带来了对创新型技术技能人才的迫切需求。高职院校物联网专业建设也因此转变为面向国家战略性新兴产业发展需求。当前,“岗位课程竞赛证书”融通的培育理念,是高职院校物联网人才培养和专业优化的…

2023年中国商业版服务器操作系统市场发展规模分析:未来将保持稳定增长[图]

服务器操作系统一般指的是安装在大型计算机上的操作系统&#xff0c;比如Web服务器、应用服务器和数据库服务器等&#xff0c;是企业IT系统的基础架构平台&#xff0c;也是按应用领域划分的三类操作系统之一。同时服务器操作系统也可以安装在个人电脑上。 服务器操作系统分类 …

OpenAI将发布DALL·E3,多模态输出模式引爆热点

OpenAI在官网宣布&#xff0c;在今年10月份将通过API向ChatGPT Plus和企业版用户提供全新文本生成图片产品——DALLE 3。 OpenAI在去年 4 月推出了DALL・E 2 &#xff0c;时隔一年DALLE 3即将上线&#xff0c;OpenAI 表示&#xff0c;「DALL・E 3 比以往系统更能理解细微差别和…

17 - 并发容器的使用:识别不同场景下最优容器

在并发编程中&#xff0c;我们经常会用到容器。今天我要和你分享的话题就是&#xff1a;在不同场景下我们该如何选择最优容器。 1、并发场景下的 Map 容器 假设我们现在要给一个电商系统设计一个简单的统计商品销量 TOP 10 的功能。常规情况下&#xff0c;我们是用一个哈希表…