2017-09-02 21:42:23 ML_SDD 阅读数 2281

2017年全国大学生电子设计大赛I题可见光定位问题,本方法提供一种基于位置指纹的无线定位思路,需要离线构建无线指纹库(信号强度构成的向量与对应位置标签),再用机器学习算法,例如KNN进行定位,由于比赛只允许在单片机上运行,因此针对比赛用C改写了一个可直接在单片机裸机上运行的KNN算法。

2.为什么要用C

因为诸于python等高级语言编写的机器学习代码需要有操作系统支持,而一般意义上的单片机无法运行Linux,Windows等可以支持高级语言的操作系统,因此需要使用单片机裸机或者ucOS可以支持的C 语言进行改写。

/***********************************   
     Author: ML_SDD  
     T: 2017.8.12
***********************************/

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#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;i<A_L;i++)
    {
        Dis[i][0] = 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;j<A_L-1;j++)
    {
        for(n=0;n<A_L-j-1;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;p<k;p++)
    {
        result_sum_x = result_sum_x + Dis[p][1];
        result_sum_y = result_sum_y + Dis[p][2];
    }
    result_x = result_sum_x / k;
    result_y = result_sum_y / k;
}
2019-02-24 17:38:00 nalw2012 阅读数 184

1、什么是机器学习?
机器学习就是研究如何使计算机能够模拟人的学习方式,从大量数据中不断提升处理某个具体问题的能力。

2、机器学习的三要素是什么?
数据、算法、模型。
机器学习通过大量数据,使用某种算法,不断训练优化自己的模型。

3、什么是目标函数?
通过样本训练,得到一个具体模型,用来描述该模型的函数。

4、什么是损失函数?
用来衡量假设函数对样本的预测值与实际值差异差异的函数。

5、机器学习的一般步骤是什么?
数据采集和标注、数据预处理、特征选择、模型选择、模型训练与测试、模型评估与优化、模型应用

6、什么是过拟合、欠拟合?
过拟合是模型的训练集损失函数很小,验证集损失函数很大。
欠拟合是模型的训练集损失函数很大,验证集损失函数很大。

7、什么是学习曲线?
描述模型的损失函数随样本数量变化的曲线。

8、如何判断过拟合、欠拟合?
模型欠拟合时,训练集和验证集的学习曲线接近,但都在一个较低的水平。
模型过拟合时,训练集的学习曲线保持在较高水平,验证集的学习曲线保持在较低水平。
模型拟合好时,训练集和验证集的学习曲线接近,且都保持在教高水平。

9、如何解决过拟合问题?
增加训练集样本数量;减少选择的特征数量。

10、如果解决欠拟合问题?
增加有价值的特征数量;增加多项式特征。

11、如何验证模型准确率?
准确率:Precision=TP/(TP+FP),即在所有被预测为正的测试数据中,预测正确的比率。
召回率:Recall=TP/(TP+FN) ,即在所有实际为正的测试数据中,预测正确的比率。
F1Score: F1Score = 2*PR/(P+R)

12、什么是K近邻算法?
通过未标记样本距离最近的k个邻居决定样本的类别。k近邻算法是一种有监督的学习算法,可以解决分类问题,也可以解决回归问题。
优点:准确性高,对异常值和噪声有较高的容忍度。
缺点:计算量较大,对内存有较大需求。

13、K近邻算法的原理?
1)遍历训练集中所有样本,计算每个样本于测试集中样本的距离,并把距离保存在距离数组;
2)对距离数组进行排序,取距离最近的k个点;
3)统计最近k个点每个类别的个数,待测样本的类别,就是k个点中个数最多的那个类别。

(待续)

2017-11-12 21:54:21 pyromaniac 阅读数 1527

1,电平:数字电路中只有两种电平,高电平和低电平,对应的是计算机中的二进制原理。

2,晶振电路:决定单片机运行的节奏,即频率。

3,复位电路:重置开发板。

4,机器周期:一个机器周期包含12个时钟周期,在一个机器周期内,cpu就可以完成一个独立的操作。

5,时钟周期:也称为振荡周期,由晶振电路产生,指的是为单片机提供时钟脉冲信号的振荡源的周期。

6,在单片机编程时,一定要带reg52.h(51单片机),原因是该头文件已经将MCU中的IO口全部定义好了,只要对照结构图,就可以在头文件中找到代表对应接口的变量,进而就可以对这些变量进行操作,相当于直接操作对应的IO口了。

