今天,我給大家帶來C#與人工智慧的第4講——創建樸素貝葉斯分類器。#人工智慧#本文先實現一個簡單的貝葉斯分類器,輸入二進位,判斷0-7。後續文章會講述它的高級應用——貝葉斯推理機。
C#與人工智慧(第3講)創建神經網絡
C#與人工智慧(第2講)創建WinForm程序
C#與人工智慧(第1講)安裝C#編程環境
託馬斯·貝葉斯是18世紀英國數學家,概率論、貝葉斯統計的創立者。
貝葉斯方法基於貝葉斯原理,對樣本數據集進行分類。它綜合了先驗概率、後驗概率,避免僅用先驗概率產生的主觀偏見。
首先,按第1講所述,安裝Visual Studio 2019編碼工具。然後,按第2講所述,創建一個Windows Form應用程式。然後,按第3講所述,下載安裝Accord插件。
準備好工具後,編寫如下代碼:
using Accord.MachineLearning.Bayes;
using Accord.Statistics.Filters;
using System;
using System.Data;
using System.Windows.Forms;
namespace WindowsFormsApp3 {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}
private void Add(DataTable data, string 參數1, string 參數2, string 參數3, string 結果) {
// 新增一條記錄
DataRow dr = data.NewRow();
// 向欄位賦值
dr["參數1"] = 參數1;
dr["參數2"] = 參數2;
dr["參數3"] = 參數3;
dr["結果"] = 結果;
// 把新記錄加到表裡
data.Rows.Add(dr);
}
private void button1_Click(object sender, EventArgs e) {
// 創建一個DataTable實例。它就是一張數據表,但不用接入任何資料庫,直接在內存裡使用!
DataTable data = new DataTable("二進位運算");
// 創建 參數1 欄位,字符串類型
data.Columns.Add("參數1", typeof(string));
// 創建 參數2 欄位,字符串類型
data.Columns.Add("參數2", typeof(string));
// 創建 參數3 欄位,字符串類型
data.Columns.Add("參數3", typeof(string));
// 創建 結果 欄位,字符串類型
data.Columns.Add("結果", typeof(string));
// 通過Add()方法,插入8條記錄,對應著二進位0-7,完成樣本庫的構建
Add(data, "0", "0", "0", "0");
Add(data, "0", "0", "1", "1");
Add(data, "0", "1", "0", "2");
Add(data, "0", "1", "1", "3");
Add(data, "1", "0", "0", "4");
Add(data, "1", "0", "1", "5");
Add(data, "1", "1", "0", "6");
Add(data, "1", "1", "1", "7");
// 對DataTable樣本庫進行編碼
Codification codebook = new Codification(data, "參數1", "參數2", "參數3", "結果");
DataTable symbols = codebook.Apply(data);
int[][] inputData = new int[8][]; // 輸入的樣本
for (int r = 0; r < symbols.Rows.Count; r++) {
DataRow dr = symbols.Rows[r];
inputData[r] = new int[3];
inputData[r][0] = Convert.ToInt32(dr[0]);
inputData[r][1] = Convert.ToInt32(dr[1]);
inputData[r][2] = Convert.ToInt32(dr[2]);
}
int[] outputData = new int[8]; // 對應的輸出
for (int r = 0; r < symbols.Rows.Count; r++) {
DataRow dr = symbols.Rows[r];
outputData[r] = Convert.ToInt32(dr[3]);
}
// 創建樸素貝葉斯分類器
NaiveBayesLearning learner = new NaiveBayesLearning();
// 對樣本庫進行學習
NaiveBayes nb = learner.Learn(inputData, outputData);
// 創建一個新樣本(假設它是不在樣本庫裡的陌生樣本)
int[] instance = codebook.Translate("1", "1", "0");
int c1 = nb.Decide(instance);
// 返回分類結果(result=6)
string result = codebook.Translate("結果", c1);
// 查看每種可能性的概率值
double[] probs = nb.Probabilities(instance);
MessageBox.Show(result);
}
}
}
如上圖所示,probs數組列出樣本庫裡每個樣本的概率,對於輸入的1、1、0來講,分類器認為概率最大的結果是6。
您可以刪除「Add(data, "1", "1", "0", "6");」那行代碼(注意要把inputData、outputData的數組長度從8改成7)。然後,再運行程序,分類器返回7,此時最接近的結論是1、1、1。
如果喜歡,請關注我,或長按「點讚」按鈕,後續會有更多編程知識分享給大家。