c#模拟bayes方法
设计思路:
首先,建立一个类库,生成动态链接库文件(.dll文件);
然后,再建立一个应用程序,设计一个界面,通过图形界面输入起始变量;
最后,在“开始”按钮点击方法下,实现从既定的文本文件(.txt文件)读取要模拟的一系列数据,然后通过按钮方法动态调用封装好的dll文件来计算出结果,最后把结果返回到图形界面的textbox中;
实现过程:
一,建立动态链接库
1 新建>工程> 类库,给要建立的类库改名为:cp( 即 computing process);
2 为了便于以后的计算,在自动生成的class1类中定义一下方法:
public double factorial(int i) 实现阶乘;
public double Combination(int m, int n) 组合数计算方法;
public double compute(double dept1, int m, int n) 计算条件概率;
public double quangai(double xa, double xb, double dept1, double dept2, int m, int n) 用全概公式计算方法;
public double houyan_a(double xa, double xb, double dept1, double dept2, int m, int n) 后验概率方法一;
public double houyan_b(double xa, double xb, double dept1, double dept2, int m, int n) 后验概率方法二;
using System;
using System.Collections.Generic;
using System.Text;
namespace cp
{
public class Class1
{
public double factorial(int i)
{
if (i == 0)
return 1;
else return i * factorial(i - 1);
}
public double Combination(int m, int n)
{
return factorial(m) / (factorial(n) * factorial(m - n));
}
public double compute(double dept1, int m, int n)
{
return Combination(m, n) * Math.Pow(dept1, n) * Math.Pow(1 - dept1, m - n);
}
public double quangai(double xa, double xb, double dept1, double dept2, int m, int n)
{
return (xa * compute(dept1, m, n) + xb * compute(dept2, m, n));
}
public double houyan_a(double xa, double xb, double dept1, double dept2, int m, int n)
{
return (xa * compute(dept1, m, n)) / quangai(xa, xb, dept1, dept2, m, n);
}
public double houyan_b(double xa, double xb, double dept1, double dept2, int m, int n)
{
return (xb * compute(dept2, m, n)) / quangai(xa, xb, dept1, dept2, m, n);
}
}
}
3 配置输出,在解决方案上右击——属性,在应用程序选卡中需要注意一下三个内容:1.程序集名称2.默认命名空间3.输出类型
1.cp 2.cp 3.类库
ps:这些对我调用来说很有用!
4 写完以上方法后点击“生成”>"生成cp";如果以上都没有错误,就可以在该工程所在
文件夹中找到"cp.dll"
即,刚生成的动态链接库,以备后面的计算所调用,就这样几步已经把最核心的计算过程全部封装到了cp.dll中。
二 设计输入界面实现动态调用
1 新建>项目>windows应用程序,点击,修改项目名称为“Bayes_test”,确定;
2 在弹出的主界面上,设计自己的输入界面,我的界面如下:
3 界面设计说明:
变量xa为 最初迭代前a的可信度值;变量x为 最初迭代前b的可信度值;
变量xa为 最初迭代后a的可信度值;变量xa为 最初迭代后a的可信度值;
最后需要通过点击“开始”按钮实现文件读取和计算过程以及结果返回的功能。
4 单击左边的“应用” >"添加引用">"l浏览",在cp项目工程中找到cp.dll文件,点击确认,然后就可以在应用中看到多了一个名叫cp的引用。然后在名字空间中添加“using cp ”和“using system.Runtime.InteropServices”;
5 双击“开始”按钮进入开始按钮的点击方法中,在开始按钮的方法中实现读取文件和计算,以及结果返回的过程,代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.IO;
using cp;
namespace Bayes_test
{
public partial class Form1 : Form
{
public double xa;
public double xb;
public double ha;
public double hb;
[DllImport("cp.dll")]
public static extern double houyan(double xa, double xb, double dept1, double dept2, int m, int n);
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string temp;
double tb3;
double tb4;
string path = @"C:\Documents and Settings\chriswang\桌面\hello.txt";
double.TryParse(textBox1.Text, out xa);
double.TryParse(textBox2.Text, out xb);
StreamReader fileStream = new StreamReader(path, Encoding.Default);
temp = fileStream.ReadToEnd();
string[] abc = temp.Split(new Char[] { ',', '', '\n', '\t' });
int l = abc.Length;
int[] guance = new int[l];
for (int i = 0; i < guance.Length; i++)
{
Int32.TryParse(abc[i], out guance[i]);
}
Console.Write("文件中的数据是:");
for (int i = 0; i < guance.Length; i++)
{
Console.Write(guance[i] + "");
}
cp.Class1 k = new Class1();
for (int i = 0; i < guance.Length; i += 2)
{
int m;
int n;
m = guance[i];
n = guance[i + 1];
tb3 = k.houyan_a(xa, xb, 0.9, 0.7, m, n);
Console.Write(tb3);
tb4 = k.houyan_b(xa, xb, 0.9, 0.7, m, n);
Console.Write(tb4);
xa = tb3;
xb = tb4;
}
textBox3.Text = xa.ToString();
textBox4.Text = xb.ToString();
fileStream.Close();
}
private void button2_Click(object sender, EventArgs e)
{
Close();
}
}
}
三 运行结果演示
读取的文件中数据是"5 5 10 9"
迭代两次后结果和例题相符,说明过程正确。