7,sfr:特殊功能寄存器,也是一种单片机扩充的数据类型,利用它可以访问51单片机内部的所有特殊功能寄存器。例:sfr P0 = 0x80;//定义P0接口,其地址就是0x80 (sfr定义的是8位的特殊功能寄存器,sfr16,则是用来定义16位的特殊功能寄存器的)

8,sbit:对应的是可位寻址空间的一个位,单片机里的可位寻址区域:20H~2FH,一旦用了sbit XXX =地址 这样的定义,这个变量的地址就确定了。sbit大部分是用在寄存器中的,目的是为了方便对寄存器的某位进行操作。

9,高阻态:既不是高电平也不是低电平的状态。

10,锁存器:是一种有好几种模式的电路结构,某一种模式下输出端的状态不会随着输入端状态变化而变化;在另外一种模式下才会随着输入信号的变化而变化。它是通过改变LE位的值来改变它的模式,当LE位为高电平时,锁存器输出的是当前输入的值;当LE位为低电平时,锁存器输出的是之前一次保存的值。它的主要作用就是缓存,其次就是完成高速控制器与慢速外设的不同步的问题。

11:芯片引脚标志上的横线代表该引脚是低电平有效。

12:数码管的结构原理:数码管的控制分为位选和段选,段选决定的是单个数码管显示的数;位选决定的是哪些数码管会被点亮。

13:数码管的动态显示:动态显示是用的人眼的视觉暂留效应来形成的。因为八位的数码管同时只能显示一个数值。

14,定时器:就是一个计数器,每经过一个机器周期,计数器就+1,定时器是由两个计数器控制的,一个是控制寄存器TCON,一个是模式寄存器TMOD。

15,定时器的控制寄存器TCON:它有两个主要的标志位,TF:溢出标志位,当定时器计数溢出的时候,由硬件把这个位置1,该位是可以由软件置0的;TR:运行控制位,由软件置1或者清零,为1的时候才允许定时器开始计数。

16,定时器的模式寄存器TMOD:它有几个主要的标志位:GATE位:控制的是定时器的启动模式;C/T位:控制的是定时器的计数方式,1代表的是计数器,用外部的脉冲作为计数单位,0为定时器,用的是内部的机器周期作为计数单位;M0位和M1位:控制定时器(计数器)的工作模式。

17,编程使用定时器(计数器)的步骤:
设置定时器的工作模式(通过TMOD)
设置定时器的初值
启动定时器(通过TCON)
定时器开始之后,查看TCON的TF位是否溢出(置1),如果为1,并且要继续使用定时器,则需要通过软件将它清零,如果是8位自动重装模式,则不需要手动清零

18,键盘有编码键盘和非编码键盘两种,编码键盘通过硬件电路产生被按按键的键值码,这种键盘的特点是使用方便,所需程序简单,但是硬件电路复杂。如计算机的键盘就属于编码键盘;非编码键盘则是通过程序来识别按下的键,它的硬件结构相对简单,但是程序识别会困难一些,单片机上的键盘就是非编码键盘。
非编码键盘包含独立键盘和矩阵键盘两种,独立键盘是每个按键单独对应硬件上的一位;而矩阵键盘上的每个按键对应的是硬件上某几位的组合。

19,按键特性:按键的按下与释放是通过机械触点的闭合和断开来实现的,因为机械触点的弹性作用,在闭合和断开的过程中均会有一个抖动的过程,因此在进行键盘按键识别编程的时候需要用软件延时来跳过这段抖动的时间。

20,在软件判断是否按下按键的时候,需要在判断语句之后加上松手检测环节,以免循环判断。

21,根据矩阵键盘的电路结构,在编程判定到底按下的是哪个按键的时候,需要先将行线位全部赋值为0,列线全部赋值为1,再看列线的值的变化,判断按键是属于哪一列;随后将列线位全部赋值为0,行线位全部赋值为1,再看行线的值的变化,判断按键是属于哪一行。从而定位到按键的具体位置。

22,单片机每次上电的时候必须进行复位,否则容易出现程序错乱。所以单片机硬件在设计的时候就考虑到了这个问题,根据复位的电路结构就可以看出,每次上电都会给电路中的电容充电,从而自动进行复位操作,同时电路中也提供一个按钮可以手动复位。

