赞
踩
# 上面的图片是在网上随手翻到的-很符合主题-侵权删 #
蹭热度ing
Knn算法,用于分类。
通过得到逻辑上的相近程度实现判断,K值的大小体现的是一个容错的过程。
提高预测准确度的方法:
调整K值,找到更好的K值(别太大,也别太小)
数据的预处理(有大佬说过,数据的预处理会比算法本身更重要)
逻辑距离的选择(欧氏距离,闵式距离,切比雪夫距离….)
分类,就是一种选择的过程。将事件抽象为状态点。根据状态点之间的距离,进行度量。(如果不懂我在讲什么,建议把‘动态规划’的算法自己再研究深一点)
下面放上自己用c++做的Knn算法(采用欧氏距离,k值选取为1(并不是一个好的选择,但是我真的很不想自己手工去打那么多的数据集emmmmm)(rand函数可以参数随机数,要是自己没事干了,可以去用那个玩一下))
下面那个算法,还是不那么好的,要是可以的话,可以多选大点的K值,然后再做一个概率的统计。再列一个表。(但C++玩这个确实没意思)
main函数是随手写的一个测试函数,感觉还能凑活着用。
这是用Python写的KNN算法,会方便很多!点击即可看
代码如下:
#include <iostream>
using namespace std;
#include <cmath>
#include <cstring>
char classsify_KNN(int* INX, int **DataSet, int DataSetlen, char *label, int k) // 限定数据规模
{
int *b = new int[DataSetlen];
//设置INX是5列的,DataSet也是
for (int i = 0; i < DataSetlen; ++i) {
double sum = 0;
for (int j = 0; j < 5; ++j) {
sum += (DataSet[i][j] - INX[j])* (DataSet[i][j] - INX[j]);
}
b[i] = sqrt(sum);
}
//=== 接下来用改写选择排序进行减枝,降低时间复杂度
for (int time = 0; time < k; ++time){
int num_index = time;
for (int j = time + 1; j < DataSetlen; ++j){
if (b[j] < b[num_index]){
num_index = j;
}
}
if (time != num_index){
int tn = b[num_index];
char tc = label[num_index];
b[num_index] = b[time];
label[num_index] = label[time];
b[time] = tn;
label[time] = tc;
}
}
char* sc = new char[k];
int* sc_num = new int[k];
memset(sc_num, 0, sizeof(sc_num));
memset(sc,'0',sizeof(sc));
int len = 0;
for (int i = 0; i < k; ++i){
bool p = true;
for (int j = 0; j < len; ++j){
if (sc[j] == label[i]){
sc_num[j] ++;
p = false;
}
}
if (p) {
sc[len] = label[i];
sc_num[len++] = 1;
}
}
char ans;
int time = 0;
for (int i = 0; i < k; ++i) {
if (time < sc_num[i]){
ans = sc[i];
time = sc_num[i];
}
}
cout << "time = "<< time<< endl;
delete []b;
delete []sc;
delete []sc_num;
return ans;
}
int main(){
int INX[] = {1,2,3,4,5};
int **DataSet = new int* [3];
for (int i = 0;i < 3;++i){
DataSet[i] = new int[5];
for (int j = 0; j < 5; ++j){
DataSet[i][j] = (2 * j + 1 - 3* i) % 9; //这个随便写的一个数据集
}
}
char label[] = {'A', 'B', 'C'};
cout << classsify_KNN(INX, DataSet,3,label, 1)<< endl;
//释放空间
for (int i = 0;i < 3;++i) {
delete [] (DataSet[i]);
DataSet[i] = NULL;
}
delete[] DataSet;
}

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。