k近邻算法通过测量不同特征值之间的距离来进行分类。假设存在一个样本集,样本集中每一个样本都存在一个标签代表样本所属的类别,当给定一个没有标签的新样本时,如何使用k近邻算法来预测新样本的类别呢?
k近邻算法会使用新样本的特征和数据集中每一个样本的特征对比,选出特征最相似的K个样本。然后,判断这K个样本中什么类别占比最高,就取该类别作为新样本的类别。
这个算法比较简单,直接上代码
95 float cal_distance(vector<float> a, vector<float> b)
96 {
97 float sum;
98 if (a.size() != b.size())
99 {
100 ┊ return -1;
101 }
102
103 for (int i = 0; i < a.size(); i++)
104 {
105 ┊ sum += (a[i] - b[i]) * (a[i] - b[i]);
106 }
107 return sqrt(sum);
108 }
109
110 //训练的过程就是将样本全部读取,如果想要提高查找效率,可以构造kd树
111 //这里不实现kd树,直接使用向量来存储
112 bool train(string file_name)
113 {
114 //读取样本数据到向量data中
115 if (!read_data(file_name))
116 {
117 ┊ cout << "read sample falied." << endl;
118 ┊ return false;
119 }
120 }
121
122 int predict(vector<float> t)
123 {
124 vector < pair<float, int> > top_K;
125 top_K.resize(k, make_pair(0, 0));
126
127 for (int i = 0; i < n; i++)
128 {
129 ┊ float dis = cal_distance(t, data[i]);
130 ┊ insert_K(dis, data[i][n-1], top_K);
131 }
132
133 //将K最相似的K个样本所属的类别打印出来
134 for (int i = 0; i < k; i++)
135 {
136 ┊ cout << top_K[i].second << endl;
137 }
138 }