23,51单片机中一共有5个中断源,其中两个为外部中断,均由低电平或下降沿引发,外部中断接口分别为P3.2和P3.3的复用接口,可以通过特殊功能寄存器TCON的低四位来控制。3个内部中断分别是两个定时器中断和一个串口通讯中断。

24,TCON的低四位:
IE0/IE1:外部中断触发标志位,0代表没有外部中断申请,1代表有外部中断申请。
IT0/IT1:中断触发方式的选择位,0代表低电平有效,1代表负跳变有效。

25,单片机中断的撤销:
定时器中断执行后由硬件自动撤销;
串行口中断的撤销:在中断执行后需要人工将标志位清零(T1和R1)
外部中断的撤销分为两类:
负跳变方式中断的撤销:在中断执行后由硬件自动撤销。
低电平方式中断的撤销:在中断执行结束后需要人工将中断引脚置为高电平。

26,中断允许控制寄存器IE:控制单片机中断开启和关闭的寄存器,其中的几个位的意义如下:
EA:中断总允许位,取0时禁止全部中断,取1时允许中断
ES:串行口中断允许位,取0时禁止串行口中断,取1时允许串行口中断
ET0/ET1:定时器中断允许位,取0时禁止定时器中断,取1时允许定时器中断
EX0/EX1:外部中断允许位,取0时禁止外部中断,取1时允许外部中断

27, 单片机的中断优先级控制寄存器IP(只有后五位有效,并且可以位寻址):
PX0/PX1: INT0/INT1 外部中断优先级控制位,0表示低优先级,1表示高优先级
PT0/PT1: T0/T1 定时器溢出中断优先级控制位,0表示低优先级,1表示高优先级
PS: 串行口中断优先级控制位,0表示低优先级,1表示高优先级

28,单片机同优先级中断查询顺序(由高到低):
外部中断0,T0溢出中断,外部中断1,T1溢出中断,串行口中断。

29,编程写单片机的中断响应函数的时候,需要在函数名后面加上interrupt关键字,并加上标号,标号由中断查询顺序决定,由高到低分别是0~4。
例: void INT0() interrupt 0 //外部中断0的响应函数,由于外部中断查询顺位是第一位,所以标号为0

30,并行通信和串行通信
并行通信:数据的各位同时在多根数据线上进行发送或者接收
串行通信:使用一条数据线,将数据一位一位的顺序传输

31,串行通信的种类:
异步通信:是以帧为单位进行传输的方式,帧与帧之间的时间间隔是任意的,但每个帧中位和位之间的时间间隔都是固定的。
同步通信:建立发送方时钟对接收方时钟的直接控制,使双方达到完全同步。即发送数据的每一位的到达时间都不同,但是它们到达的间隔时间都是相同的。

32,串口通信的三种制式:
单工:单向的(或者是收或者是发)
半双工:(串行通信)收/发不可同时进行
全双工:(串行通信)收/发可同时进行

33,比特率:每秒钟传输二进制代码的位数
注意:串口通信的时候,发送端和接收端的比特率要相同

34,单片机串口通信的数据缓存器SBUF:SBUF只有一个,它既表示发送寄存器,又表示接收寄存器,在CPU往SBUF上写数据时,数据就会被送入发送寄存器准备发送;在CPU读取SBUF上的数据时,则读入的数据一定来自接收寄存器。
例:a = SBUF; //用变量a接收串口通信的数据
SBUF = a; //将a的值作为传输数据发送

35,串行控制寄存器SCON:是一个既可以字节寻址又可以位寻址的8位特殊功能寄存器。单片机复位时,SCON所有位均清0。几个比较重要的位的意义如下:
SM0和SM1:为工作方式选择位,可选择四种工作方式,最常见的工作方式是SM0=0,SM1=1,此时工作方式是10位的异步收发器,每帧传送8位数据(加两位帧头尾),此模式下比特率可变
REN:串行接受允许控制位。该位由软件置位或复位。当REN=1,允许接收;当REN=0,禁止接收。
TI:发送中断标志位。TI=1,表示已结束一帧数据发送,可由软件查询TI位标志,也可以向CPU申请中断。注意:TI在任何工作方式下都必须由软件清0。
RI:接收中断标志位。RI=1,表示一帧数据接收结束。可由软件查询RI位标志,也可以向CPU申请中断。注意:RI在任何工作方式下也都必须由软件清0。

