机器学习/自控仿真

人工智能的实现方法

登录以发表

上级专业


主管专家


文章

63

评论

408

今日更新

0

专业介绍

机器学习、建模仿真、自动控制、虚拟现实


文章

63

评论

408

今日更新

0

专业介绍

机器学习、建模仿真、自动控制、虚拟现实

    机器学习并不困难,但从某种程度上来说又很困难。
    各种机器学习相关的教材,不管是文字的还是视频的,都要求学习者具备高等数学、线性代数、概率论等数学知识。这还仅仅是最简单的诸如梯度下降这一类算法的要求,继续向后学习还会遇到更多更高级的数学概念,如果学习者对数学没有一定的“灵性”甚至从小数学就不好,入门机器学习是几乎不可能的事情(当然仅限于玩玩现成的框架除外,这类通常不在本专业的讨论范围之内)。
    对于有志于此的人们来说,这其实是好事。在机器学习的最前沿,是类似 Google / Facebook / Baidu 这样的大公司,但这完全不妨碍个人产生优秀的研究成果。如今在机器学习上取得的最微小的突破,其影响力也不亚于20年前PHP和JavaScript的横空出世,不亚于40年前出现的图形用户界面和计算机网络。
    如果让我用一句话概括机器学习:机器学习,是一门让计算机(或者其他机器)模拟生物“学习”过程的学问。

pic
    通常,研究者需要设计具有“学习”能力的数学模型,向模型添加一定的输入,令模型从输入中“学习”输入与输出的对应关系,或者输入与其他输入之间的联系。

    举个例子:现有一支机械臂,用其投掷一支飞镖,我们希望让飞镖落点尽量靠近靶心。传统的办法是,设定机械臂的出手速度为某个固定值 $\vec{v}$ ,然后通过CV等方法求得靶心与机械臂出手点的距离 $\vec{d}$,再根据当地 $g$ 值构建抛物线,最后让机械臂按抛物线起点切线 $\vec{t}$ 抛出飞镖。

    如果把出手方向设为输入,飞镖落点设为输出,我们可以利用经典物理定律,由输入直接求得输出,也可以从所需的输出反推得到合适的输入。
    然而在现实中,运动员只需靠“手感”,就能在不同的距离、不同的出手角度、不经测量计算而准确击中靶心。如果第一次投低了,第二次就增加一些速度,或者提高一点角度……最后就找到了“手感”。这说明:人类虽然不善于计算,但藉由不断地练习,可以令【从眼到手的神经反射回路】为“命中靶心”这个特殊目的调校到最优。
    相比之下,若要让一台机器精确地按照某个物理模型投掷飞镖,则困难得多:因为现实世界中的物理模型实在是太复杂了。飞镖的流体动力学模型要怎么仿真?飞镖出手时,机械手与飞镖从开始分离到完全分离经过多少毫秒?是否要给机械手加装精密的速度传感器(加速度计 / CV / 编码器)?以及,机械的重复性问题。
    因为完善物理模型的成本实在是太高,聪明而懒惰的工程师们提出了反馈控制:虽然丢飞镖的过程存在不可忽略且模型复杂的系统误差,但只要飞镖的命中高度与出手切线斜率是正相关的,那么通过不断地【抛掷飞镖->计算落点误差->微调出手斜率】,最终一定能够让系统准确地命中靶心。
    于是PID反馈控制被大规模应用。但它的缺点也很明显:
    1)必须连续不断地投掷飞镖才能维持反馈,浪费大量飞镖。
    2)如果目标在运动,落点误差会一直存在。
    这是因为,相比一个完善的物理模型(100%模型预测),PID控制(100%误差驱动)刚好处在另一个极端:PID算法本身并不关心具体控制系统的物理模型细节,只关心输出与期望的误差,并通过输出误差计算相应的输入调整。
    于是工程师们提出了二阶PID,前馈控制……大家向反馈控制中加入了越来越多针对系统物理模型的优化,以期得到优良的性能。
    后来鲁道夫·卡尔曼提出了一个滤波器,可以借助物理模型的已知细节,对输入数据进行修正与预测,并证明了其在一大类问题上的最优性。经过几十年的发展,卡尔曼滤波器已经形成了一个完备的家族。
    但要用好卡尔曼滤波器并不容易,如果希望卡尔曼滤波器的效果好,仍然要对系统作非常细致的分析,包括误差从哪里来、各个输入与误差之间如何互相影响……以至于到最后,几乎每一类控制问题,都相应著有关于如何设计针对这类控制问题的卡尔曼滤波器的论文。最终工程师们又回到了起点:要实现完美的控制,仍然需要掌握系统的大量内部细节。
    至此,机械手仍然无法像一个人类运动员那样,依靠“手感”投掷飞镖,或者依靠“手感”驾驶飞机。
    要解决这一大类问题,现在最好的办法就是机器学习,也就是本专业的内容。

