机器学习实战_初识朴素贝叶斯算法_理解其python代码(一)

简介: 机器学习实战_初识朴素贝叶斯算法_理解其python代码(一)

这是经过我修改后能在python3.0中完美运行的Bayes project源代码,可以直接拿来学习:
http://download.csdn.net/download/qq_36396104/10142849

一:加载数据的代码:

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)#得到dataSet里面的所有语句的单词(不重复,但排序无规律)
    return list(vocabSet)
'''将一条留言转换为词(数字)向量(参照vocabList),通过词向量和vocabList便可得到一个句子'''
def setOfWords2Vec(vocabList,inputSet):
    returnVec = [0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:#判断inputSet里的单词是否在vocabList内
            returnVec[vocabList.index(word)] = 1
        else: print("the word:%s is not in my Vocabulary!" % word)
    return returnVec
'''词袋模型:一个词可以在文档内出现多次(>=1)(一旦出现这种情况则:可能包含该词是否出现在文档所不能表达的某种信息)'''
def bagOfWords2VecMN(vocabList,inputSet):
    returnVec = [0] * len(vocabList)
    for word in inputSet:
        if word in vocabList:  # 判断inputSet里的单词是否在vocabList内
            returnVec[vocabList.index(word)] += 1
    return returnVec

二:朴素贝叶斯算法:

from numpy import *
import LoadData
'''从词向量中计算每个单词(属性)在相应类别中的概率'''
def trainNB0(trainMatrix,trainCategory):#输入的是词向量以及其对应的类别
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCategory)/float(numTrainDocs)#计算侮辱性文档的概率
    # p0Num = zeros(numWords);p1Num = zeros(numWords)#得到正常文档和侮辱性文档中使用词汇表中每个单词的使用次数
    # p0Denom = 0.0;p1Denom = 0.0#计算正常文档和侮辱性文档中使用词汇表中的单词的总个数
    '''为避免出现概率率值为0的数:'''
    p0Num = ones(numWords);# 得到正常文档和侮辱性文档中使用词汇表中每个单词的使用次数
    p1Num = ones(numWords)
    p0Denom = 1.0;# 计算正常文档和侮辱性文档中使用词汇表中的单词的总个数
    p1Denom = 1.0
    for i in range(numTrainDocs):#统计每个词向量
        if trainCategory[i] ==1:
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    # p1Vect = p1Num/p1Denom#计算侮辱性文档中使用到的词汇表中每个单词的概率,即计算侮辱性文档中每个属性的概率P1(w|c)
    # p0Vect = p0Num/p0Denom#计算正常文档中使用到的词汇表中每个单词的概率,即计算正常文档中每个属性的概率P1(w|c)
    '''防止下溢出(计算得到的数字太小而被四舍五入为0)'''
    p1Vect = log(p1Num / p1Denom) # 计算侮辱性文档中使用到的词汇表中每个单词的概率,即计算侮辱性文档中每个属性的概率P1(w|c)
    p0Vect = log(p0Num / p0Denom)  # 计算正常文档中使用到的词汇表中每个单词的概率,即计算正常文档中每个属性的概率P1(w|c)
    return p0Vect,p1Vect,pAbusive
def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1):#使用计算出的相应概率利用公式进行类别概率计算
    p1 = sum(vec2Classify*p1Vec) + log(pClass1)
    p0 = sum(vec2Classify*p0Vec) + log(1.0 - pClass1)
    if p1 > p0:
        return 1
    else:
        return 0
def testingNB():
    #计算相应的条件概率
    listOPosts,listClassis = LoadData.loadDataSet()
    myVocabList = LoadData.createVocabList(listOPosts)
    trainMat = []
    for postinDoc in listOPosts:
        trainMat.append(LoadData.setOfWords2Vec(myVocabList,postinDoc))
    p0V,p1V,pAb = trainNB0(array(trainMat),array(listClassis))
    '''正式归类'''
    testEntry = ['love','my','dalmation']
    thisDoc = array(LoadData.setOfWords2Vec(myVocabList,testEntry))
    print(testEntry,'classified as:',classifyNB(thisDoc,p0V,p1V,pAb))
    testEntry = ['stupid','garbage']
    thisDoc = array(LoadData.setOfWords2Vec(myVocabList,testEntry))
    print(testEntry,'classified as:',classifyNB(thisDoc,p0V,p1V,pAb))

