概率图模型

本文介绍了概率图模型,特别是朴素贝叶斯在自然语言处理中的应用,包括贝叶斯、伯努利和多项式分布的朴素贝叶斯模型,以及one-hot和TF-IDF在文本分类中的使用。还探讨了贝叶斯网络和隐马尔科夫模型的基本概念和实例。
摘要由CSDN通过智能技术生成

一、概率图模型概述

概率图模型算法往往应用于NLP自然语言处理领域

当然很多传统机器学习的算法也常用于 NLP 的任务。例如,用朴素贝叶斯进行文本分类、用 SVM 进行语义角色标注,虽然它们在某些 NLP 任务中都实现了很好的效果,但它们都相互独立, 没有形成体系。

随着近些年对智能推理和认知神经学的深入研究,人们对大脑和语言的内在机制了解得越来越多,也越来越能从更
高层次上观察和认识自然语言,由此形成一套完整的算法体系。目前最流行的算法思想包含如下两大流派:
  基于概率论和图论的概率图模型
  基于人工神经网络的深度学习理论

1.1 贝叶斯

面试常考

1.2 朴素贝叶斯

1.2.1 朴素贝叶斯实例讲解

参考:朴素贝叶斯案例解析_朴素贝叶斯分类例题-CSDN博客

1.2.2 朴素贝叶斯模型介绍

伯努利分布朴素贝叶斯

多项式分布朴素贝叶斯

1.2.3 朴素贝叶斯模型使用

使用正太分布数据,鸢尾花作为示例(鸢尾花是自然界的植物,其自身特征数据是正态分布的~)

import numpy as np
from sklearn import datasets
from sklearn.naive_bayes import GaussianNB,BernoulliNB,MultinomialNB
from sklearn.model_selection import train_test_split
X,y = datasets.load_iris(return_X_y=True)

高斯分布朴素贝叶斯表现

score = 0
model = GaussianNB()
for i in range(100):
    X_train,X_test,y_train,y_test = train_test_split(X,y)
    model.fit(X_train,y_train)
    score += model.score(X_test,y_test)/100

print('高斯朴素贝叶斯模型平均预测准确率:',score)
'''
高斯朴素贝叶斯模型平均预测准确率: 0.9549999999999994

'''

伯努利分布朴素贝叶斯表现

score = 0
model = BernoulliNB()
for i in range(100):
    X_train,X_test,y_train,y_test = train_test_split(X,y)
    model.fit(X_train,y_train)
    score += model.score(X_test,y_test)/100

print('伯努利朴素贝叶斯模型平均预测准确率:',score)
'''
伯努利朴素贝叶斯模型平均预测准确率: 0.2568421052631579

'''

多项式分布朴素贝叶斯表现

score = 0
model = MultinomialNB()
for i in range(100):
    X_train,X_test,y_train,y_test = train_test_split(X,y)
    model.fit(X_train,y_train)
    score += model.score(X_test,y_test)/100

print('多项式朴素贝叶斯模型平均预测准确率:',score)
'''
多项式朴素贝叶斯模型平均预测准确率: 0.8255263157894736

'''

1.3 文本分类

1.3.1 one-hot

文本分类的结构化方法就是 one-hot 表达模型。它是最直观,也是目前为止最常用的词表示方法,虽然越来越多的

实践已经证明,这种模型存在局限性,但它仍在文本分类中得到广泛应用。 假设把语料库中的所有词都收集为一个词典 D,词典容纳了语料库中所有句子的词汇。

One-hot 方法就是把每个词表示为一个长长的向量。这个向量的维度是词典大小,其中绝大多数元素为 0,只有一 个维度的值为 1。这个维度就代表了当前的词。

英文one-hot编码

文本一:My dog ate my homework;
文本二:My cat ate the fish;
文本三:Precious things are very few in the world,that is the reason there is only one you!

import jieba
import numpy as np
data = ['My dog ate my homework.','My cat ate the fish.',
        'Precious things are very few in the world,that is the reason there is only one you!']
result = []
for s in data:
    result.extend([i for i in jieba.lcut(s) if i not in [' ',',','.','!']])
result = np.array(result)
result = np.unique(result)
print(result)
for s in data:
    word_embedding = [(i == result).astype(np.int8) for i in jieba.lcut(s) if i not in ['',',','.','!']]
print(np.array(word_embedding))
'''
['My' 'Precious' 'are' 'ate' 'cat' 'dog' 'few' 'fish' 'homework' 'in' 'is'
 'my' 'one' 'only' 'reason' 'that' 'the' 'there' 'things' 'very' 'world'
 'you']
[[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0]]
'''

中文one-hot编码

s1 = '喜欢上一个人'
s2 = '尼姑亲吻了和尚的嘴唇'
s3 = '老师你教的都是没用的东西'

import jieba
import numpy as np


data = ['喜欢上一个人','尼姑亲吻了和尚的嘴唇','老师你教的都是没用的东西']

result = []
for s in data:
    result.extend([i for i in jieba.lcut(s)])
result = np.array(result)
result = np.unique(result)
print(result)
for s in data:
    word_embedding = [(i == result).astype(np.int8) for i in jieba.lcut(s) if i not in ['',',','.','!']]
    print(np.array(word_embedding))

'''
['一个' '上' '东西' '了' '亲吻' '人' '你' '和尚' '喜欢' '嘴唇' '尼姑' '教' '是' '没用' '的' '老师'

'都']
[[0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0]

[0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

[0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0]]

'''

1.3.2 TF-IDF

TF-IDF(term frequency–inverse document frequency,词频-逆向文件频率)是一种用于信息检索 (information retrieval)与文本挖掘(text mining)的常用加权技术

TF-IDF是一种统计方法,用以评估某字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。

TF-IDF的主要思想是:如果某个单词在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或 者短语具有很好的类别区分能力,适合用来分类。

词频TF计算

逆向文件频率IDF计算

TF-IDF计算

TF-IDF算例演示

有很多不同的数学公式可以用来计算TF-IDF。词频 (TF) 是一词语出现的次数除以该文件的总词语数。假如一篇文件 的总词语数是100个,而词语“Python”出现了5次,那么“Python”一词在该文件中的词频就是5/100=0.05。一个计 算文件频率 (IDF) 的方法是文件集里包含的文件总数除以测定有多少份文件出现过“Python”一词。所以,如果 “Python”一词在1000份文件出现过,而文件总数是10000000份的话,其逆向文件频率就是 lg(10000000 / 1000)=4。最后的TF-IDF的分数为0.05 * 4=0.2。

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
import jieba
import numpy as np

data = np.array(['政治 历史 地理 语文 化学', 'Python 计算机 语文 英语 数学'])

# 词频统计
vectorizer = CountVectorizer()


# tf-idf权值计算
tf_idf_transformer = TfidfTransformer()


# 对样本进行转换
tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(data))


# 数据提取
tf_idf_weight = tf_idf.toarray()
vocabulary = vectorizer.vocabulary_


vocabulary = sorted( vocabulary.items(),key = lambda x:x[1],reverse = False) display(vocabulary)
display(tf_idf_weight)
'''
[('python', 0),

('化学', 1),

('历史', 2),

('地理', 3),

('政治', 4),

('数学', 5),

('英语', 6),

('计算机', 7),

('语文', 8)]

array([[0.        , 0.47107781, 0.47107781, 0.47107781, 0.47107781,
        0.        , 0.        , 0.        , 0.33517574],
[0.47107781, 0.        , 0.        , 0.        , 0.        ,
 0.47107781, 0.47107781, 0.47107781, 0.33517574]])
'''

1.3.3 垃圾短信分类

import pandas as pd
from sklearn.naive_bayes import GaussianNB,BernoulliNB,MultinomialNB
from sklearn.model_selection import train_test_split

from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer

message = pd.read_csv('./data/messages.csv',sep = '\t',header=None)
message   # 0表示短信类别,1表示短信内容
message.rename({0:'label',1:'message'},axis = 1,inplace=True)
message

文本数据处理

cv = CountVectorizer()
# 词向量
x = cv.fit_transform(message['message'])
y = message['label']
tf_idf = TfidfTransformer()
x2 = tf_idf.fit_transform(x) # 稀松矩阵
x_train,x_test,y_train,y_test = train_test_split(x2,y)

不同算法建模

%%time 
gNB = GaussianNB()
gNB.fit(x_train.toarray(),y_train)

gNB.score(x_test.toarray(),y_test)

%%time 
bNB = BernoulliNB()
bNB.fit(x_train,y_train)

bNB.score(x_test,y_test)

%%time 
mNB = MultinomialNB()
mNB.fit(x_train,y_train)

mNB.score(x_test,y_test)

人使用的语言更适合使用二项分布,

项目中,通过统计词频得出相应词的权重,根据词的权重和目标值训练数据

,了解到什么样的词对应垃圾短信、什么样的词对应有效短信,再根据词预测新

消息的类别(如果有效词多于垃圾词,则视为有效短信)

构建新短信验证

​​​​​​​# 除了第二条短信是真的 短信,其他的都是垃圾短信

X_test = ['Your free ringtone is waiting to be collected. Simply text the password "MIX" to 85069 to verify.I see the letter B on my car Please call now 08000930705 for delivery tomorrow',
          'Precious things are very few in the world,that is the reason there is only one you',
          "GENT! We are trying to contact you. Last weekends draw shows that you won a £1000 prize GUARANTEED. U don't know how stubborn I am. Congrats! 1 year special cinema pass for 2 is yours.",
          'Congrats! 1 year special cinema pass for 2 is yours. call 09061209465 now! C Suprman V, Matrix3, StarWars3, etc all 4 FREE! bx420-ip4-5we. 150pm. Dont miss out!']
X_test
X_test_tf_idf = tf_idf.transform(cv.transform(X_test))
X_test_tf_idf
bNB.predict(X_test_tf_idf)

1.3.4 新闻类别分类

from sklearn import datasets # 财经、经济、军事、娱乐、体育……
from sklearn.naive_bayes import GaussianNB,BernoulliNB,MultinomialNB

