【机器学习】实验一 实验报告
文章目錄
- 一、 參數說明
- 1、在開始貝葉斯判定前,先要設置上面幾個參數。
- 2、樣例文件格式說明
- 二、實驗結果
- 三、設計說明
- 1、文件關系
- 2、各個文件詳細設計及測試
- ①一些說明
- ②各個函數的測試
- a)、matrix.h的測試
- 1) 構造函數及print函數測試:
- 2)等號重載及行列式函數測試
- 3)乘號重載驗證
- 4)逆矩陣測試
- 5)將矩陣作為向量使用時正確性驗證及矩陣轉置測試
- 6)矩陣加法、數乘及setElemet函數驗證
- b)storage.h測試
- c) bayes.h測試
- 1)馬氏距離函數驗證
- 3、正確性說明
- 四、遇到的困難
- [報錯:缺少合適的復制構造函數](https://blog.csdn.net/C2681595858/article/details/83956459)
- [程序莫名奔潰,原來是strcpy_s出問題了](https://blog.csdn.net/C2681595858/article/details/83990068)
一、 參數說明
github最新代碼下載鏈接
-這個上面是最新的代碼,需要使用命令行g++6.3.0以上的編譯器編譯,若使用linux,需要將Makefile文件中的rm改為del,將main改為main.exe
1、在開始貝葉斯判定前,先要設置上面幾個參數。
第一個是樣本數據所在文件名。
第二個是設置有多少個類別
第三個是每個類別有多少個樣本數據
第三個是每個樣本數據的維度
設置完這些,還有一項沒設置就是先驗概率。
先驗概率在“sample.txt”文件中進行設置,具體sample.txt文件格式要求如下:
2、樣例文件格式說明
文件開頭是各個類的先驗概率,有多少個類就應該有多少個先驗概率,就是說各個類的先驗概率相同也都要寫進去,而不能省略。
然后后續是各個類的樣本數據,數據需要按類別的順序依次排放。具體如下:
二、實驗結果
- 這是在win10 vs2017 c++環境下的實驗結果
上面顯示的是一個向量到某一個類別的馬氏距離。下面顯示各個向量應該是哪個類。
三、設計說明
1、文件關系
2、各個文件詳細設計及測試
①一些說明
- 文件詳細設計在各個.h文件中有詳細注釋,目的導向作業,所以matrix只實現了作業中會用到的算法。
- matrix.h中求行列式的算法det()沒有使用了遞歸, 為了避免在類之外使用其遞歸部分,將其放在了private中。
- inverse()求逆矩陣,沒有使用高斯方法,直接使用了伴隨矩陣,效率較低,但是實現簡單。
②各個函數的測試
a)、matrix.h的測試
測試文件matrixTest.cpp
1) 構造函數及print函數測試:
代碼:
float array[] = { 1.02, 2.03, 3.04, 4.05, 5.06, 6.07, 7.08, 8.09, 9.10, 5.06, 6.07, 8.09, 3.04, 6.07, 9.10, 8.09 };Matrix matrix(4, 4, array);matrix.printMatrix();結果:
2)等號重載及行列式函數測試
代碼:
float array[] = { 1.02, 2.03, 3.04, 4.05, 5.06, 6.07, 7.08, 8.09, 9.10, 5.06, 6.07, 8.09, 3.04, 6.07, 9.10, 8.09 };Matrix matrix(4, 4, array);Matrix matrix1;matrix1 = matrix;cout << matrix1.det() << endl;結果:
結果正確性驗證(使用了matlab)
3)乘號重載驗證
代碼:
float array[] = { 1.02, 2.03, 3.04, 4.05, 5.06, 6.07, 7.08, 8.09, 9.10, 5.06, 6.07, 8.09, 3.04, 6.07, 9.10, 8.09 };Matrix matrix(4, 4, array);Matrix matrix1;matrix1 = matrix;Matrix matrix2(2, 6);matrix2 = (matrix * matrix1);matrix2.printMatrix();結果:
驗證結果:
4)逆矩陣測試
代碼:
float array[] = { 1.02, 2.03, 3.04, 4.05, 5.06, 6.07, 7.08, 8.09, 9.10, 5.06, 6.07, 8.09, 3.04, 6.07, 9.10, 8.09 };Matrix matrix(4, 4, array);(matrix.inverse()).printMatrix();結果:
驗證結果:
5)將矩陣作為向量使用時正確性驗證及矩陣轉置測試
代碼:
float vect[2] = { 2,2.34 };Matrix matrix5(2, 1, vect);(matrix5*(matrix5.trans())).printMatrix();結果:
結果驗證:
6)矩陣加法、數乘及setElemet函數驗證
代碼:
Matrix matrix2(2, 6);matrix2.setElement(1, 2, 6);matrix2.setElement(2, 3, 6);matrix2.setElement(1, 1, 6);matrix2.setElement(2, 6, 6);matrix2.printMatrix();(matrix2 + matrix2).printMatrix();(3.99 * matrix2).printMatrix();結果:
b)storage.h測試
Storage storage;storage.setfile("sample.txt");storage.setVectorLen(3);//先讀開頭的先驗概率storage.readPostPro();storage.readPostPro();storage.readPostPro();//讀30次到文件末尾for(int counter = 0; counter < 30; counter++)(storage.readData()).printMatrix();//返回開頭storage.reset();//這里應該是先驗概率(storage.readData()).printMatrix();結果:最后都到了最后一個向量然后返回頭部,又都到了先驗概率,說明所有函數正確
c) bayes.h測試
這里主要用到了均值向量求解函數和協方差陣求解函數,只要需驗證這兩個正確,而馬氏距離的計算用到了上述兩個結果,所以只要馬氏距離正確,則函數正確:
特殊說明:由于在寫下面這部分的時候我的樣本文件是有問題的,所以mahal距離可能和大家的不同,但是我在matlab輸入的樣本文件和我程序中用的樣本文件是一樣的(都是有錯誤的),所以最終還是能夠驗證我的算法是正確的
1)馬氏距離函數驗證
代碼:
Bayes bayes;bayes.setSampleFile("sample.txt");bayes.setClassSize(3);bayes.setSampleSize(10);bayes.setVectorLen(3);cout << "\nMahalanobis :\n";cout << "[1,2,1] to w1 " << bayes.mahal("[1,2,1]", 1) << " " << endl;結果:
結果驗證:
3、正確性說明
總上,從底層到頂層各個函數都和matlab中相關函數運算結果一致,所以最終結果可信度較高。
四、遇到的困難
- 本來早早寫完了,然后寫完發現判定結果和大家的判定結果不一致,但是就像上面這樣,每一步都是通過matlab驗證了的,難道我對概念理解有誤,查了很多資料。發現實現方法上確實有些不同,但是本質是沒有變的。然后就照搬別人思路,實現代碼,這樣一改,不僅沒有改好,反而越改越亂了。然后我確信程序沒有問題以后,就放棄了修改,就這樣吧。但是不甘心啊,每一步都對,最后一步出錯,真的難受,第二天中午,一覺醒來看了下QQ群,大家再說自己樣本文件出了差錯,導致出錯,我也看看是不是我也是這樣,看了一遍,沒看出啥東西來。但是我還是有點不太確定它有沒有錯誤,畢竟其他都可以驗證是正確的,唯獨它沒有驗證。所以我重新從課本上抄了一遍文件。我天。。正確了,真是太激動了哈哈哈哈哈。這個故事告訴我們,在可控因素確信無疑時,一定要仔細的研究不可控因素。說不定貓膩就在那里呢。
- 我另寫了兩篇博客說明了遇到的其他困難和解決辦法:
報錯:缺少合適的復制構造函數
程序莫名奔潰,原來是strcpy_s出問題了
總結
以上是生活随笔為你收集整理的【机器学习】实验一 实验报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS之蓝牙开发
- 下一篇: JefferyZhao教导我们...