【发布时间】:2017-11-26 02:40:44
【问题描述】:
我正在研究一个使用 nodeJs 的小型机器学习理论算法。 我的目标是将许多数组模式与一个源模式进行比较,然后返回如何 类似,它们以百分比表示。例如,pattern1 可能与源模式 80% 相似。
确定一个数组与另一个数组的相似度百分比的最佳方法是什么?
到目前为止我做了什么..
//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
我想过一个基于价值的差异模式,但现在我迷路了。
将考虑所有答案。感谢您的帮助!
【问题讨论】:
-
所以你试图找出两个数组之间的差异以产生一个百分比?还是您的意思是各个数组值之间的差异?
-
IMO 两个数组“不同”的规则完全取决于为什么这种差异很重要,或者您使用它的目的。本质上,processPattern 是一个fitness function,您应该相应地注意其设计的注意事项。
-
@Arrow 我的理论是,各个数组值之间的差异最终将决定每个模式与源模式的相似程度的总体百分比。
-
@James 差异很重要,因为它是迄今为止尝试在每种模式之间找到相似特征的唯一方法......而不是百分比或价值的差异。
-
余弦相似度如何作为相似度度量? en.wikipedia.org/wiki/Cosine_similarity
标签: javascript arrays arraylist pattern-matching sequences