日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【机器学习】实验一 实验报告

發布時間:2023/12/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【机器学习】实验一 实验报告 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、 參數說明
    • 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出問題了

總結

以上是生活随笔為你收集整理的【机器学习】实验一 实验报告的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。