K - Classify
K 分類是個什麼玩意兒?
很簡單,K分類用四個字來概括就是物以類聚,如果要再加四個字的話就是人以羣分。
K 分類的過程
導入訓練樣本集合(這個必須有)。每個樣本擁有一個或多個已經確定好的特徵並且存在一個確定的標籤(Label)。
- K-Classify算法通過完成對訓練樣本根據標籤進行分類的過程建立一個多維座標系(先這麼理解),座標系的維度就是樣本的特徵數目。樣本集合中的每一個數據都會抽象爲座標系上的一個點。
導入測試樣本集合(KNN已經開始啦~~),將樣本集合中的每一個數據繼續抽象(想象)爲多維座標系中的一個點。
- 對樣本集合中的每一個數據,計算其與訓練樣本中全部數據的距離。此處使用了我們初中時學過的座標系中兩點間的距離公式:
d=(x0−y0)2+(x1−y1)2+(x2−y2)2+...+(xn−yn)2−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−√ - 選擇K個(沒錯,就是K-Classify的K)距離樣本數據最近的點,讀取它們的標籤,根據少數服從多數原則,確定樣本數據的標籤(Label)。
K-Classify的Python實現
以下是K分類算法的Python代碼
import numpy as np
#inputMatrix: 輸入的測試樣本集,dataSet: 測試樣本集數據(無標籤),labels:測試樣本集標籤
def K_algorithm(inputMatrix, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
distanceMat = tile(inputMatrix, (dataSetSize, 1)) - dataSet
distance = (distanceMat**2.sum(axis = 1))**0.5
distancesI = np.argsort(distance, axis = 0)
count = {}
for index in range(k):
label = labels[distancesI[i]]
count[label[0]] = count.get(labels[0], 0)+1
sortedResult = sorted(count.intms(), key = operator.itemgetter(1), reverse = True)
return sortedResult[0][0]
K分類到此爲止了麼?
Absolutely not,雖然現在我們已經有了K分類的結果,但是這個結果並不是最優解,由於K分類的結果基本上取決於那些在數值上較大的特徵值,例如:如果一個特徵值爲年齡,另一個爲薪水,那麼年齡的值一般來說會比薪水值小很多,也就很難影響到K分類的結果。所以,我們就要對K分類數據的各個特徵值進行歸一化計算,從而減少由於數值大小所帶來的影響。
歸一化過程:
- 選擇數據某一特徵的所有可能值,並得到這些可能值中的最大和最小值。
- 通過計算最大最小值的差得到取值區間。
- 用所有的可能值與最小值的差除以取值區間,得到歸一化之後的值。
歸一化的Python實現
def normalization(dataSet):
min = dataSet.min(axis = 0)
max = dataSet.max(axis = 0)
range = max - min
num = dataSet.shape(0)
normData = dataSet - tile(min, (m, 1))
normData = normData/tile(range, (num,1))
return normData