Регистрация | Вход
typedef struct{ double dist; double* vector;} distvect;int distvectcomp(distvect *v1, distvect *v2){ if (v1->dist == v2->dist) return 0; double sub = v1->dist - v2->dist; return sub / fabs(sub);}double kernelInverse(double l) { return 1.0 / l; }double kernelExp(double l) { return exp(-l); }double* parsen(dataset* inputs, dataset* outputs, int k, double kernel(double), double vector[]){ distvect* dvarr = malloc(inputs->length * sizeof(distvect)); for (int i = 0; i < inputs->length; ++i) { double dist = 0; for (int j = 0; j < inputs->dimentions; ++j) dist += pow(vector[j] - inputs->data[i][j], 2); distvect dv = { dist, outputs->data[i] }; dvarr[i] = dv; } qsort(dvarr, inputs->length, sizeof(distvect), distvectcomp); double *res = calloc(outputs->dimentions, sizeof(double)); double W = 0; for (int i = 0; i < k; ++i) { if (dvarr[i].dist == 0) continue; double w = kernel(dvarr[i].dist/dvarr[k].dist); W += w; for (int d = 0; d < outputs->dimentions; ++d) res[d] += dvarr[i].vector[d] * w; } for (int d = 0; d < outputs->dimentions; ++d) res[d] /= W; free(dvarr); return res;}