Алгоритм сходства? - PullRequest
0 голосов
/ 18 июня 2011

Если это может показаться дубликатом, я прошу прощения, но поскольку предыдущий вопрос, казалось, вызвал некоторые недоразумения, вот еще один шаг.

У меня есть 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'

Ответы [ 2 ]

6 голосов
/ 18 июня 2011

Вы хотите найти ближайший к baseArr1 массив из всех массивов compArrX.

Существуют различные расстояния, которые можно использовать.Наиболее распространенными являются:

и многие другие, такие как:

  • Mahalanobis_distance , который является масштабно-инвариантным.Если вы ищете статистику и корреляцию, вы найдете более сложные алгоритмы, которые, возможно, соответствуют вашей проблеме.См. Википедию Correlation_and_dependence

Мы не можем знать, какая из них лучше всего подходит для вашей модели данных.

1 голос
/ 18 июня 2011

Еще одна мера сходства (или несходства) - Расстояние движителя Земли

...