机器学习顾名思义,就是让机器具有学习的能力,能像人一样在大量的学习过程中慢慢具备的一种分辨的能力,并且可以根据经验对未来做出预测。这是一种比较浅显的理解。
机器是怎么样学习的,假象你在教一个完全没有认知的小孩分辨哪个是西瓜,面前有一堆东西,大大小小的西瓜,苹果、梨、手机、相机,在你教完他之后他可能就有一个认知:圆的是西瓜,因为“圆”是区分其他物品最明显的特征,这个认知就留在了他的记忆中,那么在给他一个菠萝,他就会把菠萝归位非西瓜一类,因为菠萝不是圆的,假如此时拿出一个皮球,他很可能会判断错,要想做出正确判断,必须加入新的特征进行学习——颜色、纹理、重量。
机器的学习和人的学习是一样的,地图导航可能大家都用过,它收集了很多路况信息,假设我们有一组路况信息,包括路的转弯角度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组训练数据结果如下: