朴素贝叶斯算法的简单机器学习应用

机器学习顾名思义,就是让机器具有学习的能力,能像人一样在大量的学习过程中慢慢具备的一种分辨的能力,并且可以根据经验对未来做出预测。这是一种比较浅显的理解。

机器是怎么样学习的,假象你在教一个完全没有认知的小孩分辨哪个是西瓜,面前有一堆东西,大大小小的西瓜,苹果、梨、手机、相机,在你教完他之后他可能就有一个认知:圆的是西瓜,因为“圆”是区分其他物品最明显的特征,这个认知就留在了他的记忆中,那么在给他一个菠萝,他就会把菠萝归位非西瓜一类,因为菠萝不是圆的,假如此时拿出一个皮球,他很可能会判断错,要想做出正确判断,必须加入新的特征进行学习——颜色、纹理、重量。

机器的学习和人的学习是一样的,地图导航可能大家都用过,它收集了很多路况信息,假设我们有一组路况信息,包括路的转弯角度x,路的崎岖程度y,x、y应该是一组离散数据,和某路况下可以快行 O,和应当慢行X


图中给出了多组特征向量值(x,y),及对应的是快行O or 慢行X,机器学习需要做的就是根据给定的数据找出一个规律,对未来的数据进行预测分类。很明显这是一个线性分类模型,根据训练模型预测某数据属于A还是B。

直觉上训练数据的目的是为了找出某个线性方程来表示这个规律,在这条线下方的是O,上方的是X,实际这是一个概率统计问题。如果只给两个训练数据,对第三个进行预测是O or X,两者皆有可能,且概率近似,错误概率较高。所以训练数据越多,预测正确率越高。

预测下图A的分类


在给定大数据集的基础上,训练出来模型准确率会较高,但也有少数情况是错误的。


贝叶斯分类是一个比较常用的算法,是统计学的一种分类方法,它是一类利用概率统计进行分类的算法。贝叶斯公式用来描述两个条件概率之间的关系,比如 P(A|B) 和 P(B|A)。按照乘法法则,可以立刻导出:P(A∩B) = P(A)P(B|A)=P(B)P(A|B)。如上公式也可变形为:P(B|A) = P(A|B)*P(B) / P(A)。

用python sklean库的朴素贝叶斯算法实现这个分类器很容易

#!/usr/bin/python

from prep_terrain_data import makeTerrainData
from class_vis import prettyPicture
from ClassifyNB import classify

#生成训练特征值、标签
features_train, labels_train, features_test, labels_test = makeTerrainData()

print "features_train",features_train

print "labels_train",labels_train
##创建分类器,训练数据
clf = classify(features_train, labels_train)

print "features_test",features_test

print "labels_test",labels_test

# 绘图
prettyPicture(clf, features_test, labels_test)
prep_terrain_data.py
#!/usr/bin/python
import random

def makeTerrainData(n_points=1000):
    ### make the toy dataset
    random.seed(42)

    #生成3组含有1000个[0,1)的数据的数组
    grade = [random.random() for ii in range(0,n_points)]
    bumpy = [random.random() for ii in range(0,n_points)]
    error = [random.random() for ii in range(0,n_points)]

    #生成1000一个[0,1)的数,都进行四舍五入
    y = [round(grade[ii]*bumpy[ii]+0.3+0.1*error[ii]) for ii in range(0,n_points)]
    for ii in range(0, len(y)):
        #如果下标为ii的grade 或者 bumpy其一大于0.8,设置相应的y值=1
        if grade[ii]>0.8 or bumpy[ii]>0.8:
            y[ii] = 1.0
    #生成二维数组X
    X = [[gg, ss] for gg, ss in zip(grade, bumpy)]
    print X
    split = int(0.75*n_points)
    # 0~750是训练特征值 751~999 是预测特征值
    X_train = X[0:split]
    X_test  = X[split:]
    print X_train
    print X_test
    y_train = y[0:split]
    y_test  = y[split:]
    return X_train, y_train, X_test, y_test

ClassifyNB.py
from sklearn.naive_bayes import GaussianNB
###分类器
def classify(features_train, labels_train):

    ### 创建高斯朴素贝叶斯分类器
    clf = GaussianNB()
    ### 拟合传入的特征值,然后可以用训练好的分类器进行预测
    return clf.fit(features_train,labels_train)

class_div.py
#!/usr/bin/python

import warnings
warnings.filterwarnings("ignore")

import matplotlib
matplotlib.use('agg')

import matplotlib.pyplot as plt
import pylab as pl
import numpy as np
 
def prettyPicture(clf, X_test, y_test):
    x_min = 0.0; x_max = 1.0
    y_min = 0.0; y_max = 1.0

    # Plot the decision boundary. For that, we will assign a color to each
    # point in the mesh [x_min, m_max]x[y_min, y_max].
    h = .01  # step size in the mesh
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

    # Put the result into a color plot
    Z = Z.reshape(xx.shape)
    plt.xlim(xx.min(), xx.max())
    plt.ylim(yy.min(), yy.max())

    plt.pcolormesh(xx, yy, Z, cmap=pl.cm.seismic)

    # Plot also the test points
    grade_sig = [X_test[ii][0] for ii in range(0, len(X_test)) if y_test[ii]==0]
    bumpy_sig = [X_test[ii][1] for ii in range(0, len(X_test)) if y_test[ii]==0]
    grade_bkg = [X_test[ii][0] for ii in range(0, len(X_test)) if y_test[ii]==1]
    bumpy_bkg = [X_test[ii][1] for ii in range(0, len(X_test)) if y_test[ii]==1]

    plt.scatter(grade_sig, bumpy_sig, color = "b", label="fast")
    plt.scatter(grade_bkg, bumpy_bkg, color = "r", label="slow")
    plt.legend()
    plt.xlabel("bumpiness")
    plt.ylabel("grade")

    plt.savefig("test.png")

1000组训练数据结果如下:


50000组训练数据结果如下:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容