>  기사  >  백엔드 개발  >  pythonde 나이브 베이즈 알고리즘

pythonde 나이브 베이즈 알고리즘

巴扎黑
巴扎黑원래의
2017-09-04 13:41:141857검색

알고리즘의 장점과 단점

장점: 데이터가 적을 때 여전히 효과적이며 다중 범주 문제를 처리할 수 있음

단점: 입력 데이터 준비 방법에 민감함

적용 가능한 데이터 유형: 명목 데이터

알고리즘 아이디어:

Naive Bayes

예를 들어 이메일이 스팸인지 여부를 확인하려면 이메일에 포함된 단어의 분포만 알면 스팸 이메일에 특정 단어가 몇 번 나오는지, 그러면 Bayes의 정리를 사용하여 얻을 수 있습니다.

Naive Bayes 분류기의 가정은 각 기능이 동일하게 중요하다는 것입니다.

베이지안 분류는 분류 알고리즘 클래스에 대한 일반적인 용어입니다. 이러한 유형의 알고리즘은 베이즈 정리를 기반으로 하므로 총칭하여 베이지안 분류라고 합니다. .

Function

loadDataSet()

데이터 세트를 생성합니다. 여기에 있는 데이터 세트는 단어가 분리되어 구성된 문장으로, 라벨 1은 이것이 저주임을 의미합니다.

createVocabList( dataSet )

단어 벡터의 크기를 결정하기 위해 이 문장에 몇 개의 단어가 있는지 알아보세요.

setOfWords2Vec(vocabList, inputSet)

여기에서는 베르누이 모델이 사용됩니다. , 즉 단어가 존재하는지만을 고려합니다

bagOfWords2VecMN(vocabList, inputSet)

이것은 특정 단어의 출현 횟수를 고려한 다항식 모델인 문장을 벡터로 변환하는 또 다른 모델입니다

trainNB0(trainMatrix,trainCategory)

P(i) 및 P(w[i]|C[1]) 및 P(w[i]|C[0]) 계산에는 두 가지 트릭이 있습니다. 하나는 시작 분자와 분모가 아니라는 것입니다. 그 중 하나가 0이 되어 전체가 0이 되는 확률을 방지하기 위해 모두 0으로 초기화하고, 나머지 하나는 나중에 곱셈 로그를 사용하여 정확도 문제로 인해 결과가 0이 되는 것을 방지합니다

classifyNB( vec2Classify, p0Vec, p1Vec, pClass1)

베이즈 공식에 따라 이 벡터를 계산하세요. 두 세트 중 어느 것이 더 높은 확률을 가지고 있는지

#coding=utf-8
from numpy import *
def loadDataSet():
    postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
                 ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
                 ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
                 ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
                 ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
                 ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
    classVec = [0,1,0,1,0,1]    #1 is abusive, 0 not
    return postingList,classVec
#创建一个带有所有单词的列表
def createVocabList(dataSet):
    vocabSet = set([])
    for document in dataSet:
        vocabSet = vocabSet | set(document)
    return list(vocabSet)
    
def setOfWords2Vec(vocabList, inputSet):
    retVocabList = [0] * len(vocabList)
    for word in inputSet:
        if word in vocabList:
            retVocabList[vocabList.index(word)] = 1
        else:
            print 'word ',word ,'not in dict'
    return retVocabList
#另一种模型    
def bagOfWords2VecMN(vocabList, inputSet):
    returnVec = [0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] += 1
    return returnVec
def trainNB0(trainMatrix,trainCatergory):
    numTrainDoc = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCatergory)/float(numTrainDoc)
    #防止多个概率的成绩当中的一个为0
    p0Num = ones(numWords)
    p1Num = ones(numWords)
    p0Denom = 2.0
    p1Denom = 2.0
    for i in range(numTrainDoc):
        if trainCatergory[i] == 1:
            p1Num +=trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:
            p0Num +=trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = log(p1Num/p1Denom)#处于精度的考虑,否则很可能到限归零
    p0Vect = log(p0Num/p0Denom)
    return p0Vect,p1Vect,pAbusive
    
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    p1 = sum(vec2Classify * p1Vec) + log(pClass1)    #element-wise mult
    p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
    if p1 > p0:
        return 1
    else: 
        return 0
        
def testingNB():
    listOPosts,listClasses = loadDataSet()
    myVocabList = createVocabList(listOPosts)
    trainMat=[]
    for postinDoc in listOPosts:
        trainMat.append(setOfWords2Vec(myVocabList, postinDoc))
    p0V,p1V,pAb = trainNB0(array(trainMat),array(listClasses))
    testEntry = ['love', 'my', 'dalmation']
    thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
    print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)
    testEntry = ['stupid', 'garbage']
    thisDoc = array(setOfWords2Vec(myVocabList, testEntry))
    print testEntry,'classified as: ',classifyNB(thisDoc,p0V,p1V,pAb)
    
    
def main():
    testingNB()
    
if __name__ == '__main__':
    main()

위 내용은 pythonde 나이브 베이즈 알고리즘의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.