我正在研究一个使用nodeJs的小型机器学习理论算法。 我的目标是比较许多阵列模式,以一个源模式然后返回如何 相似,他们表示为百分比。对于一个示例,pattern1可能与源模式有80%的相似性。JavaScript模式比较
确定一个阵列与另一个阵列的百分比相似度的最佳方法是什么?
什么我迄今所做..
//source
var soureSequence = [0.53,0.55,0.50,0.40,0.50,0.52,0.58,0.60]
//patterns to compare
var sequence1 = [0.53,0.54,0.49,0.40,0.50,0.52,0.58,0.60]
var sequence2 = [0.53,0.55,0.50,0.42,0.50,0.53,0.57,0.62]
既然我已经选择了一种基于%的结果,我想我应该从第一价值基础我的源图案关百分比变化第二数组中的值。
var percentChange = (firstVal, secondVal) => {
var pChange = ((parseFloat(secondVal) - firstVal)/
Math.abs(firstVal)) * 100.00;
//To avoid NaN , Infinity , and Zero
if(!pChange || pChange == 0){
return 0.00000001
}
return pChange;
}
在这里,我会从我的源序列生成我的源模式
var storePattern = function(sequence){
var pattern = [];
for(var i = 0 ; i < sequence.length ; i++){
let $change = percentChange(sequence[i] , sequence[i + 1]);
if(i != sequence.length && $change){
pattern.push($change)
}
}
return pattern;
}
var sourcePattern = storePattern(soureSequence);
现在,我将创造更多的模式进行比较
var testPattern1 = storePattern(sequence1);
var testPattern2 = storePattern(sequence2);
下面是我的比较功能
var processPattern = function(source , target){
var simularityArray = [];
for(var i = 0 ; i < target.length ; i++){
//Compare percent change at indexof testPattern to sourcePattern of same index
let change = Math.abs(percentChange(target[i] , source[i]));
simularityArray.push(100.00 - change);
}
var rating = simularityArray.reduce((a,b) => {
return a + b
});
//returns percent rating based of average of similarity pattern
rating = rating/parseFloat(source.length + ".00");
return rating;
}
现在我可以尝试估计相似
var similarityOfTest1 = processPattern(sourcePattern , testPattern1)
我的问题是同一范围内的值 ..内的序列这只适用于例如0.50,0.52 ..这些值的百分比变化将不会是相同的0.20,0.22但价值差异是相同的,即 - > 0.02
我想到价值差异模式,但在这一点上,我迷路了。
将考虑所有答案。谢谢您的帮助!
所以你正在努力寻找两个阵列之间的差异整个生产的百分比?或者你的意思是各个数组值之间的差异? – Rick
IMO两个数组“多么不同”的规则完全取决于为什么这种差异很重要,或者你正在使用它。本质上processPattern是一个[健身功能](https://en.wikipedia.org/wiki/Fitness_function),你应该相应地注意其设计的注意事项。 – James
@Arrow我的理论是,单个数组值之间的差异最终将决定每个模式与源模式相似度的总体百分比。 – KpTheConstructor