机器学习实战_初识朴素贝叶斯算法_理解其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】 很高兴认识你!加入我们共同进步!

目录
相关文章
|
2月前
|
算法 数据可视化 测试技术
HNSW算法实战:用分层图索引替换k-NN暴力搜索
HNSW是一种高效向量检索算法,通过分层图结构实现近似最近邻的对数时间搜索,显著降低查询延迟。相比暴力搜索,它在保持高召回率的同时,将性能提升数十倍,广泛应用于大规模RAG系统。
168 10
HNSW算法实战:用分层图索引替换k-NN暴力搜索
|
2月前
|
机器学习/深度学习 数据采集 人工智能
【机器学习算法篇】K-近邻算法
K近邻(KNN)是一种基于“物以类聚”思想的监督学习算法,通过计算样本间距离,选取最近K个邻居投票决定类别。支持多种距离度量,如欧式、曼哈顿、余弦相似度等,适用于分类与回归任务。结合Scikit-learn可高效实现,需合理选择K值并进行数据预处理,常用于鸢尾花分类等经典案例。(238字)
|
2月前
|
机器学习/深度学习 缓存 算法
微店关键词搜索接口核心突破:动态权重算法与语义引擎的实战落地
本文详解微店搜索接口从基础匹配到智能推荐的技术进阶路径,涵盖动态权重、语义理解与行为闭环三大创新,助力商家提升搜索转化率、商品曝光与用户留存,实现技术驱动的业绩增长。
|
4月前
|
机器学习/深度学习 算法 文件存储
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
神经架构搜索(NAS)正被广泛应用于大模型及语言/视觉模型设计,如LangVision-LoRA-NAS、Jet-Nemotron等。本文回顾NAS核心技术,解析其自动化设计原理,探讨强化学习、进化算法与梯度方法的应用与差异,揭示NAS在大模型时代的潜力与挑战。
1006 6
神经架构搜索NAS详解:三种核心算法原理与Python实战代码
|
2月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
3月前
|
机器学习/深度学习 资源调度 算法
遗传算法模型深度解析与实战应用
摘要 遗传算法(GA)作为一种受生物进化启发的优化算法,在复杂问题求解中展现出独特优势。本文系统介绍了GA的核心理论、实现细节和应用经验。算法通过模拟自然选择机制,利用选择、交叉、变异三大操作在解空间中进行全局搜索。与梯度下降等传统方法相比,GA不依赖目标函数的连续性或可微性,特别适合处理离散优化、多目标优化等复杂问题。文中详细阐述了染色体编码、适应度函数设计、遗传操作实现等关键技术,并提供了Python代码实现示例。实践表明,GA的成功应用关键在于平衡探索与开发,通过精心调参维持种群多样性同时确保收敛效率
|
3月前
|
机器学习/深度学习 边缘计算 人工智能
粒子群算法模型深度解析与实战应用
蒋星熠Jaxonic是一位深耕智能优化算法领域多年的技术探索者,专注于粒子群优化(PSO)算法的研究与应用。他深入剖析了PSO的数学模型、核心公式及实现方法,并通过大量实践验证了其在神经网络优化、工程设计等复杂问题上的卓越性能。本文全面展示了PSO的理论基础、改进策略与前沿发展方向,为读者提供了一份详尽的技术指南。
粒子群算法模型深度解析与实战应用
|
7月前
|
机器学习/深度学习 人工智能 算法
Scikit-learn:Python机器学习的瑞士军刀
想要快速入门机器学习但被复杂算法吓退?本文详解Scikit-learn如何让您无需深厚数学背景也能构建强大AI模型。从数据预处理到模型评估,从垃圾邮件过滤到信用风险评估,通过实用案例和直观图表,带您掌握这把Python机器学习的'瑞士军刀'。无论您是AI新手还是经验丰富的数据科学家,都能从中获取将理论转化为实际应用的关键技巧。了解Scikit-learn与大语言模型的最新集成方式,抢先掌握机器学习的未来发展方向!
1022 12
Scikit-learn:Python机器学习的瑞士军刀
|
7月前
|
机器学习/深度学习 数据采集 人工智能
20分钟掌握机器学习算法指南
在短短20分钟内,从零开始理解主流机器学习算法的工作原理,掌握算法选择策略,并建立对神经网络的直观认识。本文用通俗易懂的语言和生动的比喻,帮助你告别算法选择的困惑,轻松踏入AI的大门。
|
2月前
|
机器学习/深度学习 算法 机器人
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
【水下图像增强融合算法】基于融合的水下图像与视频增强研究(Matlab代码实现)
233 0

推荐镜像

更多