'C++ Arduino KNN Split matrix, merge results
I am new in Machine learning but I decided to develop a small program for Arduino. The idea is that we have two microcontrollers that communicate via the I2C protocol and some kind of data set that we break, for example, into two parts, then we use the KNN algorithm for each divided data set and then combine the result. I would like to know how correct my approach is in terms of machine learning.
This is the KNN algorithm:
struct Point
{
int val;
int x, y;
int distance;
};
bool comparison(Point a, Point b)
{
return a.distance < b.distance;
}
int classifyAPoint(Point arr[], int n, int k, Point p)
{
for(int i = 0; i < n; ++i)
{
arr[i].distance = sqrt((arr[i].x - p.x) * (arr[i].x - p.x) + (arr[i].y + p.y) * (arr[i].y - p.y));
}
int lt_length = sizeof(arr) / sizeof(arr[0]);
Core::Sort::sortArr(arr, lt_length+n, comparison);
int freq1 = 0;
int freq2 = 0;
for (int i = 0; i < k; i++)
{
if (arr[i].val == 0)
{
freq1++;
}
else if (arr[i].val == 1)
{
freq2++;
}
}
return (freq1 > freq2 ? 0 : 1);
}
That's how I devide data
template<typename T, typename V>
void get_slice_(T arr[], V size, T arr1[], T arr2[], V pos, V k1 = 0, V k2 = 0)
{
for(int i = 0; i < size; i++)
{
if(i < pos)
{
arr1[k1++] = arr[i];
}
else
{
arr2[k2++] = arr[i];
}
}
}
And in main function I have this part:
Point arr[n];
arr[0].x = 1;
arr[0].y = 12;
arr[0].val = 0;
arr[1].x = 2;
arr[1].y = 5;
arr[1].val = 0;
arr[2].x = 5;
arr[2].y = 3;
arr[2].val = 1;
arr[3].x = 3;
arr[3].y = 2;
arr[3].val = 1;
arr[4].x = 3;
arr[4].y = 6;
arr[4].val = 0;
arr[5].x = 1.5;
arr[5].y = 9;
arr[5].val = 1;
arr[6].x = 7;
arr[6].y = 2;
arr[6].val = 1;
arr[7].x = 6;
arr[7].y = 1;
arr[7].val = 1;
arr[8].x = 3.8;
arr[8].y = 3;
arr[8].val = 1;
arr[9].x = 3;
arr[9].y = 10;
arr[9].val = 0;
arr[10].x = 5.6;
arr[10].y = 4;
arr[10].val = 1;
arr[11].x = 4;
arr[11].y = 2;
arr[11].val = 1;
arr[12].x = 3.5;
arr[12].y = 8;
arr[12].val = 0;
arr[13].x = 2;
arr[13].y = 11;
arr[13].val = 0;
arr[14].x = 2;
arr[14].y = 5;
arr[14].val = 1;
arr[15].x = 2;
arr[15].y = 9;
arr[15].val = 0;
arr[16].x = 1;
arr[16].y = 7;
arr[16].val = 0;
/*Testing Point*/
Core::AI::KNN::Point p;
p.x = 2.5;
p.y = 7;
// Parameter to decide group of the testing point
int k = 3;
// Distribution
Core::AI::KNN::Point block[8];
Core::AI::KNN::Point block_[8];
Core::DivideMatrix::get_slice_(arr, 16, block, block_, 8);
Serial.println("Start classify using KNN");
Serial.println(Core::AI::KNN::classifyAPoint(block, 9, k, p));
So is it correct in terms of dividing into some parts of data, if yes then I have another question, how to merge the final result?
P.S.
This applies not only to the KNN algorithm but also to other machine learning algorithms such as LinearRegression, etc.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
