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"

迭代两次后结果和例题相符,说明过程正确。

 

 

 

 



    

posted @ 2011-11-04 21:14  甲今文  阅读(262)  评论(0编辑  收藏  举报