三:测试代码:

import LoadData
import bayes
'''准备数据'''
listOPosts,listClasses = LoadData.loadDataSet()
myVocabList = LoadData.createVocabList(listOPosts)
print(myVocabList)
print(LoadData.setOfWords2Vec(myVocabList,listOPosts[0]))
print(LoadData.setOfWords2Vec(myVocabList,listOPosts[3]))
'''从词向量计算概率:'''
from numpy import *
import bayes
listOPosts,listClasses = LoadData.loadDataSet()
myVocabList = LoadData.createVocabList(listOPosts)
trainMat = []
for postinDoc in listOPosts:
    trainMat.append(LoadData.setOfWords2Vec(myVocabList,postinDoc))
print(trainMat)
p0V,p1V,pAb = bayes.trainNB0(trainMat,listClasses)
print(pAb)
print(p0V)
print(p1V)
'''测试算法:'''
bayes.testingNB()

AIEarth是一个由众多领域内专家博主共同打造的学术平台,旨在建设一个拥抱智慧未来的学术殿堂!【平台地址:https://devpress.csdn.net/aiearth】 很高兴认识你!加入我们共同进步!

目录
相关文章
|
8月前
|
算法 搜索推荐 JavaScript
基于python智能推荐算法的全屋定制系统
本研究聚焦基于智能推荐算法的全屋定制平台网站设计,旨在解决消费者在个性化定制中面临的选择难题。通过整合Django、Vue、Python与MySQL等技术,构建集家装设计、材料推荐、家具搭配于一体的一站式智能服务平台,提升用户体验与行业数字化水平。
|
8月前
|
测试技术 Python
Python装饰器:为你的代码施展“魔法”
Python装饰器:为你的代码施展“魔法”
388 100
|
8月前
|
开发者 Python
Python列表推导式:一行代码的艺术与力量
Python列表推导式:一行代码的艺术与力量
585 95
|
8月前
|
缓存 Python
Python装饰器:为你的代码施展“魔法
Python装饰器:为你的代码施展“魔法
492 88
|
8月前
|
监控 机器人 编译器
如何将python代码打包成exe文件---PyInstaller打包之神
PyInstaller可将Python程序打包为独立可执行文件,无需用户安装Python环境。它自动分析代码依赖,整合解释器、库及资源,支持一键生成exe,方便分发。使用pip安装后,通过简单命令即可完成打包,适合各类项目部署。
1456 68
|
8月前
|
算法 数据可视化 测试技术
HNSW算法实战:用分层图索引替换k-NN暴力搜索
HNSW是一种高效向量检索算法,通过分层图结构实现近似最近邻的对数时间搜索,显著降低查询延迟。相比暴力搜索,它在保持高召回率的同时,将性能提升数十倍,广泛应用于大规模RAG系统。
727 10
HNSW算法实战:用分层图索引替换k-NN暴力搜索
|
8月前
|
机器学习/深度学习 缓存 算法
微店关键词搜索接口核心突破:动态权重算法与语义引擎的实战落地
本文详解微店搜索接口从基础匹配到智能推荐的技术进阶路径,涵盖动态权重、语义理解与行为闭环三大创新,助力商家提升搜索转化率、商品曝光与用户留存,实现技术驱动的业绩增长。
|
8月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
8月前
|
机器学习/深度学习 数据采集 人工智能
【机器学习算法篇】K-近邻算法
K近邻(KNN)是一种基于“物以类聚”思想的监督学习算法,通过计算样本间距离,选取最近K个邻居投票决定类别。支持多种距离度量,如欧式、曼哈顿、余弦相似度等,适用于分类与回归任务。结合Scikit-learn可高效实现,需合理选择K值并进行数据预处理,常用于鸢尾花分类等经典案例。(238字)
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
1825 6

推荐镜像

更多