統計學習方法第四章極大似然估計的樸素貝葉斯分類方法例題4.1程式碼實踐
阿新 • • 發佈:2019-02-10
#-*- coding:utf-8 -*-
from numpy import *
#將書上的資料輸入,這裡懶得輸入那麼多個列表就用下array的轉置方法吧!就用這個方法吧0.0
def loadDataSet():
dataSet=[[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3],['S','M','M','S','S','S','M','M','L','L','L','M','M','L','L']]
labels=[-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1]
return array(dataSet).transpose().tolist(),labels
#這裡將labels中所有不同的類別及其類別的概率儲存在一個字典中方便呼叫,這個可擴充套件性也比較強,支援n分類(不侷限於書上的二分類)
def calc_label(labels):
m=len(labels)
uniqueLabel=set(labels) #所有不重複的類別
labelRate={}
for label in uniqueLabel:
labelRate[label]=labels.count(label)/float(m)
return labelRate,list(uniqueLabel) #剛開始的uniqueLabel是set屬性不方便計算,這裡轉換成list
#計算詞彙表,即所有的不重複的屬性值融合到一個列表中
def calcVocaulary(dataset):
voca=set ()
for content in dataset:
voca = voca | set(content)
return list(voca)
#計算詞向量,在詞彙表中出現則在對應位置加1
def calcVector(voca,vector):
n=len(voca)
originVector=zeros(n)
for word in vector:
if word in voca:
originVector[voca.index(word)] += 1
return array(originVector) #為方便後面向量相加計算這裡轉換成array屬性
#開始訓練這裡將不同類別及其類別對應的訓練好的極大似然估計向量儲存到字典中,同樣字典的key長度對應於所有不重複的標記,可支援n類標記
def Bayes(dataset,labels,uniqueLabel,voca):
n=len(uniqueLabel);m=len(dataset)
trainVecDict={}
for i in range(n):
labelVector=array(zeros(len(voca)))
for j in range(m):
if labels[j]== uniqueLabel[i]:
labelVector += calcVector(voca,dataset[j]) #將相同類別的詞向量相加
labelVector /= float(labels.count(uniqueLabel[i])) #詞向量的和除對應該類別出現的頻率
trainVecDict[uniqueLabel[i]]=labelVector #將該類別及其訓練好的極大似然估計向量儲存到字典中
return trainVecDict
#開始分類,結果即為類別概率最大的那個類別
def testFunction(testArray,voca,trainVecDict,labelRate):
result = -1;maxRate = -inf
for key in trainVecDict:
singleLabelRate=1.0
for word in testArray:
singleLabelRate *= trainVecDict[key][voca.index(word)] #這裡把測試集中出現的屬性到每個分類對應的向量中取出其概率相乘
if singleLabelRate*labelRate[key] > maxRate:
result = key;maxRate =singleLabelRate*labelRate[key]
return result
dataSet,labels=loadDataSet()
labelRate,uniqueLabel=calc_label(labels)
voca=calcVocaulary(dataSet)