36,由于单片机串行通信只有一个中断,所以TI=1的时候或者RI=1的时候(前提是该中断被打开)都会触发该中断,因此在中断程序中必须由软件查询TI和RI的状态才能确定究竟是接收还是发送中断,进而作出相应的处理。

37,51单片机的串口通信的波特率的设置:
根据串口的电路结构,串口通信的波特率默认是由定时器1来设置的,具体设置的方法和定时器1的开启方法相同:
设置定时器的工作模式(通过TMOD,设置为8位自动重装模式)
设置定时器的初值(TH1和TL1的值要相同)
启动定时器(通过将TCON的TR1位置1)
波特率的大小和初值有关,关系如下(串口通信方式1):
波特率 =(2的SMOD次方/32)·(T1溢出率)

38,电平转换芯片的作用:
当两个不同的设备要进行通信的时候,以计算机和单片机为例,存在电平不兼容的问题,计算机的逻辑0(低电平)为3~15v,逻辑1(高电平)为-15~-3v,而单片机的逻辑0为0~0.8v,逻辑1为3~5v,因此需要电平转换芯片来使它们的高低电平做一个对应的映射,从而实现不同的设备之间的通信。

39,typedef和define的用法与区别
define是预处理指令,在编译预处理时进行简单替换,不做正确性检查,不管含义是否正确,照样带入,只有在编译已经被替换后的源程序时才会发现可能的错误并报错。
typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名,而#define只是简单地替换

40,模拟量和数字量
模拟量:自然界连续变化的物理量。所谓连续,包含两个方面的含义
一方面从时间上来说,它是随时间连续变化的;
另一方面从数值上来说,它的数值也是连续变化的。这种连续变化的物理量通常称为模拟量。
数字量:计算机中处理的是不连续变化的量,离散性的数字量

41,模拟量输入方式:差分输入与单端输入
单端输入,输入信号均以共同的地线为基准.这种输入方法主要应用于输入信号电压较高(高于1 V),信号源到模拟输入硬件的导线较短,且所有的输入信号共用一个基准地线.如果信号达不到这些标准,此时应该用差分输入.对于差分输入,每一个输入信号都有自有的基准地线;由于共模噪声可以被导线所消除,从而减小了噪声误差.
单端输入时, 是判断信号与 GND 的电压差. 差分输入时, 是判断两个信号线的电压差.
信号受干扰时, 差分的两线会同时受影响, 但电压差变化不大. (抗干扰性较佳) 而单端输入的一线变化时, GND 不变, 所以电压差变化较大. (抗干扰性较差)

42,EEPROM:
EEPROM(带电可擦写可编程读写存储器)是用户可更改的只读存储器
,其可通过高于普通电压的作用来擦除和重编程(重写)。不像EPROM芯片,EEPROM不需从计算机中取出即可修改。在一个EEPROM中,当计算机在使用的时候可频繁地反复编程,因此EEPROM的寿命是一个很重要的设计考虑参数。EEPROM是一种特殊形式的闪存,其应用通常是个人电脑中的电压来擦写和重编程。
EEPROM,一般用于即插即用(Plug & Play)。
常用在接口卡中,用来存放硬件设置数据。

2017-11-04 20:57:23 tongjinrui 阅读数 242


首先,本科和研究生都学的计算机,本科阶段主要学的是嵌入式系统,有关单片机的内容。
研究生阶段,尝试过学习PHP和JAVA的方向,但是为此还是没有找到能激起我内心兴奋的那个点,后来学习机器学习,但是有一阵子被吓得退缩了。直到现在才感觉越学越兴奋,我想这条路走对了。


机器学习的任何一本理论教材中,都会出现一些数学名词,比如矩阵的求导,似然概率,特征向量,欧式空间等等……一大推数学和专业词汇出现在我的面前,刚开始表示真的被吓到了。明显感觉入门比较难,可是后来还是入了门,并没有老师和学长带,全是自己学习和研究的,那么这中间的过程是怎么样的,我会谈谈自己的经验,希望有更多的人和我一起,勇敢面对未来的困难尽管有些东西刚开始并不擅长,但是别退缩。


