use*_*792 0 algorithm similarity
如果这看似重复,我道歉,但由于前一个问题似乎引起了一些混淆,这是另一回事.
我有2个基本数组:
float[] baseArr1 = new float[3] {0.430651724, 0.137407839, 0.177024469};
float[] baseArr2 = new float[3] {0.718210936, 0.001312795, 0.009634903};
Run Code Online (Sandbox Code Playgroud)
另外2个数组用于比较:
float[] compArr1 = new float[3] {1, 1, 1};
float[] compArr2 = new float[3] {1, 0, 0};
Run Code Online (Sandbox Code Playgroud)
然后将compArr1和compArr2与baseArr1和baseArr2进行比较.我知道我应该得到的答案,但我很难想出一个算法来得出答案.与baseArr1比较时,答案应该是compArr1,当与baseArr2比较时,答案应该是compArr2.
请注意,两个baseArrs的值不一定必须加起来1.另外,这里有两个更简洁的数组,试图让我的观点更加清晰:
float[] extraArr1 = new float[3] {.5, .3, .3};
float[] extraArr2 = new float[3] {.75, 0, 0};
Run Code Online (Sandbox Code Playgroud)
其中extraArr1与compArr1"接近",而extraArr2与compArr2"更接近".我已经尝试过一些人建议的余弦相似度算法,但有时候答案是不正确的.
标准是每个元素的价值"更多".例如,compArr1具有比compArr2更接近baseArr1的"更多"值,并且compArr2与baseArr2相比具有比compArr1更接近baseArr2的"接近度".
谢谢!
更新:
我得到了答案!我将在这里张贴以供将来参考,我承认我遇到了很多麻烦,也让其他人感到困惑,但也要感谢你帮我吧!这是我做的:
float[] pbaseArrX = new float[3];
float[] pcompArrX = new float[3];
float dist1 = 0, dist2 = 0;
for (int i = 0; i < baseArrX.Count; i++)
{
pbaseArrX[i] = baseArrX[i] / (baseArrX[0] + baseArrX[1] + baseArrX[2]);
}
//Do the following for both compArr1 and compArr2;
for (int i = 0; i < compArrX.Count; i++)
{
pcompArrX[i] = pcompArrX[i] / (pcompArrX[0] + pcompArrX[1] + pcompArr[2]);
}
//Get distance for both
for (int i = 0; i < pcompArrX.Count; i++)
{
distX = distX + ((pcompArrX[i] - pbaseArrX[i])^2);
}
//Then just use conditional to determine which is 'closer'
Run Code Online (Sandbox Code Playgroud)
您想要从所有compArrX数组中找到最接近的baseArr1数组.
可以使用各种距离.最常见的是:
出租车或曼哈顿距离(这是Minkowskip=1)
Chebysev距离(这是Minkowskip=infinity)
还有很多人喜欢:
我们无法知道哪一个最适合您的数据模型.