Это то, что я пытаюсь использовать с использованием языка AWK. У меня проблема с главным образом шагом 2. Я показал образец набора данных, но исходный набор данных состоит из 100 полей и 2000 записей.Один из ближайших соседей, использующий awk
Алгоритм
1) инициализирует точность = 0
2) для каждой записи г
Find the closest other record, o, in the dataset using distance formula
Чтобы найти ближайшего соседа для r0, мне нужно сравнить r0 с r1 до r9 и сделайте математику следующим образом: square (abs (r0.c1 - r1.c1)) + square (abs (r0.c2 - r1.c2)) + ... + square (abs (r0.c5 - r1.c5)) и хранить это расстояние.
3) Один с минимальным расстоянием, сравните его значения c6. если значения c6 равны приращению, точность равна 1.
После повторения процесса для всех записей.
4) Получите 1% погрешность в процентах от (точность/total_records) * 100;
Образец Dataset
c1 c2 c3 c4 c5 c6 --> Columns
r0 0.19 0.33 0.02 0.90 0.12 0.17 --> row1 & row7 nearest neighbour in c1
r1 0.34 0.47 0.29 0.32 0.20 1.00 and same values in c6(0.3) so ++accuracy
r2 0.37 0.72 0.34 0.60 0.29 0.15
r3 0.43 0.39 0.40 0.39 0.32 0.27
r4 0.27 0.41 0.08 0.19 0.10 0.18
r5 0.48 0.27 0.68 0.23 0.41 0.25
r6 0.52 0.68 0.40 0.75 0.75 0.35
r7 0.55 0.59 0.61 0.56 0.74 0.76
r8 0.04 0.14 0.03 0.24 0.27 0.37
r9 0.39 0.07 0.07 0.08 0.08 0.89
Код
BEGIN {
#initialize accuracy and total_records
accuracy = 0;
total_records = 10;
}
NR==FNR { # Loop through each record and store it in an array
for (i=1; i<=NF; i++)
{
records[i]=$i;
}
next
}
{ # Re-Loop through the file and compare each record from the array with each record in a file
for(i=1; i <= length(records); i++)
{
for (j=1; j<=NF; j++)
{ # here I need to get the difference of each field of the record[i] with each all the records, square them and sum it up.
distance[j] = (records[i] - $j)^2;
}
#Once I have all the distance, I can simply compare the values of field_6 for the record with least distance.
if(min(distance[j]))
{
if(records[$6] == $6)
{
++accuracy;
}
}
}
END{
percentage = 100 * (accuracy/total_records);
print percentage;
}
Вы имеете в виду поля [i] = print $ i; и сохранить все поля в массиве? хотя поля независимы, но как только ближайшая строка будет найдена, мне нужно будет найти class_value, которое будет в поле [6]. Если я сортирую каждое поле отдельно, я перепутал данные. Можете ли вы объяснить немного больше о том, как продвигаться с идеей? –
Вы включили комментарии в свое описание, так что теперь с вашими изменениями, каков фактический вопрос? То есть какая у вас сложность с шагом 2? – Soren
Я не знаю, как применять формулу для каждого поля из двух записей (включая возведение в квадрат и сумму). этот бит неверен - >> distance [j] = (записи [i] - $ j); –