機器學(xué)習(xí)顧名思義哗戈,就是讓機器具有學(xué)習(xí)的能力郊艘,能像人一樣在大量的學(xué)習(xí)過程中慢慢具備的一種分辨的能力,并且可以根據(jù)經(jīng)驗對未來做出預(yù)測。這是一種比較淺顯的理解暇仲。
機器是怎么樣學(xué)習(xí)的步做,假象你在教一個完全沒有認(rèn)知的小孩分辨哪個是西瓜副渴,面前有一堆東西奈附,大大小小的西瓜,蘋果煮剧、梨斥滤、手機、相機勉盅,在你教完他之后他可能就有一個認(rèn)知:圓的是西瓜佑颇,因為“圓”是區(qū)分其他物品最明顯的特征,這個認(rèn)知就留在了他的記憶中草娜,那么在給他一個菠蘿挑胸,他就會把菠蘿歸位非西瓜一類,因為菠蘿不是圓的宰闰,假如此時拿出一個皮球茬贵,他很可能會判斷錯,要想做出正確判斷移袍,必須加入新的特征進行學(xué)習(xí)——顏色解藻、紋理、重量葡盗。
機器的學(xué)習(xí)和人的學(xué)習(xí)是一樣的螟左,地圖導(dǎo)航可能大家都用過,它收集了很多路況信息觅够,假設(shè)我們有一組路況信息胶背,包括路的轉(zhuǎn)彎角度x,路的崎嶇程度y喘先,x钳吟、y應(yīng)該是一組離散數(shù)據(jù),和某路況下可以快行 O苹祟,和應(yīng)當(dāng)慢行X
圖中給出了多組特征向量值(x,y)砸抛,及對應(yīng)的是快行O or 慢行X,機器學(xué)習(xí)需要做的就是根據(jù)給定的數(shù)據(jù)找出一個規(guī)律树枫,對未來的數(shù)據(jù)進行預(yù)測分類直焙。很明顯這是一個線性分類模型,根據(jù)訓(xùn)練模型預(yù)測某數(shù)據(jù)屬于A還是B砂轻。
直覺上訓(xùn)練數(shù)據(jù)的目的是為了找出某個線性方程來表示這個規(guī)律奔誓,在這條線下方的是O,上方的是X,實際這是一個概率統(tǒng)計問題厨喂。如果只給兩個訓(xùn)練數(shù)據(jù)和措,對第三個進行預(yù)測是O or X,兩者皆有可能蜕煌,且概率近似派阱,錯誤概率較高。所以訓(xùn)練數(shù)據(jù)越多斜纪,預(yù)測正確率越高贫母。
預(yù)測下圖A的分類
在給定大數(shù)據(jù)集的基礎(chǔ)上,訓(xùn)練出來模型準(zhǔn)確率會較高盒刚,但也有少數(shù)情況是錯誤的腺劣。
貝葉斯分類是一個比較常用的算法,是統(tǒng)計學(xué)的一種分類方法因块,它是一類利用概率統(tǒng)計進行分類的算法橘原。貝葉斯公式用來描述兩個條件概率之間的關(guān)系,比如 P(A|B) 和 P(B|A)涡上。按照乘法法則趾断,可以立刻導(dǎo)出: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庫的樸素貝葉斯算法實現(xiàn)這個分類器很容易
#!/usr/bin/python
from prep_terrain_data import makeTerrainData
from class_vis import prettyPicture
from ClassifyNB import classify
#生成訓(xùn)練特征值歼冰、標(biāo)簽
features_train, labels_train, features_test, labels_test = makeTerrainData()
print "features_train",features_train
print "labels_train",labels_train
##創(chuàng)建分類器,訓(xùn)練數(shù)據(jù)
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)的數(shù)據(jù)的數(shù)組
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)的數(shù)耻警,都進行四舍五入
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)):
#如果下標(biāo)為ii的grade 或者 bumpy其一大于0.8,設(shè)置相應(yīng)的y值=1
if grade[ii]>0.8 or bumpy[ii]>0.8:
y[ii] = 1.0
#生成二維數(shù)組X
X = [[gg, ss] for gg, ss in zip(grade, bumpy)]
print X
split = int(0.75*n_points)
# 0~750是訓(xùn)練特征值 751~999 是預(yù)測特征值
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):
### 創(chuàng)建高斯樸素貝葉斯分類器
clf = GaussianNB()
### 擬合傳入的特征值隔嫡,然后可以用訓(xùn)練好的分類器進行預(yù)測
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組訓(xùn)練數(shù)據(jù)結(jié)果如下:
50000組訓(xùn)練數(shù)據(jù)結(jié)果如下: