1. 程式人生 > 其它 >20192308王澤榮《python程式設計》實驗四報告

20192308王澤榮《python程式設計》實驗四報告

20192308 王澤榮《python》實驗四報告

課程:《程式設計與資料結構》
班級: 1923
姓名: 王澤榮
學號:20192308
實驗教師:王志強
實驗日期:2020年5月21日
必修/選修: 選修

1.實驗內容和實驗要求

Python綜合應用:爬蟲、資料處理、視覺化、機器學習、神經網路、遊戲、網路安全等。
(1)程式能執行,功能豐富。(需求提交原始碼,並建議錄製程式執行的視訊)
(2)綜合實踐報告,要體現實驗分析、設計、實現過程、結果等資訊,格式規範,邏輯清晰,結構合理。
(3)在實踐報告中,需要對全課進行總結,並寫課程感想體會、意見和建議等。
(4)使用華為雲伺服器

2.實驗選題和思路概括

  • 實驗選題:樸素貝葉斯分類器的實現
  • 程式碼的大致思路:在計算前,先有一組由特徵值和分類組成的訓練集,而後通過計算先驗概率,通過累加得到特徵數有幾個,進而得到一個儲存條件概率的矩陣,然後就可以對樣本進行分類了。

2. 實驗過程及結果

  • 在pycharm上的執行結果(截圖中result後的輸出結果代表正類負類兩個類別(+-1)和其對應的概率
  • 在華為雲伺服器上的執行結果
點選展開程式碼

import numpy as np
#構造NB分類器
def Train(X_train, Y_train, feature):
    global class_num,label
    class_num = 2           #分類數目
    label = [1, -1]         #分類標籤
    feature_len = 3         #特徵長度
    #構造3×2的列表
    feature = [[1, 'S'],
               [2, 'M'],
               [3, 'L'],[4,]]
    prior_prob = np.zeros(class_num)
    con_prob = np.zeros((class_num,feature_len,2))   # 初始化條件概率
    positive_count = 0     #統計正類
    negative_count = 0     #統計負類
    for i in range(len(Y_train)):
        if Y_train[i] == 1:
            positive_count += 1
        else:
            negative_count += 1
    prior_prob[0] = positive_count / len(Y_train)    #求得正類的先驗概率
    prior_prob[1] = negative_count / len(Y_train)    #求得負類的先驗概率
    '''
    con_prob是一個2*3*2的三維列表,第一維是類別分類(class即+-1),第二維和第三維是一個3*2的特徵分類,第三維的是哪一個特徵,第二維是特徵值
    '''
    #分為兩個類別
    for i in range(class_num):
        #對特徵按行遍歷
        for j in range(feature_len):
            #遍歷資料集,並依次做判斷
            for k in range(len(Y_train)):
                if Y_train[k] == label[i]: #相同類別
                    if X_train[k][0] == feature[j][0]:#第幾個(0號或1號特徵值)的值相等,計數加個一
                        con_prob[i][j][0] += 1
                    if X_train[k][1] == feature[j][1]:
                        con_prob[i][j][1] += 1
    class_label_num = [positive_count, negative_count]  #存放各型別的數目
    for i in range(class_num):
        for j in range(feature_len):
            '''
            此處把原先存數量的位置轉而存概率,con_prob。
            '''
            con_prob[i][j][0] = con_prob[i][j][0] / class_label_num[i]  #求得i類j行第一個特徵的條件概率
            con_prob[i][j][1] = con_prob[i][j][1] / class_label_num[i]  #求得i類j行第二個特徵的條件概率
    return prior_prob,con_prob
#給定資料進行分類
def Predict(testset, prior_prob, con_prob, feature):#測試,先驗概率,條件概率,特徵
    result = np.zeros(len(label))
    for i in range(class_num):
        for j in range(len(feature)):
            if feature[j][0] == testset[0]:#第一個(0號)特徵值的概率
                conA = con_prob[i][j][0]
            if feature[j][1] == testset[1]:#第二個(1號)特徵值的概率
                conB = con_prob[i][j][1]
        result[i] = conA * conB * prior_prob[i]#result0是正類別的概率,result1是負的概率
    result = np.vstack([result,label])#拼接
    return result
def main():
    X_train = [[1, 'S'], [1, 'M'], [1, 'M'], [1, 'S'],  [1, 'S'],
               [2, 'S'], [2, 'M'], [2, 'M'], [2, 'L'],  [2, 'L'],
               [3, 'L'], [3, 'M'], [3, 'M'], [3, 'L'],  [3, 'L']]
    Y_train = [-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1]
    #構造3×2的列表
    feature = [[1, 'S'],
               [2, 'M'],
               [3, 'L']]
    testset = [3, 'M']
    prior_prob, con_prob= Train(X_train, Y_train, feature)
    result = Predict(testset, prior_prob, con_prob, feature)
    print('The result:',result)
main()

3. 實驗過程中遇到的問題和解決過程

  • 樸素貝葉斯思想的學習花費了一定時間,涉及到了概率論和資料統計的知識需要重新瞭解
  • 在專案部署到雲伺服器的過程中需要導numpy包圖中又遇到了一些問題,需要另外下載一些依賴。
  • 指令瞭解不多,本次使用的華為euler系統是基於centos,命令與ubuntu有所不同,之前一直不明白get apt為什麼不能用

課程總結和個人感想

  • python是一門非常有潛力的高階語言,歷經多年的發展,其在程式設計上發揮著越來越大的作用。在這學期中,通過選修python課上的基礎知識學習,我對python也有了一定的認識。而且,在字串上的處理,python相對於c語言也是給程式設計師極大的便利。而python不僅如此,它的庫也很多,正因為它強大的庫,讓程式設計變得不再艱難。但是,我認為python雖然在許多方面相對於c語言比較方便,但也有其相對於弱一點的方面,比如說for迴圈等方面。雖然一學期下來,我對python的學習也僅僅只是它的基礎方面,但python的強大,也是足足地吸引著我,希望自己能夠在不斷地學習中,將python學習的更加好。 python是一門非常有潛力的高階語言,歷經多年的發展,其在程式設計上發揮著越來越大的作用。在這學期中,通過選修python課上的基礎知識學習,我對python也有了一定的認識。

  • 在學習python的第一節課上,其對我的最初的印象就是,它更加的簡潔。所有的變數都不需要提前去定義,這樣給了程式設計者很大的自由空間與方便。。而python不僅如此,它的庫也很多,正因為它強大的庫,讓程式設計變得不再艱難。我們只需要呼叫庫中的函式,而對於函式的具體實現,也沒有特殊的需求。

  • 還有非常關鍵的一點,就是相較於java的學習,python的報錯真的很少,網路上的資源利用率很高,不會像java在借鑑試執行程式碼後跳出一大堆感嘆號,另外python的軟體包真的非常好用,在此前的java學習中,尤其是在使用java的過程中經常出現jar包import不了的情況,至少在python粗淺的學習過程中還沒有遇到此類情況

  • 總的來說,本學期的python課程學習使我收穫頗豐,不同的程式語言的學習讓我有了更多的比較和對變成更多的認識,也感謝老師一學期以來耐心的授課和講解,在今後我將不斷努力不斷進步。

參考資料