在研究機器學習演算法之前,先明確一些基本的概念
1:資料特徵:用於描述一條資料的一些特徵屬性,例如描述乙個人,可以用身高,體重,姓名的屬性來表述,這些資料就是資料的特徵。
2:資料類別:根據資料的特徵進行明確的分類。比如說身高1.7,體重60kg的這個人是小明。不滿足上面這些特徵的人不是小明。那麼「是小明」和「不是小明」則被稱作分類。
機器學習研究中乙個很重要的問題就是解決分類問題,即根據資料的特徵解決資料是屬於哪個類別。機器學習中,有下面一些很經典的分類演算法:
knn緊鄰演算法
決策樹演算法
貝葉斯分類
logistic回歸
下面先從最簡單的knn緊鄰演算法開始說明
knn演算法可以用來解決多種類別的分類問題,該演算法描述如下:
已知資料集合x,x包括若干不同的樣本和對應的分類結果y,y包括,當出現新的資料a時,求a資料對應的分類結果。
對於這樣乙個問題,knn演算法通過以下方法進行解決:
1:計算資料a與樣本集合x中所有樣本之間的距離,然後獲取距離最小(特徵最接近)的k個樣本資料對應的分類標籤
2:從這分類標籤中選擇最多的分類標籤為a資料的分類標籤。
knn演算法在執行時一般k的選擇不會超過20.
knn演算法計算資料a與樣本集合x中不同的資料距離時,可以採取以下公式進行
即對應的特徵差平方和開方得到。
knn演算法python**實現(使用minist資料集測試驗證)
importsys
importos
importstruct
importnumpyasnp
importoperator
importcv2
frommatplotlibimportpyplotasplt
defloadmnistimage(path):
withopen
(path,'rb')asimgfp:
magic, num, row, col = struct.unpack('>iiii', imgfp.read(
16))
imglen = row * col
imgs = np.fromfile(imgfp,
dtype
=np.uint8).reshape(num, imglen)
#read image from file and show it
#npfirstimg = np.array(list(imgfp.read(imglen))).reshape(row, col)
#plt.imshow(npfirstimg)
#plt.show()
returnimgs
defloadmnistlable(path):
withopen
(path,"rb")aslabelfp:
magic
, num
= struct.unpack('>ii', labelfp.read(8))
labels = np.fromfile(labelfp,
dtype
=np.uint8)
returnlabels
defgetpredictlablebyknn(trainimages, trainlabels, predictimage, knum=
20):
predictlist = {}
trainimagesnum =
len(trainimages)
fortrainimagesidxinrange
(trainimagesnum):
#calc the distance for preicitimage and trainimage
difsum =
0.0forpixidxinrange
(len
(predictimage)):
difsum += (np.int(predictimage[pixidx]) - np.int(trainimages[trainimagesidx][pixidx])) **
2#sqrt
distance = np.sqrt(difsum)
sortpredlist =
sorted
(predictlist.items(),
key
= operator.itemgetter(
1),
reverse
=true)
#from big to little
iflen
(sortpredlist) < knum:
predictlist.update()
continue
ifdistance < sortpredlist[0][
1]:rmvkey = sortpredlist[0][
0]predictlist.pop(rmvkey)
predictlist.update()
#check the labels and return
predictlables = {}
foriteminpredictlist.items():
label = trainlabels[item[0]]
iflabelinpredictlables.keys():
predictlables.update()
else:
predictlables.update()
lablesrslist =
sorted
(predictlables.items(),
key=operator.itemgetter(
1),
reverse
=true)
(lablesrslist)
returnlablesrslist[0][
0]defmain():
trainlables = loadmnistlable("e:
\\mldataset
\\mnist
\\train-labels.idx1-ubyte")
trainimgs = loadmnistimage("e:
\\mldataset
\\mnist
\\train-images.idx3-ubyte")
testlables = loadmnistlable("e:
\\mldataset
\\mnist
\\t10k-labels.idx1-ubyte")
testimgs = loadmnistimage("e:
\\mldataset
\\mnist
\\t10k-images.idx3-ubyte")
errpredict =
0fortestimgiteminrange
(len
(testimgs)):
predictrs = getpredictlablebyknn(trainimgs, trainlables, testimgs[testimgitem], 20)
ifpredictrs != testlables[testimgitem]:
errpredict = errpredict +
1print
("err predict num=", errpredict)
if__name__ =='__main__':
main()
說明,minist資料集可以從以下**獲取
機器學習 kNN近鄰演算法
上圖中,綠色圓要被決定賦予哪個類,是紅色三角形還是藍色四方形?如果k 3,由於紅色三角形所佔比例為2 3,綠色圓將被賦予紅色三角形那個類,如果k 5,由於藍色四方形比例為3 5,因此綠色圓被賦予藍色四方形類。k最近鄰 k nearest neighbor,knn 分類演算法,是乙個理論上比較成熟的方...
機器學習 k 近鄰 kNN 演算法
一 基本原理 存在乙個樣本資料集合 也稱訓練樣本集 並且樣本集中每個資料都存在標籤。輸入沒有標籤的新資料後,將新資料的每個特徵與樣本集中資料對應的特徵進行比較,然後演算法提取樣本集中特徵最相似資料 最近鄰 的分類標籤。我們一般只選擇樣本集中前k k通常是不大於20的整數 個最相似的資料,最後選擇k個...
機器學習 k近鄰演算法 kNN
knn演算法通過計算當前測試樣本與離它最近的k個點的距離,進行投票,得到它最有可能的分類結果。首先來看看機器學習演算法的基本流程 由此可見knn演算法的特點 1.k近鄰演算法是非常特殊的,可以認為是沒有模型的演算法。2.為了和其他演算法統一,可以認為訓練資料集就是模型本身。這也是scikit lea...