Visual Studio 2010+C#实现信源和信息熵

1. 设计要求

以图形界面的方式设计一套程序,该程序可以实现以下功能:

  1. 从输入框输入单个或多个概率,然后使用者可以通过相关按钮的点击求解相应的对数,自信息以及信息熵
  2. 程序要能够实现马尔可夫信源转移概率矩阵的输入并且可以计算该马尔可夫信源在每一个状态下每输出一个符号的平均信息量,稳态概率以及最后的信息熵。
  3. 结果在在界面中直接呈现

2. 设计过程

首先进行图形界面的设计,根据要求界面中应该包括相关标签,输入,输出以及对应按钮,单行少量输入可以采用普通TextBox控件,多行输入可以采用RichTextBox控件,输出要有对应的标签,为了美观,将输出控件原始标签删除修改为空白,只有输出值才会出现

本实验总体界面设计如图一所示:

图1 设计图形界面

接下来对于点击不同按钮产生的事件进行设计:

由于对数值以及自信息设计过程相对简单,以下着重介绍信息熵以及马尔可夫信源设计过程。

 查看信息熵按钮代码实现:

 private void button5_Click(object sender, EventArgs e){string[] a = new string[richTextBox1.Lines.Length];//定义数组,设定空间大小为输入框的行数double[] px = new double[richTextBox1.Lines.Length];double[] y = new double[richTextBox1.Lines.Length];double z = 0;for (int i = 0; i < richTextBox1.Lines.Length; i++){a[i] = richTextBox1.Lines[i];//获取每一行的值,存入数组a中px[i] = Convert.ToDouble(a[i]);//将字符串转换为可计算的double类型y[i] = Math.Log(1 / px[i], 2);z = z + px[i] * y[i];//计算信息熵}label8.Text = Convert.ToString(Math.Round(z, 2));//结果转换成字符串形式再输出}

在相关按钮中输入上述所示代码即可实现信息熵的计算

在设计马尔可夫信源时,考虑到其概率矩阵更便于观察,所以需要通过输入概率矩阵然后提取相关的概率来进行计算。

要想求信源熵,我们得知道稳态概率值以及在si状态下每输出一个符号的平均信息量,最后对状态取统计平均后得到信源每输出一个符号的信息量,即马尔可夫信源的熵。

对于H(X|si)的值可以直接通过计算得到,求法如下:

 private void button6_Click(object sender, EventArgs e){int a = richTextBox2.Lines.Length;double[,] p = new double[a, a];char[] sp = new char[3] { ' ', '\t', '\n' };string[] str1 = new string[100];str1 = richTextBox2.Text.Split(sp);label10.Text = "";for (int i = 0; i < a; i++){double h = 0;for (int j = 0; j < a; j++){p[i, j] = Convert.ToDouble(str1[i * a + j]);if (p[i, j] == 0){p[i, j] = 1;}h = h + p[i, j] * Math.Log(1 / p[i, j], 2);}label10.Text += Convert.ToString(Math.Round(h, 3)) + '\n';}}

对于稳态概率的值无法直接进行计算得到,因为需要解方程,我对此采用的方法为高斯列选主元消元迭代求解。

首先将概率矩阵进行转置,然后每一行都可以列方程,为使求解更加简便,将方程移项,等式左边为未知数,右边为一个常数,例如初始概率矩阵第一列为0.1 0.5 0 这三个数,转置后可列方程组W1=0.1*W1+0.5*W2+0*W3,移相后为-0.9*W1+0.5*W2+0*W3=0,而在数组中即为[-0.9 0.5 0 0],而对于已知方程概率和W1+W2+W3=1在数组中形式为[1 1 1 1]。

处理后代码如下:

//以下a为处理后的矩阵,b为每一行方程等式右边的常数值double[] b = new double[n];for (int i = 0; i < n; i++){b[i] = a[i, n];//将最后一列(方程右边常数值)存入数组b中}for (int k = 0; k < n - 1; k++){//找每一列主元,最开始我们选k行k列的为最大max = Math.Abs(a[k, k]);//最大元值maxp = k;//最大元列的下标for (int p = k + 1; p < n; p++){if (Math.Abs(a[p, k]) > max){max = Math.Abs(a[p, k]);maxp = p;}}if (maxp != k){//需要交换两行double[] tmp = new double[n];for (int i = 0; i < n; i++){tmp[i] = a[maxp, i];a[maxp, i] = a[k, i];a[k, i] = tmp[i];}double tmpp;tmpp = b[k];b[k] = b[maxp];b[maxp] = tmpp;}for (int i = k + 1; i < n; i++){for (int j = k + 1; j < n; j++){a[i, j] -= a[k, j] * a[i, k] / a[k, k];}b[i] -= b[k] * a[i, k] / a[k, k];}}x[n - 1] = b[n - 1] / a[n - 1, n - 1];for (int k = n - 2; k > -1; k--){double sum1 = 0;for (int j = k + 1; j < n; j++){sum1 += a[k, j] * x[j];}x[k] = b[k] - sum1;x[k] /= a[k, k];}//x即为方程的解

至此,求解信源熵的两大关键部分都已经实现,最后直接计算即可完成。

四、实验测试

图2 总体测试

从图2中可以看出:

在输入姓名后点击登录按钮将会显示欢迎,在输入概率后可以点击按钮查看它的对数或者自信息量,也可以输入多个概率并且求取信息熵,这些通过验证,结果均为正确。对于马尔可夫信源的测试,我使用的是课本上例

图3 例子

将图2中所求结果与图3中结果对比后可以看出结果正确,可以与例题中的结果一一对应上

改变数据继续验证:

图4

图5

通过图4,图5的多次验证,可以保证其与手动计算结果基本保持一致,误差可以忽略不计,实验成功。

3. 总结

按照模块分别进行设计难度不大,但是在最后实现马尔可夫信源时需要使用C#对矩阵进行处理以及运算,需要大家掌握一定的数学知识,本文的思想就是利用求解线性方程的相关算法以及高斯迭代求解方程的方法去实现。完整项目后续会上传至资源中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/456937.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Git 简易速速上手小册》第4章:Git 与团队合作(2024 最新版)

文章目录 4.1 协作流程简介4.1.1 基础知识讲解4.1.2 重点案例&#xff1a;为 Python Web 应用添加新功能4.1.3 拓展案例 1&#xff1a;使用 CI/CD 流程自动化测试4.1.4 拓展案例 2&#xff1a;处理 Pull Request 中的反馈 4.2 使用 Pull Requests4.2.1 基础知识讲解4.2.2 重点案…

CCF-B类COLT’24 2月9日截稿!春节也是创新季!学术思维不休假!

会议之眼 快讯 第37届COLT( Conference on Learning Theory)即国际学习理论大会将于 2024 年 6月30日至7月3日在加拿大埃德蒙顿隆重举行&#xff01;COLT是机器学习重要的国际会议之一&#xff0c;专注于机器学习理论方向。作为机器学习领域的重要学术盛会&#xff0c;COLT聚集…

AR特效自研AI算法技术解决方案

在当今这个高速发展的数字化时代&#xff0c;增强现实&#xff08;AR&#xff09;技术已经成为企业创新和市场竞争的重要手段。美摄科技凭借对AI技术的深厚积累&#xff0c;为企业提供了一套创新的AR特效自研AI算法技术解决方案&#xff0c;旨在满足企业在AR领域的多元化需求。…

Python接口自动化测试框架运行原理及流程

这篇文章主要介绍了Python接口自动化测试框架运行原理及流程,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 本文总结分享介绍接口测试框架开发&#xff0c;环境使用python3selenium3unittestddtrequests测试框…

Linux系统编程

目录 前言&#xff1a; 一、 并发 单轨道和多轨道程序设计 单轨道&#xff1a; 多轨道&#xff1a; 二、进程 1.概念&#xff1a; 2.进程状态&#xff1a; 状态转换图 3.进程特点&#xff1a; 4.PCB进程控制块 PCB 进程控制块和文件描述符表 三、虚拟地址空间 …

JavaScript中闭包的定义、原理及应用场景

JavaScript是一门以函数为核心的编程语言&#xff0c;其独特的闭包特性是众多开发者所喜爱的特点之一。闭包是一种非常强大的概念&#xff0c;可以帮助我们实现许多复杂的功能和逻辑。本篇博客将为大家深入介绍JavaScript中闭包的定义、原理及应用场景&#xff0c;并通过示例代…

svg基础(三)分组、渐变

上一篇文章简单介绍了svg常用标签及其属性,本篇主要介绍分组&#xff0c;渐变 1 分组<g> 分组容器 添加到g元素上的变换会应用到其所有的子元素上添加到g元素的属性会被其所有的子元素继承定义复杂对象&#xff0c;可通过<use>元素引用 1.1 分组 <svg>&…

市场复盘总结 20240206

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 今日梯队&#xff1a; 二进三&#xff1a…

CF1404BTree Tag/ BZOJ0487. 树上追逐详解

1.题目 传送门:Tree Tag - 洛谷 2.思路 我们考虑什么情况下Alice可以获胜. 如果​ ≤ da&#xff0c;则Alice可以一步就追上Bob. 如果Alice处在一个能覆盖整棵树的点&#xff0c;即2da 1≥树的直径&#xff0c;那么Bob也无论走到哪里Alice都能追到,Alice获胜. 其它情况下…

阿里云企业用户2核4G5M固定带宽199元一年,续费不涨价

2024年2月阿里云服务器租用价格表更新&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、ECS u1实例2核4G、5M固定带宽、80G ESSD Entry盘优惠价格199元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元、2核4G4M带宽轻量服务器一年165元12个月、2核…

Android中设置Toast.setGravity()了后没有效果

当设置 toast.setGravity()后&#xff0c;弹窗依旧从原来的位置弹出&#xff0c;不按设置方向弹出 类似以下代码&#xff1a; var toast Toast.makeText(this, R.string.ture_toast, Toast.LENGTH_SHORT)toast.setGravity(Gravity.TOP, 0, 0)//设置toast的弹出方向为屏幕顶部…

Python os模块详解

os模块与目录相关的函数 与目录相关的函数如下&#xff1a; os.getcwd()&#xff1a;获取当前目录。 os.chdir(path)&#xff1a;改变当前目录。 os.fchdir(fd)&#xff1a;通过文件描述利改变当前目录。该函数与上一个函数的功能基本相似&#xff0c;只是该函数以文件描述…