싱글 칩 마이크로컴퓨터 에서 실행 가능 한 머 신 러 닝 알고리즘 KNN (C 언어 구현)

5403 단어 기계 학습
2017 년 전국 대학생 전자 디자인 대회 I 문 제 는 가시광선 포 지 셔 닝 문제 이다. 본 방법 은 위치 지문 을 바탕 으로 하 는 무선 포 지 셔 닝 사고방식 을 제공한다. 오프라인 으로 무선 지문 라 이브 러 리 (신호 강도 구성의 벡터 와 대응 하 는 위치 라벨) 를 구축 하고 기계 학습 알고리즘, 예 를 들 어 KNN 으로 포 지 셔 닝 을 해 야 한다. 경 기 는 단편 기 에서 만 운행 할 수 있 기 때문이다.그래서 경기 에 대해 서 는 싱글 칩 마이크로컴퓨터 누 드 기기 에서 직접 실행 할 수 있 는 KNN 알고리즘 을 C 로 바 꾸 었 다.
2. 왜 C 를 사용 합 니까
python 등 고급 언어 로 작 성 된 머 신 러 닝 코드 는 운영 체제 지원 이 필요 하기 때문에 일반적인 의미 의 싱글 칩 마이크로컴퓨터 는 Linux, Windows 등 고급 언어 를 지원 할 수 있 는 운영 체 제 를 실행 할 수 없 기 때문에 싱글 칩 마이크로컴퓨터 누 드 나 ucOS 가 지원 할 수 있 는 C 언어 를 사용 하여 고 쳐 써 야 합 니 다.
/***********************************   
     Author: ML_SDD  
     T: 2017.8.12
***********************************/

#include 
#include 
#include 
#define A_L  81

//Map              [RSS1,RSS2,RSS3,X,Y]
unsigned char Map[A_L][5] = {};
int Dis[A_L][3];//Dis      RSS   ,X,Y   
int k = 3;//  K=3     3   
unsigned char Input[3]={0};//      ,    AD      RSS  
//        x,y   ,    
unsigned char result_x = 0;
unsigned char result_y = 0;

unsigned char knn_predict(unsigned char *Input)
{
    unsigned char i,j,n,p;//for      
    unsigned char temp_dis,temp_x,temp_y;//      ,     
    unsigned char result_sum_x = 0;
    unsigned char result_sum_y = 0;
    for(i=0;i0] = sqrt((Map[i][0]-Input[0])^2 + (Map[i][1]-Input[1])^2 + (Map[i][2]-Input[2])^2);
        Dis[i][1] = Map[i][3];
        Dis[i][2] = Map[i][4];
    }
    //    
    for(j=0;j1;j++)
    {
        for(n=0;n1;n++)
        {
            if(Dis[n][0]>Dis[n+1][0])
            {
                temp_dis = Dis[n][0];
                Dis[n][0] = Dis[n+1][0];
                Dis[n+1][0] = temp_dis;
                //------------------
                temp_x = Dis[n][1];
                Dis[n][1] = Dis[n+1][1];
                Dis[n+1][1] = temp_x;
                //------------------
                temp_y = Dis[n][2];
                Dis[n][1] = Dis[n+1][2];
                Dis[n+1][2] = temp_y;
            }
        }
    }
    for(p=0;p1];
        result_sum_y = result_sum_y + Dis[p][2];
    }
    result_x = result_sum_x / k;
    result_y = result_sum_y / k;
}

좋은 웹페이지 즐겨찾기