赞
踩
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 }
-
-
-
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。