# 停用词:助词,标点符号,文章划分,无益
# 这类词,无足轻重,可以删除
# 中文:了,的,得,地,
from sklearn.feature_extraction.text import TfidfVectorizer,ENGLISH_STOP_WORDS
from sklearn.model_selection import train_test_split
ENGLISH_STOP_WORDS #这些被定义为停用词,但是不是绝对的
# 加载一部分数据
news = datasets.fetch_20newsgroups(data_home='./data/',subset='all',
                                   remove= ('headers', 'footers', 'quotes'),
                                   categories = ['rec.motorcycles','rec.sport.hockey','talk.politics.guns'])
print(len(news['target']))
tf_idf = TfidfVectorizer()

X = tf_idf.fit_transform(news['data'])

X_train,X_test,y_train,y_test = train_test_split(X,news['target'])

数据建模

1.4 贝叶斯网络

朴素贝叶斯与贝叶斯网络:

朴素贝叶斯可以看做是贝叶斯网络的特殊情况:即该网络中无边,各个节点都是独立的(前提是独立性假设)。 那么,当朴素贝叶斯中的假设:独立同分布不成立时,应该如何解决呢?可以使用贝叶斯网络。 贝叶斯网络借助有向无环图来刻画属性之间的依赖关系,并使用条件概率表来描述属性的联合概率分布。

1.4.1 贝叶斯网络定义

贝叶斯网络(Bayesian network),又称信念网络(Belief Network),或有向无环图模型(directed acyclic graphical model),是一种概率图模型,于1985年由Judea Pearl首先提出。它是一种模拟人类推理过程中因果关系的不确定性处理模型,其网络拓朴结构是一个有向无环图(DAG)。

1.4.2 贝叶斯网络三种结构

1.4.3 贝叶斯网络实例

1.5 隐马尔科夫模型

1.5.1 马尔科夫链

有向图模型(贝叶斯网络):用有向图表示变量间的依赖关系;

无向图模型(马尔可夫网):用无向图表示变量间的相关关系。


HMM 就是贝叶斯网络的一种--虽然它的名字里有和"马尔可夫网"一样的马尔可夫。 对变量序列建模的贝叶斯网络又叫动态贝叶斯网络。HMM 就是最简单的动态贝叶斯网络

注意,马尔可夫过程其原始模型是马尔可夫链。该过程具有如下特性: 在已知系统当前状态的条件下,它未来的演变不依赖于过去的演变。 也就是说,一个马尔可夫过程可以表示为系统在状态转移过程中,第 T+1 次结果只受第 T 次结果的影响,即只与当前状态有关,而与过去状态,即与系统的初始状态和此次转移前的所有状态无关。

1.5.2 HMM模型

隐马尔科夫模型(Hidden Markov Model,以下简称HMM)是比较经典的机器学习模型了,它在语言识别,自然语言处理,模式识别等领

域得到广泛的应用。 当然,随着目前深度学习的崛起,尤其是RNN,LSTM等神经网络序列模型的火热,HMM的地位有所下降。 但是作为一个经典的模型,学习HMM的模型和对应算法,对我们解决问题建模的能力提高以及算法思路的拓展还是很好的。

先我们来看看什么样的问题解决可以用HMM模型。 使用HMM模型时我们的问题一般有这两个特征:

  我们的问题是基于序列的,比如时间序列,或者状态序列。
  我们的问题中有两类数据,一类序列数据是可以观测到的,即观测序列;而另一类数据是不能观察到的,即隐藏状态序列,简称状态序
  列。

有了这两个特征,那么这个问题一般可以用HMM模型来尝试解决。这样的问题在实际生活中是很多的。比如:我现在在打字写博客,我在 键盘上敲出来的一系列字符就是观测序列,而我实际想写的一段话就是隐藏序列,输入法的任务就是从敲入的一系列字符尽可能的猜测我要 写的一段话,并把最可能的词语放在最前面让我选择,这就可以看做一个HMM模型了。再举一个,我在和你说话,我发出的一串连续的声 音就是观测序列,而我实际要表达的一段话就是状态序列,你大脑的任务,就是从这一串连续的声音中判断出我最可能要表达的话的内容。

定义:

1.5.3 HMM模型算法示例

问题概述

由上图所示,也就是说,可以写成如下代码:

trainsition_probability = [[0.7,0.3],[0.4,0.6]]

emission_probability = [[0.5,0.4,0.1],[0.1,0.3,0.6]]

pi = [0.6,0.4]

在第一个问题中,我们需要求解出三天观察是(Dizzy,Cold,Normal)的概率是多少?

这里为了演示简单,我只求解出俩天观察为(Dizzy,Cold)的概率是多少!

概率计算

这个问题太好求解了,最暴力的方法就是将路径全部遍历一遍。下面尽可能通俗易懂的说明一下:

首先画出时间序列状态图如下:

下面,详细走一遍一条路径的暴力算法,这样既可以避开公式的晦涩,也不失正确性。其它路径完全类似 第一天为Healthy的概率为:

所有路径概率计算

​​​​​​​

  • 14
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值