算法思路
K最近邻(k-Nearest Neighbor)算法是比较简单的机器学习算法。它采用测量不同特征值之间的距离方法进行分类。思路: 如果一个样本在特征空间中的k个最近邻(最相似)的样本中的大多数都属于某一个类别,则该样本也属于这个类别。
算法分析
这里我以javaml库为例分析算法实现步骤。首先,引入javaml的库依赖,我使用maven管理依赖,pom配置如下
net.sourceforge
javaml
0.1.5
简要描述下该库的代码结构
K近邻算法实现代码为KNearestNeighbors类的classDistribution(Instanceinstance)方法,关键代码如下
@Override
public Map classDistribution(Instance instance) {
/* Get nearest neighbors */
// 1) 获取K个近邻样本点;
Set neighbors = training.kNearest(k, instance, dm);
/* Build distribution map */
HashMap out = new HashMap();
// 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;
}
坚持学习,每天进步一点点,让自己变得更好