1. 程式人生 > >機器學習01-kNN鄰近算法

機器學習01-kNN鄰近算法

spl 計算 概述 裏的 簡單 csdn image art []

k-近鄰算法

概述:k-近鄰算法採用測量不同特征值之間的距離方法進行分類
長處:精度高、對於異常值不敏感。無數據輸入假定
缺點:計算復雜度高,空間復雜度高,而且它沒有辦法各處基礎數據的一些內部信息數據。
算法描寫敘述:存在一個準確的數據集合樣本。稱作訓練樣本集,樣本集合中每一個item都附帶自己所屬分類標簽。當須要推斷新數據的分類是,僅僅須要計算特征數據和樣本數據中最類似的分類標簽,選擇k個最類似的標簽,k個標簽中占比最多的即為目標標簽。

詳細分類算法

    #-*- coding=utf-8 -*-
from numpy import * import operator ##簡單的kNN算法實現 #dataSet是訓練數據集合。每行代表每一個訓練數據的每一個特征值 #labels 相應dataSet每一個訓練數據的class標簽 #inX 表示待分類的特征數據 def classify0(inX, dataSet, labels, k): dataSetSize = dataSet.shape[0] # 獲取測試集合大小 #求每一個輸入特征值和每一個測試集合總的特征值的超時 #首先須要使用tile將特征值擴展為和測試集合相等大小的矩陣
diffMat = tile(inX, (dataSetSize, 1)) - dataSet #取平方 sqlDiffMat = diffMat ** 2 sumMat = sqlDiffMat.sum(axis=1) distances = sumMat ** 0.5 #獲取排序信息 #比如:array([9,1,3,0]) -> array([3,1,2,0]) 升序標簽 sortIndicies = distances.argsort() classCount = {} #取距離最小的前k個相應的標簽統計信息
for i in range(k): label = labels[sortIndicies[i]] classCount[label] = classCount.get(label,0) + 1 #取最大的 sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse=True) return sortedClassCount[0][0]

關於特征數據

不同的特征,詳細的數據值波動區間是不同的,比如特征A取值範圍在[1000,10000],可是特征B取值範圍在[0,10],假設直接使用這種特征數據進行KNN算法運算。會出現的一個問題,高區間的特征對結果的影響遠遠大於低區間的特征值,因此我們須要對我們的特征數據做歸一化處理,即將全部特征值處理到同樣的區間範圍中。


詳細算法:((特征值-min)/(max - min)) -> [0,1]區間範圍

    from numpy import *
    import operator
    #用於將一個不同範圍域的特征值歸一化到統一的[0,1]之間
    def normData(dataSet):
        #獲取每一個特征的最大值
        maxValue = dataSet.max(0)
        #獲取每一個特征的最小值
        minValue = dataSet.min(0)
        ranges=maxValue-minValue
        #將數據歸一到同一個範圍
        normalDataSet = zeros(shape(dataSet))
        m = dataSet.shape[0]
        normalDataSet = dataSet - tile(ranges,(m,1))
        #除於最大值
        normalDataSet = normalDataSet/tile(maxValue,(m,1))

        return normalDataSet, ranges, minValues

關於可視化特征數據

怎樣判別我們取得的特征數據集合適合使用knn進行分類訓練?
在做數據觀察時我們往往須要通過可視化方式去觀察我們的特征數據和label的分布,這個時候就須要用到Python的一個圖形工具matplotlib。
特征和分類數據:testSet.txt
3.542485 1.977398 -1
3.018896 2.556416 -1
7.551510 -1.580030 1
2.114999 -0.004466 -1
8.127113 1.274372 1
7.108772 -0.986906 1
8.610639 2.046708 1
2.326297 0.265213 -1
3.634009 1.730537 -1
0.341367 -0.894998 -1
3.125951 0.293251 -1
2.123252 -0.783563 -1
0.887835 -2.797792 -1
7.139979 -2.329896 1
1.696414 -1.212496 -1
8.117032 0.623493 1
8.497162 -0.266649 1
4.658191 3.507396 -1
8.197181 1.545132 1
1.208047 0.213100 -1
1.928486 -0.321870 -1
2.175808 -0.014527 -1
7.886608 0.461755 1
3.223038 -0.552392 -1
3.628502 2.190585 -1
7.407860 -0.121961 1
7.286357 0.251077 1

技術分享圖片

可視化腳本:


from numpy import *
import matplotlib
import matplotlib.pyplot as plt

##read file
fr = open(‘testSet.txt‘)
lines = fr.readlines()
dataSet = zeros((len(lines),1))
labels = []
index = 0
for line in lines:
    items = line.strip().split(‘\t‘)
    dataSet[index:] = items[0:2]
    labels.append(items[-1])
#matplot
fx = plt.figure()
ax = fx.add_subplot(111)
#將數組轉換為矩陣
dataSet = matrix(dataSet)
colora = tile(50, len(lines))
#這裏的colora是為了通過顏色區分不同的labels, cmap代表顏色map,默認是yard, s是每一個點的大小,alpha是每一個點的透明度
ax.scatter(dataSet[:,0], dataSet[:,1], c=colora * labels, cmap=‘autum‘, s=50, alpha=0.3)

plt.show()

機器學習01-kNN鄰近算法