Если это может показаться дубликатом, я прошу прощения, но поскольку предыдущий вопрос, казалось, вызвал некоторые недоразумения, вот еще один шаг.
У меня есть 2 базовых массива:
float[] baseArr1 = new float[3] {0.430651724, 0.137407839, 0.177024469};
float[] baseArr2 = new float[3] {0.718210936, 0.001312795, 0.009634903};
И еще 2 массива для сравнения:
float[] compArr1 = new float[3] {1, 1, 1};
float[] compArr2 = new float[3] {1, 0, 0};
Затем 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};
В котором extraArr1 «ближе» к compArr1, а extraArr2 «ближе» к compArr2. Я пробовал алгоритм косинусного сходства, как предлагали некоторые, но бывают случаи, когда ответ неверен.
Критерий имеет «больше» значения на элемент. Например, compArr1 имеет «больше» значений, которые ближе к baseArr1, чем compArr2, а compArr2 имеет большую «близость» к baseArr2, чем compArr1 к baseArr2.
Спасибо!
UPDATE:
Я получил ответ! Я буду публиковать это здесь для дальнейшего использования, я признаю, что у меня было много проблем, и я также сбивал с толку других людей, но спасибо также за попытку помочь мне! Вот что я сделал:
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'