快速入门

在科创玩电路的童鞋萌基本都用过电路仿真软件,比如PSPICE,LTSPICE,Multisim之类的玩意,有没有想过这些货是怎么仿真电路的呢? 这些大型的仿真软件其实是基于SPICE的,外加一堆商业零件的电路模型还有画图工具啥的。核心的SPICE是免费的软件,不过是命令行的,日难用( 首先举个最简单的例子,各位刚学电路的时候最常遇到的老三件还记得么?电压源,电流源,电阻! 那就先弄个只有电压源,电流源和电阻的例子! (附件:266875) 图中有3个电压未知的节点,记作V1 V2 V3。 先让窝萌回顾下KCL,也就是基尔霍夫电流节点定律,这个定律指明了流入和流出一个节点的电流永远是相等的. 为了方便分析,需要把电压源换成电流源: (附件:266876) 一个电压源和一个电阻串联的小电路块可以等效为一个电流源和一个电阻并联的小电路块,电阻的值都一样,电流源的值为电压源电压除以电阻。 图于是就变成了这样: (附件:266877) 这个例子可以写出3个KCL等式来: (附件:266878) 稍微整理下可以得到: (附件:266879) 这里面的G1 G2等代表的是电导,电导是电阻的倒数。 电导的英文叫Conductance,字面上还能理解为两个节点之间的“连接程度”,电导越大,两个节点之间的电阻越小。 这是一个3元1次线性方程,最好的解决方法是写成矩阵形式: #{r=26

推荐阅读

sklearn是python的一个ML库。其文档非常详细,详细程度可称教材级别。使用简便。 运作流程 音频输入==>STFT==>寻峰==>泛音提取==>使用sklearn进行聚类==>输出 有关STFT 本应用中由于输入的音频文件为44k的CD采样率,因此采用的STFT使用44100的原采样率,不再重新采样。并使用8000点的帧长度,步进2000点(即帧重叠6000点),使用hanning窗,以达到足够高的频率分辨度同时足以显示出乐曲的动态变化。 详细: http://bbs.kechuang.org/t/78789 寻峰 这里没有使用特别复杂的寻峰算法,只是最简单的二阶导数+阈值 泛音提取 乐音中各次泛音成分的比例关系反映了声音的音色特征。因此提取前n次泛音与基频的比例,取对数(消除距离不均)后放入n维向量中进行聚类。由于高次数的泛音十分弱,易被噪音干扰,所能提供的特征信息也不多,因此n过大反而不利于分类。经多次测试,n的取值应在4附近,效果比较理想。 同时,由于和弦结构会对泛音产生一定干扰(例如,其中五度音程的两个音,二、三次泛音将会重叠在一起),因此应使用尽量简单的乐曲。 聚类 聚类使用sklearn库的SpectralClustering算法。样本应采用乐器种类较多,音色差别较大的乐曲,经实际测试,对部分乐器种类

上级专业


主管专家



关注者


nkc production server  https://github.com/kccd/nkc.git

科创研究院 (c)2001-2018

蜀ICP备11004945号-2 川公网安备51010802000058号