该算法通过已有的N个标准样本,对新增加样本进行最佳符合度判别。
这里的k是样本的k个判别属性值。
例如为一部新影片自动判断类别(动作片、爱情片等),可通过已有影片库中标准样本的各项参数(打斗次数、亲吻次数等)与新影片对比取最小邻近样本的过程。
算法步骤:
1,输入条件1:已有的n个样本(包括label及每个样本的k个参数值)
2,输入条件2:新加对象(明确其的k个参数值)
3,执行过程1:遍历n个样本,用每个样本的k项参数值依次与新加对象的对应k项参数值进行求差值,并取绝对值后求和。
4,执行过程2:比较n个样本计算结果找出最小值的样本作为近邻对象,并用样本的label为新加对象进行定义。
5,执行过程3:将新加对象纳入标准样本。
核心JS代码:
/**
* 使用knn进行计算
* @staticObjects 标准对象集合 (输入1)
* @newObject 新对象 (输入2)
* @propertyNames 比对属性名集合 (输入3)
* return 最临近的标准对象的标签 (输出)
*/
function knnCalc(staticObjects,newObject,propertyNames) {
//求值
var minStaticObject = null;
var minTotal = 0;
for (var i = 0; i < staticObjects.length; i++) {
var staticObject = staticObjects[i];
var total = 0;
var compareObj = {};
for (var j = 0; j < propertyNames.length; j++) {
var pName = propertyNames[j];
var knnPval = Math.abs(staticObject[pName] - newObject[pName]);
compareObj[pName] = knnPval;
total += knnPval;
}
if(minStaticObject === null || total < minTotal){
minStaticObject = staticObject;
minTotal = total;
}
showCalcVal(compareObj,staticObject,newObject,total);//显示行计算结果
}
//对比,找最匹配值(最小值)
if(minStaticObject != null){
return minStaticObject;
}else{
alert("未找到匹配项,请检查数据合理性");
}
}
demo下载地址:https://gitee.com/inq/knn.git