算法思路
K最近鄰(k-Nearest Neighbor)算法是比較簡單的機器學習算法。它採用測量不同特徵值之間的距離方法進行分類。思路: 如果一個樣本在特徵空間中的k個最近鄰(最相似)的樣本中的大多數都屬於某一個類別,則該樣本也屬於這個類別。
算法分析
這裡我以javaml庫為例分析算法實現步驟。首先,引入javaml的庫依賴,我使用maven管理依賴,pom配置如下
<dependency>
<groupId>net.sourceforge</groupId>
<artifactId>javaml</artifactId>
<version>0.1.5</version>
</dependency>
簡要描述下該庫的代碼結構
K近鄰算法實現代碼為KNearestNeighbors類的classDistribution(Instanceinstance)方法,關鍵代碼如下
@Override
public Map<Object, Double> classDistribution(Instance instance) {
/* Get nearest neighbors */
// 1) 獲取K個近鄰樣本點;
Set<Instance> neighbors = training.kNearest(k, instance, dm);
/* Build distribution map */
HashMap<Object, Double> out = new HashMap<Object, Double>();
// 2) 初始化所有分類的樣本點個數為0;
for (Object o : training.classes())
out.put(o, 0.0);
// 3) 統計K個近鄰樣本點中各個分類的樣本點的數量;
for (Instance i : neighbors) {
out.put(i.classValue(), out.get(i.classValue()) + 1);
}
double min = k;
double max = 0;
// 4) 確定所有分類中樣本點數量的最大值和最小值;
for (Object key : out.keySet()) {
double val = out.get(key);
if (val > max)
max = val;
if (val < min)
min = val;
}
/* Normalize distribution map */
// 5) 統計未知樣本屬於各個分類的概率(0-1之間)。
for (Object key : out.keySet()) {
out.put(key, (out.get(key) - min) / (max - min));
}
return out;
}
堅持學習,每天進步一點點,讓自己變得更好