当然了,也不能死学,一定要动动脑子,在学习的过程中,用类比的思维对未知的知识进行归纳和总结如果有特别不熟悉的东西,不要奢望一下子什么都记着,知识要反复看的。我的第一本入门教材是周志华的《机器学习》,买来好久没看,因为简直就像天书,看着高大上,但是什么都看不懂。


刚开始的时候,特别感觉难,需要学习的东西特别多。请注意,这里我说的懂是从根本的原理到应用,偏向于理论层面,如果代码层面,只要会调用,那不算明白。但是校招的时候,如果没有开发经验,也没关系的,公司还是比较偏向于个人的基础如何,所以理论一定要扎扎实实,这样你的成长空间才会更大。


因为算法无穷无尽,但是只要有基础,就能很快的跟上,所以我给想入门的同学什么建议呢,如下:
1、有一两本专业书即可,《机器学习实战》《机器学习》《统计学习方法》,数学和概率论的基础等需要学的时候再用,到时候网上现查资料,比如什么叫做拉普拉斯矩阵等等


2、由于机器学习入门确实挺高的,所以建议小白们,要通过先接受别人的理解方式帮助自己理解,然后再转化为自己的理解方式,如果基础都没有,别谈什么创新,最重要的就是,少问为什么,慢慢理解,别陷入局部的问题之中,说白了就是别钻牛角尖。理解的部分,我个人是通过看视频的方式,推荐网易课堂中的Ng的《机器学习》课程,以及七月视频和小象学院的课程(但是比较新的视频都挺贵的,如果有经济困难的朋友,可以在网上或者淘宝搜搜看),总之就是找到一部完整的讲解视频,从头开始看到尾,而且要反复看,别指望看一遍有什么收获,两三遍之后其义自见,会找到和老师的默契感。这个过程是很痛苦的,因为很无聊,像听天书似的,这个时候如果你放弃了,没有人能帮助你了,本人看视频不下三四遍,然后一边看一遍做笔记,截图,然后课下再看笔记,再理解。推荐印象笔记,在淘宝买一个账号,方便做笔记,电脑和平板同步,可以经常看看知识点,增加自己的理解。笔记这个东西还是很重要的,不要小看哦,我现在找工作面试,基本都是看之前的笔记,帮助很大。


3、要有一颗坚韧的心,别轻易放弃,看书,看视频,安装Anaconda软件,敲代码,跑一些简单点的数据,看看结果。这个过程需要反复。


4、本人从不玩游戏,更多的时间就是在看模型,理解,所以学这个方向,一定要多花时间,有些人的理解能力很强,但是大部分人的理解都需要时间,反复加强,反复学习。


5、鼓励自己,别轻易放弃。有人说,你学校不行,找算法相关的工作很难,没有985和211有优势,但是这个时候你也不要放弃,事在人为,因为我就是其中之一,我相信自己能行,所以在面对被人的嘲讽,我不在乎。这些人只是提醒你,形式比较严峻,不用多解释,你需要付出更多的时间和努力。加油,只要坚持学习,只要有梦想,只要相信自己,一切都会变得更好。如果有机会实习,和比赛还是要多参与,为自己的简历加分。


平时可以多看看别人写的博客,CSDN博客,博客园,以及推荐一些公众号如:算法和数学之美,算法爱好者,Python开发者,机器之心,AI科技大本营等等。


在学习的时候,不需要纠结语言,个人建议,平时跑模型的时候还是用Python比较好,方便,学习时间短,上手快。直接安装Anaconda软件,就能调用机器学习各个模型的算法。

2017-12-14 16:25:00 qq_41379312 阅读数 125

晶振电路的作用及原理

作用:晶振电路给单片机系统提供基本的时钟信号

原理:晶振结合单片机内部的电路,产生单片机所须的时钟频率

 

复位电路的作用及原理

作用:使单片机从程序的最初开始运行(相当于电脑的重启),防止单片机“死机”或“程序跑飞”等情况

原理:单片机的RST引脚接保持两个机器周期以上的高电平时复位

 

为什么低电平才能点亮灯

对于单片机一般来说各个引脚的灌电流能力比拉电流能力强,当用低电平来点灯时单片机的驱动能力强

 

EA引脚为什么要接电源

EA引脚处于高电平状态时读取的是单片机内部存储器的程序,当EA引脚为低电平状态时将会读取外部存储器的程序,所以要接电源使其处于高电平状态让其读取内部存储器程序

 

51单片机学习

阅读数 58

没有更多推荐了,返回首页