Python机器学习人工智能/模式识别/机器学习精华专题机器学习与数据挖掘

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

2018-01-26  本文已影响118人  安心远

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

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

机器的学习和人的学习是一样的,地图导航可能大家都用过,它收集了很多路况信息,假设我们有一组路况信息,包括路的转弯角度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组训练数据结果如下:


上一篇 下一篇

猜你喜欢

热点阅读