能力说明:
了解Python语言的基本特性、编程环境的搭建、语法基础、算法基础等,了解Python的基本数据结构,对Python的网络编程与Web开发技术具备初步的知识,了解常用开发框架的基本特性,以及Python爬虫的基础知识。
阿里出的这个无影桌面,哇塞,简直是用哇塞来形容呀,由于我用的是mac电脑,但是有些东西呢,只有在windows上面才能用,但是呢,我又不想安装pd、VM等虚拟机来实现,于是,无影云的出现简直是mac党的福音呀,特别是像我这种内存又小的移动,多出差党呀!!!绝不是我夸,是真的真的真的很方便实用!!!话不多说,直接上初体验测评。什么是无影云桌面阿里云无影云桌面( Elastic Desktop Service)的原产品名为弹性云桌面,融合了无影产品技术后更名升级。它可以为您提供易用、安全、高效的云上桌面服务,帮助您快速构建、高效管理桌面办工。get无影云桌面可以直接跳转这个链接,然后申请领取就可以了哟!https://developer.aliyun.com/topic/wuying?spm=5176.a2cmu.mainmenu.27.578c3cb9iviYgb然后根据自己的需求申请就行了哟!下面是我申请的,我是专家博主,可以获得一年的使用权,嘻嘻!安装Mac的无影云客户端在这个链接里面可以下载,有很多操作系统的哦!~https://free.aliyun.com/product/eds?spm=5176.19598036.J_5253785160.7.106a48b07eJaSd下载完后,就安装,这就不用再讲了吧!~实操在你登录之前,需要在工作台,也就是这里:https://eds.console.aliyun.com/usermanage/cn-beijing然后再用户管理处,创建用户哈,然后把用户分配到这台云桌面然后再将其分配好就行啦然后你会收到邮件,里面有账号密码,首次登陆会让你修改,直接修改就行了。按照完后,直接进入 直接输入你的工作区ID就行了,然后下一步输入刚刚的账号密码进入桌面这样你就拥有了两台电脑啦,哈哈哈。想怎么用就怎么用,很爽呀!!!感谢阿里云,感谢无影云桌面,希望能越做越好!
乘着年末了,学一下Java,大家来一起进步呀!~下面附上一下活动链接:年末将至,新年的味道越来越重了。乘风者专家博主——冰河倾力打造的《Java8从入门到精通》电子书从上线到现在已在全网受到数十万追捧,热度空前。我们也策划了一场热闹非凡的打卡领好礼活动。三步动作就可以领取小米鼠标、阿里云定制蓝牙音箱,更有机会获得冰河亲笔签名的新书《深入理解分布式事务:原理与实战》。福利多多,赶快拉动你周围的小伙伴一起参与进来,给自己一个年终奖吧!活动链接:https://developer.aliyun.com/topic/java/blogger先入门一下吧,认识认识Java8.Java8总览Java8有如下新特性:Lambda 表达式 函数式接口 方法引用与构造器引用 Stream API 接口的默认方法与静态方法 新时间日期 API 其他新特性Java8的优点速度更快代码更少(增加了新的语法 Lambda 表达式) 强大的 Stream API 便于并行 最大化减少空指针异常 OptionalJava学习笔记1)Spring、Spark Streaming框架2)学习路线基础程序设计关键字数据类型运算符流程控制数组(排序算法、数据结构)面向对象编程类/对象类的结构三大特性接口设计模式应用程序开发JDBC集合IO/NIO类库多线程异常处理反射网格3)B/S、C/S架构Browser/Server、Clint/Server4)DOS、CMD、常用的命令行指令dir:列出当前目录下的文件以及文件夹md:创建目录rd:删除目录cd:进入指定目录cd..:退回到上一级目录cd\:退回到根目录del:删除文件exit:推出dos命令行补充:echo javase>1.doc5)常用快捷键←、→:移动光标↑、↓:调阅历史操作命令Delete和Backspace:删除字符6)编写第一个“Hello World”程序7)JAVA中的注释类型:单行注释多行注释文档注释(Java特有) //注释:****** /* 多行注释 */ 文档注释:(可以被JDK提供的工具javadoc所解析,生成一套以网页文件形式体现的该程序的说明文档) /** @author 指定java程序作者 @version 指定源文件的版本 */ 8)main为程序的入口开始简单编程1)API(Application Programming Interface,应用程序编程接口)是Java提供的基本编程接口2)Java的第一个程序总结3)复习题:JDK,JRE,JVM三者之间的关系,以及JDK,JRE包含的主要结构有哪些 JDK=JRE+JAVA的开发工具(javac.exe,java.exe,javadoc.exe) JRE=JVM+Java核心类库为什么要配置path环境变量?如何配置? JAVA_HOME=bin的上一层目录 path=%JAVA_HOME%\bin常用的几个命令行操作(至少4个)? cd、md、rd、del、cd..、cd/创建如下的类,使得运行的话可以输出: 创建java文件:ChairMan.java public class ChairMan{ public static void main(String[] args){ System.out.println("姓名:嘻嘻嘻"); System.out.println(); System.out.println("性别:男"); } }编译和运行上述代码的指令。 编译:javac ChairMan.java 运行:java ChairMan4)Java基本语法-关键字和保留字的说明goto、const保留字标识符:Java对各种变量、方法和类等要素命名时使用的字符序列称为标识符(凡是可以自己起名的地方都叫标识符)Java基本语法乱码的情况和字符集的说明UTF-8强制类型转换字符串类型:String5)基本数据类型之间的运算规则:Java基本语法-两个关于String的练习题060.String语法使用的强化说明String str1 = 4; //判断对错:noString str2 = 3.5f + ""; //判断str2对错:yesSystem.out.println(str2); //输出:“3.5”System.out.println(3 + 4+“Hello”); //输出:7Hello System.out.println(“Hello”+3+4); //输出:Hello34System.out.println(‘a’+1+“Hello”);//输出:98HelloSystem.out.println(“Hello”+‘a’+1);//输出:Helloa1判断是否能通过编译:1)short s=5; s = s-2 //判断:no , 2为int型2)byte b = 3; b = b + 4; //判断:no,4为整型 b = (byte)(b+4); //判断:yes3)char c = 'a'; int i = 5; double result =c+i+d; //判断:yes4)byte b= 5; short t =s+b; //判断:no, char、short、byte相加不许是int061.不同进制的表示方式基础部分就先学到这里啦,大家加油呀!~
解决宝塔报错提示问题解决方法方法一:检查你的域名管理域名解析方法二:清除浏览器缓存方法三:检查你的配置文件当我们已经申请完域名,搭建好服务器后(我用的宝塔面板,具体教程可看这里),而且,管局已经审核通过了满心欢喜的打开自己新建的网站,然后就…。。。问题BingoWTF????????怎么回事?没有哪一步有问题呀???解决方法一切问题都是纸老虎!!!目前解决这个问题的方法主要有三种:方法一:检查你的域名管理首先,打开你的宝塔界面->网站网站->(找到你已经添加了网站的那一行,我因为注册了两个网站,以aiproa.com)->设置添加你的DNS解析的域名,这个解析的域名是在你的服务器上解析的,或者说是在你的购买厂商的域名DNS解析出解析你的域名前缀,我是用的阿里。域名解析如果没有解析,可先进入阿里域名:https://dc.console.aliyun.com/next/index?spm=5176.10173289.products-recent.ddomain.539a2e77sMqKkT#/domain/list/all-domain找到你的域名然后,点击解析下面是我添加的前缀解析。www就是域名前缀,添加了解析后,你在浏览器输入www.aiproa.com才有效,下面这些所有的前缀最终都是指向的一个网站,也就是你绑定的服务器ip,当然如果你绑定的是一个ip的话。添加记录如果你确定完成了上面的DNS前缀解析,那么就可以操作下面了。将你的所有的解析名称都添加在下面的域名管理的地方。这是一般情况遇到的基本解决办法。方法二:清除浏览器缓存如果上述方法都还没奏效,在浏览器界面同时按下ctrl+shift+delete清除浏览器缓存,重新打开就可以了。像下面这样方法三:检查你的配置文件这是我犯的一个很细节的错误,我觉得是一个很严重的问题,或许有盆友和我一样,具体是这样的,在管局还没有审核备案通过之前,我就通过服务器ip地址进行网站建站了,这是在网站域名还没有备案成功前可以实现的建站操作,像下面这样:宝塔面板->网站->找到所在域名->设置->配置文件->server_name我之前是没有备案成功,所以就把这个server_name改成了服务器的ip地址了,是为了提前建站,但是当备案通过之后,直接访问域名,就会出现:您的请求在Web服务器中没有找到对应的站点!所以,如果我们想通过访问域名如:iculand.com、aiproa.com 我们的方法是将原网站设置中的配置文件的server_name修改为你的网站域名,这样就会通过访问你的公开域名来映射到部署在你服务器ip上的网站内容啦。(当然,如果你的server_name后面的名称写错了,也会出现:**您的请求在Web服务器中没有找到对应的站点!**的问题)
免费申请SSL证书1. 阿里云免费申领登录云盾免费申请ssl证书1.1 申请SSL证书1.2 部署SSL证书1.2.1 下载Nginx证书到本地1.2.2 在Nginx服务器上安装证书1.2.3 宝塔界面部署SSL证书(超简单)1.3 验证是否安装成功2. 申请Let's Encrypt免费ssl证书3. https://freessl.cn结合KeyManager申请TrustAsia证书最近在搞服务器,建站,开发等。ssl证书真的是太贵了对于我这种学生党。emo!!!我之前买的阿里的服务器,域名也是阿里买的,后来发现有一个云盾免费申请ssl证书,这不赶紧用起来。1. 阿里云免费申领登录云盾免费申请ssl证书点击进入——云盾免费申请ssl证书一年好像只能申请一次。支棱起来。1.1 申请SSL证书关于ssl的部署,可以跳转——》这里。找到你的ssl证书页,申请然后填写下面的下一步,就Ok啦!~会出现一个验证,直接点击就好了申请很快的,秒级!1.2 部署SSL证书1.2.1 下载Nginx证书到本地将证书下载下来,由于我是部署在web上,我用的是宝塔,所以需要将证书配置到Nginx上面。这里有阿里的部署教程。以我自己的为例,找到Nginx选项并下载下来下载完毕后,解压出来1.2.2 在Nginx服务器上安装证书登录Nginx服务器。可以使用远程登录工具(例如,PuTTY、Xshell)登录服务器。我这里可以直接登录宝塔的网站,所以就不用Xshell远程操作了。执行以下命令,在Nginx安装目录(默认为/usr/local/nginx/conf)下创建一个用于存放证书的目录,将其命名为cert。cd /usr/local/nginx/conf #进入Nginx默认安装目录。如果您修改过默认安装目录,请根据实际配置进行调整。mkdir cert #创建证书目录,命名为cert。使用远程登录工具(例如,PuTTY、Xshell)附带的本地文件上传功能,将本地证书文件和私钥文件上传到Nginx服务器的证书目录(示例中为/usr/local/nginx/conf/cert)。编辑Nginx配置文件(nginx.conf),修改与证书相关的配置内容。详细可参考——在Nginx(或Tengine)服务器上安装证书过程过于复杂,博主还是建议用下面的方法。1.2.3 宝塔界面部署SSL证书(超简单)如果用宝塔就可以直接下面将证书复制进去即可超级方便,有没有!!!保存后就会显示已经部署好了!!然后我们再刷新一下看看是否已经部署好了。恭喜你部署成功啦!~是不是很简单呀!!!而且还免费!!!最后一步验证一下是否真的成功,看下面1.3 验证是否安装成功证书安装完成后,您可通过访问证书的绑定域名验证该证书是否安装成功。https://iculand.com #需要将iculand.com替换成证书绑定的域名。如果网页地址栏出现小锁标志,表示证书已经安装成功。如果验证时出现访问异常,请参照下表进行排查。大功告成啦!!另外还有两种可以免费获得SSL证书的方法。2. 申请Let’s Encrypt免费ssl证书打开网 https://certbot.eff.org/ ,按照命令指示安装即可,操作步骤如下:wget https://dl.eff.org/certbot-autochmod a+x certbot-auto杀死nginx:nginx -s stop 或者用kill命令申请证书的语法: ./certbot-auto certonly --standalone --email test@test.com -d www.test.com编辑nginx的配置文件,修改下面两行内容即可:ssl_certificate /etc/letsencrypt/live/www.test.com/fullchain.pemssl_certificate_key /etc/letsencrypt/live/www.test.com/privkey.pem重启nginx,ssl证书即可生效。可能遇到的问题:1、Couldn’t download https://raw.githubusercontent.com/certbot/certbot/v1.3.0/letsencrypt-auto-source/letsencrypt-auto.解决办法:加上参数 --no-self-upgrade ,不自动更新2、certbot-auto是通过python脚本去申请证书的,如果服务器上python的版本默认是2.6.6的,那么需要先将python2.6.6 升级到python2.7.14,可以参考文章 https://blog.csdn.net/see_you_see_me/article/details/78550977安装virtualenv No module named virtualenv原因:升级过系统的python2.6到2.7版本yum install -y python-virtualenv导致安装到2.6版本库中引起使用时报找不到库文件解决:拷贝python2.6目录lib下的virtualenv* 到2.7版本的lib下cp -rf /usr/lib/python2.6/site-packages/virtualenv* /usr/local/python2.7/lib/python2.7/site-packages/3. https://freessl.cn结合KeyManager申请TrustAsia证书访问https://keymanager.org/下载KeyManager并安装,然后启动KeyManager,首次使用会要求输入密码、确认密码和密码提示。需要记住密码,后续使用KeyManager会让输入主密码即是这里输入的密码。访问https://freessl.cn/ ,填写申请证书的域名,然后点击创建免费的SSL证书具体就不展开了,很简单,和上面差不多,都可以试一试哟!~阿尼哈涩哟!~
💖作者简介:大家好,我是车神哥,府学路18号的车神🥇⚡About—>车神:从寝室到实验室最快3分钟,最慢3分半(那半分钟其实是等红绿灯)📝个人主页:应无所住而生其心的博客_府学路18号车神_CSDN博客🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋📖本系列主要以学习Go语言打怪升级为标准,实现自我能力的提升为目标⚡⚡希望大家多多支持🤗~一起加油 😁专栏—>《Golang · 过关斩将》其他专栏:《LeetCode天梯》《Neural Network》《Python》《Algorithm》Golang之过关斩将开篇,已经公布了。但是没有一个好的IDE,还是对开发和学习带来了很大的障碍,所以这一期准备就IDE的安装进行讲解一下下吧~对了,在安装GoLand之前害的安装一下Go语言的环境,在这里——> go语言开篇下载GoLandGoLand还是是需要付费的,但是如果是学生,可以使用学校的.edu账号进行注册免费使用,乘着还在高校,这波福利不得赶紧安排上?支棱起来!!!学生账号注册地址:https://www.jetbrains.com/zh-cn/community/education/官网:https://www.jetbrains.com/go/?fromMenu点击上面的Download就跳转直接开始下载了,慢慢等下,四百多兆。安装GoLand上面应该大家都已经下载好了吧。直接双击打开安装包。可能有点慢,等等就出来了。直接Next这里最好更改一下路径,然后再进行下一步然后按照下面勾选就ok了然后大功告成啦注册激活GoLand打开并运行GoLand然后就要付费了,买激活码我用了学校的邮箱进行注册了一个,然后就可以用了。大家可以试试,可以借用身边大学朋友的账号。学生账号注册地址:https://www.jetbrains.com/zh-cn/community/education/注册成功注册完就可以用啦~上面这些红框的IDE都可以免费使用,哇,太棒了!!!从这个注册信息看来,好像也是有时间限制的,并不是永久优惠享用,一年足够了,先用着吧,加油!不能用的小伙伴也可以免费试用30天的哦~配置GoLand的GOPATH和GOROOT我们正式打开吧!熟悉的背景来了和Pycharm、IDEA都是一样的差不多先随便打开一个文件夹吧,准备配置GOPATH和GOROOT解释一下:“GOROOT”表示GO在你电脑上的安装位置,这个一般在安装时,程序会直接将其写入到环境变量中。“GOPATH”表示工作路径,它可以包含多个Go 语言源码文件、包文件和可执行文件的路径,而这些路径下又必须分别包含三个规定的目录:src、pkg和bin,这三个目录分别用于存放源码文件、包文件和可执行文件选择之前从最开始安装的SDK环境添加进去,然后apply+ok再接着 Go -> GOPATH配置完毕!使用GoLand创建第一个项目工程:helloworld.go直接创建先在对应工程目录下创建bin、src、pkg三个文件完事儿后,src目录下创建一个文件夹,名字可为项目名,再在里面创建main.go点击右键创建新go文件然后我们就可以开始第一个代码的边写了!~开始边写我们的第一个代码:package main import "fmt" func main() { fmt.Println("Hello, World!") }然后直接右键,run。如果说不行的话还需要下面可能需要选中一下,配置一下run go恭喜你!成功了!!!现在你已经Go入门啦,接下来一起快乐的Go吧!~
数据降维方法及Python实现前言大纲线性数据降维主元分析(PCA)偏最小二乘法(PLS)独立成分分析(ICA)线性判别分析(LDA)典型相关分析(CCA)慢特征分析(SFA)非线性数据降维神经网络非线性方法核(Kernel)方法线性核函数高斯核函数流行学习方法LLE(Locally Linear Embedding) 局部线性嵌入LE (Laplacian Eigenmaps) 拉普拉斯特征映射LPP(Locality Preserving Projection) 局部保留投影前言11月份了,目前再准备开题, 依旧搞故障诊断,在工业过程中的过程监控现状大多是从数据驱动的角度进行监控和诊断,然鹅,我们遇到的很多工况数据确实非线性的,在实际生产中,大部分都是非线性的数据,但也有一些线性的,由此我们可以从全局和局部出发,来对数据进行挖掘和分析,对此,近期我做了很多关于数据降维的一些工作用于毕业论文,现在在下面讲讲我的一些见解和Python代码的复现。Python代码在文末哟!~大纲线性数据降维线性降维方法,如主元分析(PCA)"、部分最小二乘化(PLS)及独立元分析(ICA),线性辨别分析(LDA)等。主元分析(PCA)之前有过一篇blog介绍过这一部分,-> 看这里过程监控中的应用可看 -> 这里还是在介绍一遍吧~PCA是一种统计方法,广泛应用于工程和科学应用中,与傅里叶分析相比,尤其适用于质量监测。其中,为 l 个潜在变量得分的向量。残差向量:且偏最小二乘法(PLS)PLS具体算法过程如下:看似比CCA的简单,这里附上CCA的目标函数:上面CCA是一次求解的过程,而我们的PLS回归只是对目前的第一主成分做了优化计算,剩下的主成分还得再计算。关于优化的目标求解的办法,和CCA一样,也是引用了拉格朗日乘数法来求解。(下面给出详细计算步骤)首先,引入拉格朗日乘子:求导可得,具体独立成分分析ICA原理及应用可看 —> 这里线性判别分析(LDA)LDA的思想:由所给定的数据集,设法将样例数据投影在一条直线上,使得同类数据的投影点尽可能的接近、而异类数据的投影点之间将可能间隔更远。在我们做新样本数据的分类时,将其投影到同样的直线上,再根据投影点的位置来确定新样本的类别。如下图(源自周志华《机器学习》)所示:这里的投影直线也用到了最小二乘的思想,所有数据样本垂直投影在直线上,只是我们的约束条件表为了不同数据样本之间的投影在直线上的距离度量。我们需要寻找到在投影方向w ww上,使得数据样本满足两个条件:1) 相同数据之间投影距离最小;2)不同数据之间投影点位置最大(可通过求其不同数据的投影中心点来判别)LDA二维示意图图中,“+”和“-”代表的是两种不同的数据簇,而椭圆表示数据簇的外轮廓线,虚线表示其投影,红色实心圆●和红色实心三角形△分别代表的两类数据簇投影到w ww方向上的中心点。下面思考另一个问题,如何让同类的数据样本投影点尽可能的靠近,而使得不同样本投影点离得更远呢?这里需要引入协方差的概念,小小复习一下协方差及样本方差的知识(因为本菜鸡数学基础差)协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。上面的Σ 0 、 Σ 1因为是自协方差也就是代表方差(也即为样本方差)。方差:当数据分布比较分散(即数据在平均数附近波动较大)时,各个数据与平均数的差的平方和较大,方差就较大;当数据分布比较集中时,各个数据与平均数的差的平方和较小。总的说来:方差越大,数据的波动越大;方差越小,数据的波动就越小。协方差表示的是两个变量的总体的误差,这与只表示一个变量误差的方差不同。 如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。 如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。简而言之:两个变量之间差距越大,协方差就越小;相反,两个变量越相似变化趋势一致,则协方差越大。复习完协方差、样本方差的知识后,解决上面的问题应该不难。引入一下类内和间散度矩阵的知识:类间散度矩阵用于表示各样本点围绕均值的散布情况。类内散度矩阵用于表示样本点围绕均值的散步情况,关于特征选择和提取的结果,类内散布矩阵的积越小越好。具体可参考这里,还有这里。首先,我们来定义“类内散度矩阵”(within-class scatter matrix)“类间散度矩阵”(between-class scatter matrix):然后我们的J 可以表示为这样看起来简单多了,这就是我们的LDA想要最大化的目标函数,比较专业的说法为,S b 和S w 的“广义瑞利商”(generalizad Rayleigh quotient)。关于“广义瑞利商”(generalizad Rayleigh quotient)的解释,可以参考这里和这里。瑞利商经常出现在降维和聚类任务中,因为降维聚类任务往往能导出最大化最小化瑞利熵的式子,进而通过特征值分解的方式找到降维空间。大体内容如下:下面开始构建我们的函数及约束条件。由拉格朗日乘数法(具体可参考CCA中Lagrange的应用)可得,其中,λ \lambdaλ为拉格朗日乘子。LDA还可从贝叶斯决策理论的角度来描述(关于贝叶斯可参考这里),可证明,当两类数据同先验、满足高斯分布(正态分布)且协方差相等时,LDA可以达到最优的分类效果。上述讲了这么多都是二分类问题,那么关于多分类任务。具体线性判别分析LDA和Fisher判别分析原理及推广可看 —> 这里典型相关分析(CCA)从字面意义上理解CCA,我们可以知道,简单说来就是对不同变量之间做相关分析。较为专业的说就是,一种度量两组变量之间相关程度的多元统计方法。关于相似性度量距离问题,在这里有一篇Blog可以参考参考。首先,从基本的入手。当我们需要对两个变量X , Y进行相关关系分析时,则常常会用到相关系数来反映。学过概率统计的小伙伴应该都知道的吧。还是解释一下。相关系数:是一种用以反映变量之间相关关系密切程度的统计指标。相关系数是按积差方法计算,同样以两变量与各自平均值的离差为基础,通过两个离差相乘来反映两变量之间相关程度;着重研究线性的单相关系数。复习了一下大学本科概率统计知识,那么,如果我们需要分析的对象是两组或者多组向量,又该怎么做呢?CCA的数学表达:我们会得到一个这样的矩阵:这样的话,我们把每个变量的相关系数都求了出来,不知道会不会和我一样觉得这样很繁琐呢。如果我们能找到两组变量之间的各自的线性组合,那么我们就只分析讨论线性组合之间的相关分析。典型相关系数:是先对原来各组变量进行主成分分析,得到新的线性关系的综合指标,再通过综合指标之间的线性相关系数来研究原各组变量间相关关系。现在我们利用主成分分析(PCA)的思想,可以把多个变量与多个变量之间的相关转化成两个变量之间的相关。先得到两组变量( A T , B T )的协方差矩阵典型相关分析最朴素的思想:首先分别在每组变量中找出第一对典型变量,使其具有最大相关性,然后在每组变量中找出第二对典型变量,使其分别与本组内的第一对典型变量不相关,第二对本身具有次大的相关性。如此下去,直到进行到K步,两组变量的相关系被提取完为止,可以得到K组变量。So,具体典型相关分析CCA算法及故障诊断应用可看 —> 这里慢特征分析(SFA)提供输入-输出功能输出信号输出信号的各分量的均值和单位方差都为零,并且是不相关的。只有在测试信号对训练信号具有代表性的情况下,归一化才是准确的。输出信号也是如此由于实际原因,在步骤4和步骤5中使用了奇异值分解而不是PCA。对于一些特征值非常接近于零的退化数据,奇异值分解是一种较好的分析方法,然后在步骤4中丢弃这些特征值。非线性展开有时会导致退化数据,因为它产生高度冗余的表示,其中一些成分可能具有线性关系。一般来说,特征值接近于零的信号分量通常包含噪声,如舍入误差,在归一化后会非常迅速地波动和在任何情况下,SFA都不会在步骤5中选择。因此,决定哪些小组件应该被丢弃并不重要。具体慢特征分析SFA原理及应用可看 —> 这里非线性数据降维实际工业过程往往表现出复杂的特性,过程的非线性特性尤为突出,因此非线性数据降维方法在故障诊断领域得到了广泛的关注和应用。针对工业过程中存在的大量非线性过程,尤其是当输入的取值范围较大时,很多过程信息及这种非线性关系无法再被PCA描述。针对非线性恃征的故障诊断研究从九十年代发展至今,主要提出了以下几类方法:神经网络非线性方法;(Kernel)方法;流形学习(Maniford Learning)方法。神经网络非线性方法神经网络非线性PCA方法最早是有Kramer提出的,其模型是一个五层神经网络,输入和输出采用同一组数据。由于中间层神经元个数小于输入层的个数,实现了降维的效果。有作者指出该网络结构在线性情况下并不能保证与线性PCA等价,提出了一种改进的方法,即先计算出每个训练数据点的具有物理意义的主曲线的低维表示后,再使用两个三层神经网络分别实现降维和重反构映射;有学者引入核概率密度函数研究了非线性PCA中主元不服从正态分布的问题;有学者研究了非线性过程数据含有的动态性问题。其中神经网络还可结合LDA、ICA、SFA、CCA等上述线性方法,这里就不再展开啦!~~这里只以神经网络加入PCA方法为例。但是针对神经网络(NN)加入PCA的方法,从实际上来讲目前任然存在很多的问题,首当其冲的就是整个神经网络的训练复杂度,会很高,提高成本,在实际工业生产中的数据并不是完整的,会存在样本的不均衡和故障样本的缺失或样本量极少,所以,整个模型的泛化能力不是很好或者说是难以保证。怎样确定整个神经网络模型的结构及对应生产工况数据的规模,优化算法,效率及在线功能实现,保证学习样本的完整性和价值问题仍未得到解决,故对于此类加入神经网络的降维方法,不是很看好,简单来说就是——太玄了!核(Kernel)方法核方法是将数据的原始输入空间非线性地变换到一个高维的核特征空间后、再使用线性技术的一种间接处理方法。最开始将线性推广至非线性的为支持向量机(SVM),后来又有了Kernel PCA用于人脸识别和语音识别,同时在过程监控领域也有了很大的研究进展,推动了过程监控故障诊断的进步,虽然有很多学者将核kernel应用到了非线性降维方法中来,但均存在着一个很重要的问题,就是核函数究竟该怎么选取。而且,对于加入核函数的方法,仅仅依赖于反映数据中的非线性,在其降维用的目标函数中没有考虑到保持其数据结构的完整性,甚至存在将数据强行变为非线性结构的缺陷,由此,此种方法并不是很好,还需要进一步的研究和改善。线性核函数当不需要在特征空间进行运算时,可以使用线性核函数。如果原始数据已经是高维且可进行比较,在输入空间中线性可分。线性内核适用于由大量固定长度的特征数据表示的对象。高斯核函数高斯核函数其又称作——Square exponential kernel(SE Kernel )or radial basis function(RBF,径向基函数),其形如:其中,Σ 表示的是输入样本的每个特征数据所对应的协方差,P维数据矩阵。当Σ 是对角矩阵时,为该核函数的特征空间的维度是无限的。核函数避免转换函数的计算,故可用相对马氏距离来机选n阶的Gram方阵,即使已经将隐式的将对象投影到无限维度的特征空间中去,依旧有效。流行学习方法流形学习是非线性降维的重要研究领域,也是近些年来,利用流行学习方法进行特征提取和故障诊断的一种新的探索,并受到了广泛的关注。流形(manifold)是一般几何对象的总称,包括各种维度的曲线与曲面等,和一般的降维分析一样,流形学习是把一组在高维空间中的数据在低维空间中重新表示。不同之处是,在流形学习中假设:所处理的数据采样与一个潜在的流形上,或者说对于这组数据存在一个潜在的流形。流形上的点本身是没有坐标的,所以为了表示这些数据点,我们把流形放入到外围空间(ambient space),用外围空间上的坐标来表示流形上的点,例如三维空间 R中球面是一个2维曲面,即球面上只有两个自由度,但我们一般采用外围空间R^3 空间中的坐标来表示这个球面。流形学习 = 微分流形 + 黎曼几何流行学习可以概括为:在保持流形上点的某些几何性质特征的情况下,找出一组对应的内蕴坐标(intrinsic coordinate),将流形尽量好的展开在低维平面上,这种低维表示也叫内蕴特征(intrinsic feature),外围空间的维数叫观察维数,其表示叫自然坐标,在统计上称为observation。(引用自此Blog)LLE(Locally Linear Embedding) 局部线性嵌入LLE算法是在2000年被S.T.Roweis和L.K.Saul提出来的非线性降维方法,它的基本思想是将全局非线性转化为局部线性,而互相重叠的局部邻域能够提供全局结构的信息,这样对每个局部进行线性降维后,在按照某种规则将结果组合在一起,就能够得到低维的全局坐标表示。LLE算法有一个前提假设:采样数据所在的低维流形在局部是线性的,即每个采样点可以用它的近邻点线性表示。这个假设可以由最终结果的有效性上得到证明。该算法的学习目标是:在低维空间中保持每个邻域中的权值不变,即假设嵌入映射在局部是线性的条件下,最小化重构误差。上图为LLE算法的运行步骤主要步骤:寻找每个样本点的k个近邻点;由每个样本点的近邻点计算出该样本点的局部重建权值矩阵由该样本点的局部重建权值矩阵和其近邻点计算出该样本点的输出向量具体的详细计算步骤就不放这里了,有一个大佬的写的不错,这跳转这里LE (Laplacian Eigenmaps) 拉普拉斯特征映射拉普拉斯特征映射(Laplacian Eigenmaps,LE)也是一种局部的流行学习方法,和LE的方法有点相似,LE算法也具有直观降维的目标函数,也就是说,通过保持了高维数据之间的近邻关系来得到低维度数据流行结构。LE算法的主要有以下四步:LPP(Locality Preserving Projection) 局部保留投影局部保留投影LPP算法提出的目的是为了实现非线性流形的学习和分析,LPP可以提取最具有判别性的特征来进行降维,是一种保留了局部信息,降低影响图像识别的诸多因素的降维方法,这种算法本质上是一种线性降维方法,由于其巧妙的结合了拉普拉斯特征映射算法(LE)的思想,从而可以在对高维数据进行降维后有效地保留数据内部的非线性结构。与其他非线性降维方法相比,LPP方法可以将新增的测试数据点,通过映射在降维后的子空间找到对应的位置,而其他非线性方法只能定义训练数据点,无法评估新的测试数据。LPP方法可以很容易地将新的测试数据点根据特征映射关系(矩阵),投影映射在低维空间中。将 n 维原数据映射为 l 维数据,l<< n ;实现数据降维,样本个数为m 。(引用此大佬)
最近研究二次判别分析(Quadratic Discriminant Analysis,QDA),发现运用到了交替方向乘数法(ADMM),就很迷。(关键是太菜)很多博主都是直接翻译或者搬运的,搜罗且了解了很多相关知识,那就来个大总结及其一些自己的想法吧!(内力有限,仅供学习交流)确实很难,理论性很强,没有虚的,阅读完内容需要有“勇气”!ADMM背景咱们先来了解了解,ADMM到底是个什么东西?交替方向乘数法(Alternating Direction Method of Multipliers),从字面意思上理解,交替方向?是不是很迷?交替计算?交替求解?。。。难道是对偶问题?对偶求解?先不管了,再看后半句,乘数法?咦~是不是感觉有点熟悉。la.la.la…Lagrange乘数法???(没错,就是Lagrange,直接干起来,等等,这里只说对了一半,具体咱们下面慢慢道来~)ADMM是一个不算是太新的算法,其实就是一种求解优化问题的计算框架, 适用于求解分布式凸优化问题,特别是统计学习问题。 ADMM 通过分解协调(Decomposition-Coordination)过程,将大的全局问题分解为多个较小、较容易求解的局部子问题,并通过协调子问题的解而得到大的全局问题的解。简单的理解就是,整个算法只是整合许多不少经典优化思路,然后结合现代统计学习所遇到的问题,提出了一个比较一般的比较好实施的分布式计算框架。而他的历史可以追溯到看下面:ADMM 最早分别由 Glowinski & Marrocco 及 Gabay & Mercier 于 1975 年和 1976年提出,并被 Boyd 等人于 2011 年重新综述并证明其适用于大规模分布式优化问题。由于 ADMM的提出早于大规模分布式计算系统和大规模优化问题的出现,所以在 2011 年以前,这种方法并不广为人知。作为搞自动化、控制、优化、诊断…的本菜来说,当然是奔着优化求解去学习的。先来看看一个大佬对目前大数据及其优化的见解,简直是一针见血,说出来我的心声:业界一直在谈论大数据,对于统计而言,大数据其实意味着要不是样本量增加n → ∞ ,要不就是维度的增加p → ∞,亦或者两者同时增加,并且维度与样本量的增长速度呈线性或者指数型增长。在稀疏性的假设条件下,再加上一些正则性方法,统计学家可以证明各种加penalty的模型所给出的参数估计具有良好的统计性质,收敛速度也有保证,同时还会给出一些比较好的迭代算法,但是,他们并没有考虑真实环境下的所消耗的计算时间。虽然统计学家也希望尽量寻求迭代数目比较少的算法(比如one-step估计),但是面对真实的Gb级别以上的数据,很多时候我们还是无法直接用这些算法,原因是一般的硬件都无法支撑直接对所有数据进行运算的要求。如果想减少抽样误差,不想抽样,又想提高估计的精度,那么还是需要寻求其他思路,结合已有的模型思想来解决这些问题。在目前条件下,并行化、分布式计算是一种比较好的解决思路,利用多核和多机器的优势,这些好算法便可以大规模应用,处理大数据优势便体现出来了。对于统计而言,数据量越大当然信息越可能充分(假设冗余成分不是特别多),因为大样本性质本身就希望样本越多越好嘛。—源自此处还需要知道的一点,我们都知道搞优化会遇到很多问题,无非是数据量上和维度的变化,关键词大都为:降维,收敛,迭代等等,而这里的ADMM算法不同于那些梯度下降法或其他改进的SGDM、RMSProp、Adam等等更多高级算法,应用的大多为以GB级别的数据量的数据集,如果与SGDM、Adam这些算法在同样的低维数据(这里指的是较GB级别低的)进行比较,收敛速度绝壁没它们好,很慢,实际的收敛速度往往比那些算法慢得多。ADMM的主要应用,主要是在解空间规模非常大的情况下(比如X、Y 都是存储空间上GB的超大规模矩阵),这个时候很多传统的方法不好用,强制需要分块求解,而且对解的绝对精度往往要求也没那么高。所以我觉得这是,需要提前知道的一点。确实,这个算法很难理解,公式也很难,不敢保证,我能将其解释清楚,抱着互相学习的态度写这篇Blog!(望各位大佬批评指正)具体结构,从ADMM需要用到的背景知识、ADMM原理、具体应用这几块进行解释。下面咱们从基本框架结构入手吧~背景知识《Distributed Optimization and Statistical Learning via the Alternating Direction Method of Multipliers》文章中提到了一些预备知识,学过最优化或最优估计等优化课程的童鞋应该能够很快能够理解,对偶问题若很陌生的小伙伴,可以补充补充相关的知识。先来了解一些基本算法思想吧~对偶上升对于凸函数的优化问题,对偶上升法核心思想就是引入一个对偶变量,然后利用交替优化的思路,使得两者同时达到optimal。读到这里,让我们想起咱们的主题,“交替方向”,是不是有点感觉了。对于凸函数,我们只需要知道,凸优化问题有一个良好的性质即:局部最优解便是全局最优解对凸函数有不解的地方,可看这位大佬的博客。一个凸函数的对偶函数其实就是原凸函数的一个下界,因此可以证明一个较好的性质:在强对偶性假设下,即最小化原凸函数(primal)等价于最大化对偶函数(dual),两者会同时达到optimal。这种转化可以将原来很多的参数约束条件变得少了很多,以利于做优化。具体表述如下:对于对偶问题有所不解的,可以简单理解成为原函数是Y关于X的函数,那么对偶的函数则为X关于Y的函数,这样理解是不是更容易一点呢。在强对偶的假设下,原问题和对偶问题的解都是一样的,同时达到最优。什么是强对偶性?就是指原问题的解与对偶问题的解是相同的,也即是:arg 是变元(即自变量argument)的英文缩写。arg min 就是使后面这个式子达到最小值时的变量的取值>arg max 就是使后面这个式子达到最大值时的变量的取值假如g ( y )可求其导数,那么利用梯度上升法,交替更新参数,使得同时收敛到最优。迭代如下:对偶分解虽然对偶上升的方法有所缺陷,导致我们在实际操作中会遇到重重困难。但是世界万物都是存在着两面,有其弊也有其利,就如下面的太极双鱼图那么,我们可以利用其优秀的一面,当目标函数 f 是可分的(separable)时候(参数亦或feature可分),整个问题可以拆解成多个子参数问题,分块优化后汇集起来整体更新。这也就是快接近咱们的主题了,分布式凸优化问题。我们可以分块,然后并行化处理。由此,我们可分离的目标函数为:对偶分解是非常经典的优化方法,可追溯到1960年代。这种思想对后面的分布式优化方法影响较大,比如近期的graph-structure优化问题。(具体可自行查询一下下)增广的拉格朗日乘数法反正,记住一点即可:增加惩罚项,扩大约束条件的容纳范围,放松假设条件。可使其收敛的更快。那么,增加惩罚项的拉格朗日项为:其中,最后加了的L2正则化,二范数,也就是岭回归优化项就是惩罚项。ρ 则为我们的松弛因子(惩罚系数),用于更加精细的调节扩大的范围边界。我们可以将其等价为优化的目标函数形式:我们增加的惩罚函数的好处是为了让对偶函数更具有可导性,更新参数的计算过程和对偶上升的一致。除最小化x 的时候加上惩罚项:ADMM算法原理在上述的层层递进的方法中,你是否也发现了其中的奥秘,对偶上升法解决了可分解性问题,增广乘子法解决了严格的凸函数限制条件,增强了收敛性。那么是否,我们可以将二者集合在一起,取其各自的优点呢?答案当然是肯定的,那就是ADMM算法,同时解决了将原函数进行分解和扩展函数的约束范围问题。使得f ( x ) f(x)f(x)能够适应于更多的更广泛的约束条件求解问题。结合两者的优点,就有了下式目标函数:从中,我们可以看出,优化后的目标函数增加了新的变量g ( z ),约束条件则增加了B z,可以看出,我们将原X 分解了,原始变量和目标函数都拆分开了,对于原论文中的解释,感觉有一些蹊跷。但简单的理解就是将最初的原始变量就拆分为x xx和z zz两个变量,这样在后面的优化求解中,就不需要在融合到一起,最后求解出来也是两个值,也即是从一开始就将其分解开来。保证了前面优化过程的可分解性。紧接着,我们的增广拉格朗日项:和上面的增广拉格朗日一样,只不过增加了新的变量z 而已。于是ADMM的优化就变成了如下序贯型迭代(这正是被称作alternating direction交替方向的缘由):可以看出,每次迭代分为三步:求解与 x 相关的最小化问题,更新变量 x 求解与 z 相关的最小化问题,更新变量 z 更新对偶变量 u ADMM名称中的“乘子法”是指这是一种使用增广拉格朗日函数(带有二次惩罚项)的对偶上升(Dual Ascent)方法,而“交替方向”是指变量 x 和 z 是交替更新的。两变量的交替更新是在 f ( x )或 g ( z )可分时可以将优化问题分解的关键原因。到此,通过以上的内容来理解“交替方向乘数法(ADMM)”是不是就豁然开朗了许多,开篇说很难,其实是不是并没有那么的难。当然,写成这种形式有利于后面简化优化问题,也可不作任何的处理。具体应用大佬回答及点评ADMM( Alternating Direction Method of Multipliers)算法是机器学习中比较广泛使用的约束问题最优化方法,它是ALM算法的一种延伸,只不过将无约束优化的部分用块坐标下降法(block coordinate descent,或叫做 alternating minimization)来分别优化。产生这种方法主要是为了弥补二次惩罚的缺点。在一些问题当中,用二次惩罚来近似约束问题在最优点附近需要惩罚项的系数趋近于无穷,而这种要求会使得海森矩阵很大,因此近似的目标函数很不稳定。为了解决这个问题,引入了线性逼近的部分,通过线性项系数不断的接近最优解(对偶上升),使得在二次惩罚项的系数很小的情况下,也能得到满足要求精度的解。ADMM目前是比较成熟,比较受欢迎的约束问题最优化通用框架。(引用源自知乎大佬)受约束的凸优化问题一般的受约束的凸优化问题可以写成如下形式:可将此类型写成ADMM形式,增加新变量,以分解原始变量:相应的增广拉格朗日项为:其中的 g 函数即 C 的示性函数,上述是scaled形式,那么具体算法就是:示性函数,顾名思义,是表示自变量性态的一个函数。统计学习中的应用统计学习问题也是模型拟合问题(我们知道有拟合和过拟合),可表示为:对于带L1正则化项的线性回归(Lasso),其平方损失函数为对于逻辑回归(Logistic Regression),其极大似然损失函数为对于线性支持向量机(Linear Support Vector Machine),其合页(Hinge)损失函数为将训练数据在其原始样本M维度下将其划分为N块:由此我们可得到分块的目标函数来实现分布式计算:相应的简洁迭代更新D 、 d 、 x D、d、xD、d、x的计算方式为:个人见解最后说两句,虽然优化算法千千万,在不同时期,随着科技的发展与进步,老的算法暂时过时,新的算法逐步崛起,但终归要落实到实际应用当中才是真正的好算法,并不是说一味的提高求解速度,提高精度,有些时候成本会很高,有些时候老的算法会被拾起成为yyds,新的算法未必就好。终究说来,希望能够有更多更实际应用范围更加广泛的优化算法逐步崛起吧~
⚡终于!!!⚡终于又有时间学习Deep Learning了⚡!30天ML计划,一起加油!!!https://blog.csdn.net/weixin_44333889/category_11271153.html《专栏》在训练NN的时候,有哪些Optimizers可以优化更快的找到global Minima?下面我们来看下有哪些方法可以优化求解。Background在训练神经网路的时候,最开始我们是用的Gradient Descent(梯度下降法,GD)来求解,但是会出现很多问题,面临大量的数据的时候,GD会出现local Minima,而且求解速度会下降。关于GD+Momentum,可以看这个介绍简单易懂。整个技术的发展路线如下:SGD 【Cauchy,1847】SGD with momentum 【Rumelhart,et al.,Nature’1986】上面两个是远古时期的优化求解方法,其实放到现在来看,依旧还是很有效果。如下面这些就是SGDM训练出来的,目前比较常用的是下面三个Optimizers:Adagrad 【Duchi,et al. JMLR’11 2011】RMSProp 【Hinton,et al. Lecture slides, 2013】Adam 【kingma,et al. ICLR’15 2014】借用一下李老师(台大,李宏毅)的PPT。SGD,stochastic gradient descent。也就是最普通的方法,如下图所示AdagradAdagrad(自适应梯度算法)。其基本思想是,对每个参数theta自适应的调节它的学习率,自适应的方法就是对每个参数乘以不同的系数,并且这个系数是通过之前累积的梯度大小的平方和决定的,也就是说,对于之前更新很多的,相对就可以慢一点,而对那些没怎么更新过的,就可以给一个大一些的学习率。Adagrad算法:以上就为Adagrad算法的内容。Python实现代码:import numpy as np class Adagrad: def __init__(self, learning_rate=0.01): self.learning_rate = learning_rate # 学习率设置为0.01 self.fg = None self.delta = 1e-07 # 设置1e-07微小值避免分母为0 def update(self, params, grads): # 更新操作 if self.fg is None: self.fg = {} # 设为空列表 for key, value in params.items(): self.fg[key] = np.zeros_like(value) # 构造一个矩阵 for key in params.keys(): # 循环迭代 self.fg[key] += grads[key] * grads[key] params[key] -= self.learning_rate * grads[key] / (np.sqrt(self.fg[key]) + self.delta) RMSPropRMSProp算法实则为对Adagrad的一个改进,也就是把Adagrad对历史梯度加和变成了对历史梯度求均值,再利用这个均值代替Adagrad累加的梯度和对当前梯度进行加权,并用来update更新。用均值代替求和是为了解决Adagrad的学习率逐渐消失的问题。图片源自网络)有位大佬的解释更加清晰,可跳转此处。def RMSprop(x, y, step=0.01, iter_count=500, batch_size=4, alpha=0.9, beta=0.9): length, features = x.shape data = np.column_stack((x, np.ones((length, 1)))) w = np.zeros((features + 1, 1)) Sdw, v, eta = 0, 0, 10e-7 start, end = 0, batch_size # 开始迭代 for i in range(iter_count): # 计算临时更新参数 w_temp = w - step * v # 计算梯度 dw = np.sum((np.dot(data[start:end], w_temp) - y[start:end]) * data[start:end], axis=0).reshape((features + 1, 1)) / length # 计算累积梯度平方 Sdw = beta * Sdw + (1 - beta) * np.dot(dw.T, dw) # 计算速度更新量、 v = alpha * v + (1 - alpha) * dw # 更新参数 w = w - (step / np.sqrt(eta + Sdw)) * v start = (start + batch_size) % length if start > length: start -= length end = (end + batch_size) % length if end > length: end -= length return w Adam最后讲讲Adam(自适应矩估计 Adaptive moment estimation),因为目前是比较强的,下面这些都是由Adam训练出来的,看一下Adam和SGDM的准确率对比(源自论文)由于Adam的提出的地方有一些突兀,并非在论文或会议,能找到的最原始的出处也只有下面了,看一下他的更新方式吧,相当于一个优化参数的更新模块。Adam 的Python代码有大佬已经开源了:https://github.com/yzy1996/Python-Code/blob/master/Algorithm/Optimization-Algorithm/Adam.pyhttps://github.com/sagarvegad/Adam-optimizer/blob/master/Adam.py如果不想转链接,这里直接附上了:import math alpha = 0.01 beta_1 = 0.9 beta_2 = 0.999 # 初始化参数的值 epsilon = 1e-8 def func(x): return x*x -4*x + 4 def grad_func(x): # 计算梯度 return 2*x - 4 theta_0 = 0 # 初始化向量 m_t = 0 v_t = 0 t = 0 while (1): # 循环直到它收敛 t+=1 g_t = grad_func(theta_0) # 计算随机函数的梯度 m_t = beta_1*m_t + (1-beta_1)*g_t # 更新梯度的移动平均线 v_t = beta_2*v_t + (1-beta_2)*(g_t*g_t) # 更新平方梯度的移动平均线 m_cap = m_t/(1-(beta_1**t)) # 计算偏差校正后的估计 v_cap = v_t/(1-(beta_2**t)) # 计算偏差校正后的估计 theta_0_prev = theta_0 theta_0 = theta_0 - (alpha*m_cap)/(math.sqrt(v_cap)+epsilon) # 更新参数 if(theta_0 == theta_0_prev): # 检查是否收敛 break总而言之,这个优化器目前是处于机器学习中最强的优化地位。其实,对于不同的数据集或许会有所偏差,在不同的优化时间段,前中后期,各个优化器的准确率会有所波动,如下(源自论文)准确率测试图:所以,不经感叹道,搞优化求解,真的是一门玄学啊,老的方法不一定在现在没有用,新的方法不一定适用于所以场景,找到最适合的方法才是真的有效的。相信在科技如此发达的现在及以后,会有更多的优化求解算法,推进人类进步,而不仅仅是从硬件上提升运算速度。
在故障诊断中,我们常常会面对大量的且维数很高的数组,通过我们需要先对数据集进行划分及预处理,而预处理阶段极为重要的一步就是对数据进行降维特征提取,通过某种数学变换将原始高维空间转变成一个低维的子空间。然鹅,我们常用到的基本就只有两个,一个是主成分分析(PCA),另一个则是今天所要介绍的Fisher判别分析(Fisher Discriminant Analysis,FDA)。主成分分析的基本思想:设法将原来众多具有一定相关性(比如P个指标,即主成分),重新组合成一组新的互相无关的综合指标来代替原来的指标。通过寻找在最小均方误差(Mean Square Error,MSE)下的最具代表性的投影向量,再用这些向量来表示数据。Fisher判别分析的基本思想:利用已知类别的样本建立判别模型,对未知类别的样本进行分类。在最小均方误差(也就是最小二乘法MSE)意义下,寻找最能分开各个类别的最佳方向。最先的是提出的线性判别法(Linear Discriminant Analysis,LDA),这还是一种经典的线性学习方法。在降维方面LDA是最著名的监督学习降维方法。但是,在二分类问题上,因为最早是有(Fisher,1936)提出的,因此也被称为是“Fisher判别分析(Fisher Discriminant Analysis,FDA)”。其实LDA和FDA两种判别分析方法,是略有不同的。其中LDA则假设了各类样本数据的协方差矩阵相同,且满秩。线性判别分析(LDA)及Fisher判别分析(FDA)LDA的思想:由所给定的数据集,设法将样例数据投影在一条直线上,使得同类数据的投影点尽可能的接近、而异类数据的投影点之间将可能间隔更远。在我们做新样本数据的分类时,将其投影到同样的直线上,再根据投影点的位置来确定新样本的类别。如下图(源自周志华《机器学习》)所示:这里的投影直线也用到了最小二乘的思想,所有数据样本垂直投影在直线上,只是我们的约束条件表为了不同数据样本之间的投影在直线上的距离度量。我们需要寻找到在投影方向w ww上,使得数据样本满足两个条件:1) 相同数据之间投影距离最小;2)不同数据之间投影点位置最大(可通过求其不同数据的投影中心点来判别)LDA二维示意图图中,“+”和“-”代表的是两种不同的数据簇,而椭圆表示数据簇的外轮廓线,虚线表示其投影,红色实心圆●和红色实心三角形△分别代表的两类数据簇投影到w ww方向上的中心点。为什么说这里是一维空间呢?可以看上图,假设每个样本都是d维向量(上图为二维x 1 、 x 2 坐标系)。现在就简单一点,想用一条直线w ww表示这些样本,称之为样本集合的一维表达。所以这里说的一维讲的是投影到一条直线上以后的数据,在直线上是属于一维空间表达的。下面思考另一个问题,如何让同类的数据样本投影点尽可能的靠近,而使得不同样本投影点离得更远呢?这里需要引入协方差的概念,小小复习一下协方差及样本方差的知识(因为本菜鸡数学基础差)协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。上面的Σ 0 、 Σ 1因为是自协方差也就是代表方差(也即为样本方差)。方差:当数据分布比较分散(即数据在平均数附近波动较大)时,各个数据与平均数的差的平方和较大,方差就较大;当数据分布比较集中时,各个数据与平均数的差的平方和较小。总的说来:方差越大,数据的波动越大;方差越小,数据的波动就越小。协方差表示的是两个变量的总体的误差,这与只表示一个变量误差的方差不同。 如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。 如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。简而言之:两个变量之间差距越大,协方差就越小;相反,两个变量越相似变化趋势一致,则协方差越大。复习完协方差、样本方差的知识后,解决上面的问题应该不难。引入一下类内和间散度矩阵的知识:类间散度矩阵用于表示各样本点围绕均值的散布情况。类内散度矩阵用于表示样本点围绕均值的散步情况,关于特征选择和提取的结果,类内散布矩阵的积越小越好。具体可参考这里,还有这里。首先,我们来定义“类内散度矩阵”(within-class scatter matrix)“类间散度矩阵”(between-class scatter matrix):然后我们的J 可以表示为关于“广义瑞利商”(generalizad Rayleigh quotient)的解释,可以参考这里和这里。瑞利商经常出现在降维和聚类任务中,因为降维聚类任务往往能导出最大化最小化瑞利熵的式子,进而通过特征值分解的方式找到降维空间。大体内容如下:下面开始构建我们的函数及约束条件。由拉格朗日乘数法(具体可参考CCA中Lagrange的应用)可得,其中,λ \lambdaλ为拉格朗日乘子。LDA还可从贝叶斯决策理论的角度来描述(关于贝叶斯可参考这里),可证明,当两类数据同先验、满足高斯分布(正态分布)且协方差相等时,LDA可以达到最优的分类效果。上述讲了这么多都是二分类问题,那么关于多分类任务。LDA推广(多分类任务)其中,μ \muμ代表所有示例的均值向量。其中,同理,这里的μ i也代表每一类的均值向量。由上式可得到,上式可由如下的广义特征值问题求解:注意:这里的W 和上面二分类问题时的w 相同,W 则是多类问题下的投影直线。故我们需要找到这样在多个类下使得满足第一部分的约束条件的直线W 。从上图中可容易理解PCA和LDA。可看出PCA多满足高斯分布,投影了最具代表性的主成分分量;而LDA如上所述,投影下来使其更容易区分出各类别之间的最佳方向。
随着对数据驱动的工业检测与诊断方法的逐步深入,过程监测的多元统计需要总结的东西越来越多,那么今天来整理一下。内容较多,理论较复杂,建议细品,你品!最好推一遍~It’s time to conclude PLS!!!PCA和偏最小二乘(PLS)是从数据中描述正常情况的首选方法。天气热,冰凉一下吧~偏最小二乘法(PLS)基本原理偏最小二乘多用于寻求两个矩阵(X和Y)的基本关系,也就是一种在这两个向量空间中对协方差结构建模的隐变量方法。偏最小二乘模型将试图找到X空间的多维方向来解释Y空间方差最大的多维方向。偏最小二乘回归特别适合当预测矩阵比观测的有更多变量,以及X的值中有多重共线性的时候。通过投影预测变量和观测变量到一个新空间来寻找一个线性回归模型。公式偏最小二乘回归 ≈ ≈≈ 多元线性回归分析 + ++ 典型相关分析 + ++ 主成分分析特点与传统多元线性回归模型相比,偏最小二乘回归的特点是:(1)能够在自变量存在严重多重相关性的条件下进行回归建模;(2)允许在样本点个数少于变量个数的条件下进行回归建模;(3)偏最小二乘回归在最终模型中将包含原有的所有自变量;(4)偏最小二乘回归模型更易于辨识系统信息与噪声(甚至一些非随机性的噪声);(5)在偏最小二乘回归模型中,每一个自变量的回归系数将更容易解释。在计算方差和协方差时,求和号前面的系数有两种取法:当样本点集合是随机抽取得到时,应该取1/(n-1);如果不是随机抽取的,这个系数可取1/n。在过程监控中,PLS类型的监控,包括非线性PLS,使用质量数据指导过程数据的分解,并提取与产品质量最相关的潜在变量。由于使用了质量数据,在质量相关性方面的诊断能力得到了增强,误报率降低。首先让我们回顾一下 CCA 的知识。在CCA中,我们将X和Y分别投影到直线得到U和V,然后计算u和v的Pearson系数(也就是Corr(u,v)),认为相关度越大越好。形式化表示:关于CCA的缺点:对特征的处理方式比较粗糙,用的是线性回归来表示U和X的关系,U也是X在某条线上的投影,因此会存在线性回归的一些缺点。我们想把PCA的成分提取技术引入CCA,使得U和V尽可能更多的携带样本的最主要信息。Most important thing!CCA是寻找X和Y投影后U和V的关系,通过系数矩阵求其最优解使得R ( U , V )最大,显然不能通过该关系来还原出X和Y,也就是找不到X到Y的直接映射。这也是使用CCA预测时大多配上KNN的原由吧。(关于KNN算法后续本菜研究后更新)PLS兼顾了PCA和CCA,解决了X和Y在投影上映射问题PLS算法简而言之,为了实现偏最小二乘回归的基本思想,要求p1和q1的协方差最大,即求解下面优化后的目标函数:看似比CCA的简单,这里附上CCA的目标函数:上面CCA是一次求解的过程,而我们的PLS回归只是对目前的第一主成分做了优化计算,剩下的主成分还得再计算。关于优化的目标求解的办法,和CCA一样,也是引用了拉格朗日乘数法来求解。(下面给出详细计算步骤)首先,引入拉格朗日乘子:PLSR 回归算法让我们回到上面的介绍,从新建立我们的回归方程:这里的c cc和d dd不同于上面的p 和q ,但是它们之间有一定联系,待会下面证明。其中,E 和G 是残差矩阵。然后,进行以下几步操作:手绘大致流程图PLS 模型虽然类似PCA的过程监控可以检测和诊断过程数据中的异常情况,但它无法判断检测到的异常情况是否会导致产品质量问题。这是PCA从业者经常提出的投诉,如监测和干扰警报,若检测到的过程故障最终不会导致质量问题,则会发生。为了检测与质量相关的过程问题,PLS模型用于利用质量输出数据中的信息划分输入数据空间,如下图所示。PLS还将输入空间划分为以PLS分数为特征的主子空间和与分数互补的剩余子空间。早期文献表明,主子空间由T2监控,T2被认为反映了与Y相关的主要变化,剩余子空间由Q监控,Q被认为包含与输出Y无关的变化。CPLS 模型(潜在结构的并行投影)最近读的一篇Paper提出了一种并行PLS(CPLS)算法和相关监测指标,以提供对输出变化的完整监测,并将输入数据空间简洁地分解为输出相关子空间和输入相关子空间。下面具体介绍模型建立的思路。为了提供质量数据和过程操作数据的完整监控方案,提出了一种并行PLS(CPLS)模型,以实现三个目标:(i)从标准PLS投影中提取与输出的可预测变化直接相关的分数,形成协变量子空间(CVS)(ii)将不可预测的输出变化进一步投影到输出主子空间(OPS)和输出剩余子空间(ORS),以监测这些子空间中的异常变化;和(iii)将与预测输出无关的输入变化进一步投影到输入主子空间(IPS)和输出子空间(IRS),以监测这些子空间中的异常变化。基于CPLS算法,数据矩阵X和Y分解如下:
Distance ClassificationDistance欧氏距离(Euclidean Distance)闵可夫斯基距离(Minkowski distance)曼哈顿距离(Manhattan distance)切比雪夫距离 ( Chebyshev distance )标准化欧氏距离(Standardized Euclidean distance )马氏距离(Mahalanobis Distance)汉明距离(Hamming distance)余弦相似度(Cosine Similarity)杰卡德相似系数(Jaccardsimilarity coefficient)ReferenceDistance由于最近在做故障诊断相关研究,不断学习各种算法,发现在很多算法里面都用到了Distance来定义各种变量之间的关系,确定之间的相关类指标。且在运用算法做分类时需要估不同样本之间的相似性度量(Similarity Measurement,SM),这时通常采用的方法就是计算样本间的“距离”(Distance)。在下面一 一道来!这可太有意思了,不经让我去寻找,究竟有多少种Distance可以运用在不同的算法里面呢?在不同算法里的计算方式是否有所不同?在计算效率上哪种Distance更优?哪种Distance在算法中运行速度更快,效果更好呢?什么Distance能够使得你的分类或聚类效果更加优秀呢?…针对太多了疑问和不解,那么现在开始做做Distance的相关解读吧!首先,了解一下距离计算(聚类分析)对于函数Dist( ; ),倘若它是一个“距离度量”(distance measure),则需要满足一些基本性质:欧氏距离(Euclidean Distance)相信欧氏距离(EuclideanDistance)是很多人都知道且用到的一个距离计算方法,且简单高效。在我们做聚类分析中常用的基于欧几里得距离的相似矩阵作为一种可行的方法。欧几里得简而言之,就是欧式空间中,两点之间的距离公式。在数学中,欧几里得距离或欧几里得度量是欧几里得空间中两点间“普通”(即直线)距离。使用这个距离,欧氏空间成为度量空间。相关联的范数称为欧几里得范数。较早的文献称之为毕达哥拉斯度量。欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。—来源于网络原理公式下面简述下计算公式:二维空间的公式其中,简单的说,就是求其二维平面上两点之间的模长。—>本人心得三维空间的公式和二维空间一样,只不过多加了一个坐标系的值再简单的说,同理就是求其三维平面上两点之间的模长。—>本人心得n维空间的公式将每个维度的求其模长。 及其不标准描述,别说我说的拓展内容:所谓欧氏距离变换,是指对于一张二值图像(在此我们假定白色为前景色,黑色为背景色),将前景中的像素的值转化为该点到达最近的背景点的距离。欧氏距离变换在数字图像处理中的应用范围很广泛,尤其对于图像的骨架提取,是一个很好的参照。应用层面欧氏距离看作信号的相似程度。 距离越近就越相似,就越容易相互干扰,误码率就越高。最近看了一篇 Paper,大佬级别的,引用率很高。讲的是关于欧几里得距离(欧氏距离)作为主成分分析(PCA)的相似性度量。理论性很强,本人菜鸡一个,目前读的有些老火,上传了网盘,论文可在这里下载【提取码:fvj2】。《Euclidean Distance as a Similarity Metric for Principal Component Analysis》–KIMBERLY L. ELMOREcite:[1] Elmore K L , Richman M B . Euclidean Distance as a Similarity Metric for Principal Component Analysis[J]. Monthly Weather Review, 2010, 129(3):540-549.闵可夫斯基距离(Minkowski distance)闵氏距离不是一种距离,而是一组距离的定义。是欧氏空间中的一种测度,被看做是欧氏距离的一种推广,欧氏距离是闵可夫斯基距离的一种特殊情况。闵氏空间指狭义相对论中由一个时间维和三个空间维组成的时空,为俄裔德国数学家闵可夫斯基(H.Minkowski,1864-1909)最先表述。他的平坦空间(即假设没有重力,曲率为零的空间)的概念以及表示为特殊距离量的几何学是与狭义相对论的要求相一致的。闵可夫斯基空间不同于牛顿力学的平坦空间。闵可夫斯基一个小故事:阿尔伯特·爱因斯坦在瑞士苏黎世联邦科技大学(Eidgen?ssische Technische Hochschule, ETH; Swiss Federal Institute of Technology)时期的数学老师赫尔曼·闵可夫斯基在爱因斯坦提出狭义相对论之后,于1907年将爱因斯坦与亨德里克·洛仑兹的理论结果重新表述成(3+1)维的时空,其中光速在各个惯性参考系皆为定值,这样的时空即以其为名,称为闵可夫斯基时空,或称闵可夫斯基空间。原理公式官方原理:闵氏距离有时也指时空间隔,关于时空间隔的内容可跳转看词条解释。设n维空间中有两点坐标x, y,v为常数,闵式距离定义为(1)闵氏距离与特征参数的量纲有关,有不同量纲的特征参数的闵氏距离常常是无意义的。(2)闵氏距离没有考虑特征参数间的相关性,而马哈拉诺比斯距离解决了这个问题。当v = 1可得到绝对值距离,也叫曼哈顿距离(Manhattan distance)、出租汽车距离或街区距离(city block distance)。在二维空间中可以看出,这种距离是计算两点之间的直角边距离,相当于城市中出租汽车沿城市街道拐直角前进而不能走两点连接间的最短距离。绝对值距离的特点是各特征参数以等权参与进来,所以也称等混合距离。当v → ∞得到切比雪夫距离,下面再做介绍。应用层面我们常常将属性划分为“连续属性”(continuous attribute)和“离散属性”(categorical attribute),前者在定义域上有无穷多个可能的取值,后者在定义域上式有限个取值。然而,在讨论距离计算的时候,属性上是否定义“序”关系更为重要。例如,定义域在{1,2,3}的离散属性和连续属性的性质更为接近一些,能直接在属性值上计算距离:“1”和“2”比较接近、与“3”比较远,这样的属性称为“有序属性”(ordinal attribute);而定义为{火车、飞机、船}这样的离散属性则不能直接在属性值上计算距离,称为“无序属性”(non-ordinal attribute)。在这里,闵可夫斯基距离可用于有序距离,连续属性亦成为“数值属性”(numerical attribute)离散属性亦成为“列名属性”(nominal attribute)简单总结:闵可夫斯基距离在面对离散数据集的时候则不适用,而对于有序数列数据集可用。—来自菜鸡解释,不对可忽略。曼哈顿距离(Manhattan distance)由上可知,在闵可夫斯基距离中,当v = 1时,可得到绝对值距离,也叫曼哈顿距离(Manhattan distance)、出租汽车距离或街区距离(city block distance)。同样也是由上面那位图片上的大佬创建的,这里就不放Photo了出租车几何或曼哈顿距离(Manhattan Distance)是由十九世纪的赫尔曼·闵可夫斯基所创词汇 ,是种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。原理公式官方解释很好理解(附上了)曼哈顿距离上图中红线代表曼哈顿距离,绿色代表欧氏距离,也就是直线距离,而蓝色和黄色代表等价的曼哈顿距离。曼哈顿距离——两点在南北方向上的距离加上在东西方向上的距离,即对于一个具有正南正北、正东正西方向规则布局的城镇街道,从一点到达另一点的距离正是在南北方向上旅行的距离加上在东西方向上旅行的距离,因此,曼哈顿距离又称为出租车距离。曼哈顿距离不是距离不变量,当坐标轴变动时,点间的距离就会不同。曼哈顿距离示意图在早期的计算机图形学中,屏幕是由像素构成,是整数,点的坐标也一般是整数,原因是浮点运算很昂贵,很慢而且有误差,如果直接使用AB的欧氏距离(欧几里德距离:在二维和三维空间中的欧氏距离的就是两点之间的距离),则必须要进行浮点运算,如果使用AC和CB,则只要计算加减法即可,这就大大提高了运算速度,而且不管累计运算多少次,都不会有误差。菜鸡理解:曼哈顿距离在处理大规模运算的时候,将一些需要用到浮点运算的地方(欧氏距离运算)换成加减运算,在处理器较强的现在,(不懂算法提速的我),或许还会提高运算速度(虽然没有试过,大胆假设一波,再去补补Paper)。在二维三维平面上本来走直线的,现在通过走曲折的“直线”减小计算难度,但增加了计算过程,最终的结果是使得运算速度提速了!!!很神奇煮个栗子吧现在请出灵魂画师此时的曼哈顿距离应用层面关于曼哈顿距离的应用,搜罗了大部分Paper,发现都是在计算机领域的应用较多,比如提高改进GPU运算性能、算法层面的性能提升、CV等等…太多了这里有几篇引用率且水平较高的Paper可读一读。本菜在不断摸索当中[1] Chang D J , Desoky A H , Ming O , et al. Compute Pairwise Manhattan Distance and Pearson Correlation Coefficient of Data Points with GPU[C]// 10th ACIS International Conference on Software Engineering, Artificial Intelligences, Networking and Parallel/Distributed Computing, SNPD 2009, in conjunction with 3rd International Workshop on e-Activity, IWEA 2009, 1st International Workshop on Enterprise Architecture Challenges and Responses, WEACR 2009, Catholic University of Daegu, Daegu, Korea, 27-29 May 2009. IEEE, 2009.[2] Mattausch H J , Omori N , Fukae S , et al. Fully-parallel pattern-matching engine with dynamic adaptability to Hamming or Manhattan distance[C]// VLSI Circuits Digest of Technical Papers, 2002. Symposium on. IEEE, 2002.[3] Oike Y , Ikeda M , Asada K . A high-speed and low-voltage associative co-processor with exact Hamming/Manhattan-distance estimation using word-parallel and hierarchical search architecture[J]. IEEE Journal of Solid-State Circuits, 2004, 39(8):1383-1387.深入了解后再细挖(待更新)。切比雪夫距离 ( Chebyshev distance )在数学中,切比雪夫距离(Chebyshev distance)或是L ∞ 度量,是向量空间中的一种度量,二个点之间的距离定义是其各坐标数值差绝对值的最大值。以数学的观点来看,切比雪夫距离是由一致范数(uniform norm)(或称为上确界范数)所衍生的度量,也是超凸度量(injective metric space)的一种。(—来自网络)最形象的一个比如应该当属“国际象棋”,相信有大部分人像本弱鸡一样不会下国际象棋,下面直接讲原理。原理公式国际象棋棋盘上二个位置间的切比雪夫距离是指王要从一个位子移至另一个位子需要走的步数。由于王可以往斜前或斜后方向移动一格,因此可以较有效率的到达目的的格子。下图是棋盘上所有位置距f6位置的切比雪夫距离。一维空间中,所有的Lp度量都是一样的------------(即为二坐标差的绝对值)。也即是,求其两点之间横纵坐标x , y对应差的绝对值,在选出最大的一个作为它们之间的切比雪夫距离。炒个栗子吧此时又得拿出灵魂画师的水准此时,(图片来自网络)因此平面的切比雪夫距离可以视为平面曼哈顿距离旋转再放大后的结果。应用层面关于切比雪夫距离,在聚类上有所用到,在图象识别领域,改进的切比雪夫相似性度量来替代聚类分析中现有的度量(如欧几里得和标准切比雪夫),通过改进的算法应用到医学的图像识别上,效果很好。所提出的措施产生最小的目标函数值,并在迭代次数最少时收敛。这里推荐一篇Paper.Mousa A , Yusof Y . An improved Chebyshev distance metric for clustering medical images[C]// American Institute of Physics Conference Series. AIP Publishing LLC, 2015:040020.标准化欧氏距离(Standardized Euclidean distance )标准欧氏距离的定义:标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。本菜理解:针对多维变量,将输入样本X XX进行标准化的欧式距离计算操作。原理公式首先,将各个分量都“标准化”到均值、方差相等。菜鸡理解:在这里的分量标准差s k ,言简意赅的理解就是,比如二维平面上两个点A(2,5),B(5,1),按照曼哈顿距离的方式看(当然是我类比),组成一个长方体(下图只花了一个三角形),黄色的线计算为欧氏距离的方式。但在这里我们要得到s k ,那么计算或许如下:应用层面在机器学习中,聚类用的标准化欧氏距离比较多,在面对求解长方形区域聚类的时候,普通的距离无法满足相似性度量,这是就得采用标准化欧氏距离来度量。这里推荐一本书。Chikodili N B , MD Abdulmalik, Abisoye O A , et al. Outlier Detection in Multivariate Time Series Data Using a Fusion of K-Medoid, Standardized Euclidean Distance and Z-Score[M]. 2021.马氏距离(Mahalanobis Distance)马氏距离(Mahalanobis distance)是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示点与一个分布之间的距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是,它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的),并且是尺度无关的(scale-invariant),即独立于测量尺度。(百科也很详细)生来清贫,没有头像,只留下一本书马氏距离(MahalanobisDistance)是度量学习中一种常用的距离指标,同欧氏距离、曼哈顿距离、汉明距离等一样被用作评定数据之间的相似度指标。但却可以应对高维线性分布的数据中各维度间非独立同分布的问题。(来自知乎大佬)原理公式什么是马氏距离?简单来说就是,作为一种距离的度量,可以看作是欧氏距离的一种修正,修正了欧式距离中各个维度尺度不一致且相关的问题。单个数据点的马氏距离数据点x , y之间的马氏距离其中Σ是多维随机变量的协方差矩阵,μ为样本均值,如果协方差矩阵是单位向量,也就是各维度独立同分布,马氏距离就变成了欧氏距离。应用层面马氏距离实际意义:那么马氏距离就能能干什么?它比欧氏距离好在哪里?再炒几个栗子欧式距离近就一定相似?先举个比较常用的例子,身高和体重,这两个变量拥有不同的单位标准,也就是有不同的scale。比如身高用毫米计算,而体重用千克计算,显然差10mm的身高与差10kg的体重是完全不同的。但在普通的欧氏距离中,这将会算作相同的差距。归一化后欧氏距离近就一定相似?当然我们可以先做归一化来消除这种维度间scale不同的问题,但是样本分布也会影响分类举个一维的栗子,现在有两个类别,统一单位,第一个类别均值为0,方差为0.1,第二个类别均值为5,方差为5。那么一个值为2的点属于第一类的概率大还是第二类的概率大?距离上说应该是第一类,但是直觉上显然是第二类,因为第一类不太可能到达2这个位置。所以,在一个方差较小的维度下很小的差别就有可能成为离群点。就像下图一样,A与B相对于原点的距离是相同的。但是由于样本总体沿着横轴分布,所以B点更有可能是这个样本中的点,而A则更有可能是离群点。算上维度的方差就够了?还有一个问题——如果维度间不独立同分布,样本点一定与欧氏距离近的样本点同类的概率更大吗?可以看到样本基本服从f(x) = x的线性分布,A与B相对于原点的距离依旧相等,显然A更像是一个离群点即使数据已经经过了标准化,也不会改变AB与原点间距离大小的相互关系。所以要本质上解决这个问题,就要针对主成分分析(PCA)中的主成分来进行标准化。马氏距离的几何意义上面搞懂了,马氏距离就好理解了,只需要将变量按照主成分进行旋转,让维度间相互独立,然后进行标准化,让维度同分布就OK了。由主成分分析可知,由于主成分就是特征向量方向,每个方向的方差就是对应的特征值,所以只需要按照特征向量的方向旋转,然后缩放特征值倍就可以了,可以得到以下的结果:离群点就被成功分离,这时候的欧式距离就是马氏距离。(很妙啊!)马氏距离的问题1.协方差矩阵必须满秩里面有求逆矩阵的过程,不满秩不行,要求数据要有原维度个特征值,如果没有可以考虑先进行PCA,这种情况下PCA不会损失信息2.不能处理非线性流形(manifold)上的问题只对线性空间有效,如果要处理流形,只能在局部定义,可以用来建立KNN图不能处理非线性流形(manifold)上的问题只对线性空间有效,如果要处理流形,只能在局部定义,可以用来建立KNN图汉明距离(Hamming distance)汉明距离是使用在数据传输差错控制编码里面的,汉明距离是一个概念,它表示两个(相同长度)字对应位不同的数量,我们以d ( x , y )表示两个字x , y之间的汉明距离。对两个字符串进行异或运算,并统计结果为1 11的个数,那么这个数就是汉明距离。理查德·卫斯里·汉明原理在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。例如:1011101 与 1001001 之间的汉明距离是 22143896 与 2233796 之间的汉明距离是 3“toned” 与 “roses” 之间的汉明距离是 3可视化的煮个栗子吧汉明距离多用于编码等信息论方面的计算,对于为什么上面的汉明距离结果为此,简单来看,拿出我灵魂画手工笔这样来看是不是更好理解一点呢。只需要从字符串中寻找出不同的项,不同项的数量就为之间的汉明距离。这里写了一个小的求汉明距离的Python封装代码(直接调用即可):def HammingDistance(x, y): """返回等长序列之间的汉明距离""" if len(x) != len(y): raise ValueError("对于长度不等的序列未定义") return sum(t1 != t2 for t1, t2 in zip(x, y))最小汉明距离例如:(00)与(01)的距离是1,(110)和(101)的距离是2。在一个码组集合中,任意两个编码之间汉明距离的最小值称为这个码组的最小汉明距离。最小汉明距离越大,码组越具有抗干扰能力。应用层面汉明距离更多的用于信号处理,表明一个信号变成另一个信号需要的最小操作(替换位),实际中就是比较两个比特串有多少个位不一样,简洁的操作时就是两个比特串进行异或之后包含1的个数。汉明距在图像处理领域也有这广泛的应用,是比较二进制图像非常有效的手段。计算一个数字的比特位包含1的个数有个小技巧:value &= value - 1这个运算的结果就是把value最后一个1去掉,循环进行运算直到value等于0(所有的1都被去掉)就可以知道vaule拥有多少个1了。其在包括信息论、编码理论、密码学等领域都有应用。但是,如果要比较两个不同长度的字符串,不仅要进行替换,而且要进行插入与删除的运算,在这种场合下,通常使用更加复杂的编辑距离等算法。(源自百科)在信号处理方面,本菜就不班门弄斧了据说,在机器学习领域中,汉明距离也常常被用于作为一种距离的度量方式。在LSH算法汉明距离也有重要的应用。具体还有待研究(待进一步深挖后 更新)余弦相似度(Cosine Similarity)为什么在这里会提到余弦?等等,这不是在学几何三角!虽然几何中夹角余弦可用来衡量两个向量方向的差异,但是我们在机器学习中借用这一概念来可以衡量样本向量之间的差异,从此进行相似性度量。原理公式在二维空间中向量A ( x 1 , y 1 )与向量B ( x 2 , y 2 ) 的夹角余弦公式:来自网络或许可以理解为:求空间中两点的余弦值,值越大表示两个向量的夹角越小,值越小表示两向量的夹角越大。从上图中可以看出,夹角越小代表两个向量点越相似,夹角越大代表两个向量的相似度越小。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。欧氏距离和余弦相似度的区别从上图可以看出距离度量衡量的是空间各点间的绝对距离,跟各个点所在的位置坐标(即个体特征维度的数值)直接相关;而余弦相似度衡量的是空间向量的夹角,更加的是体现在方向上的差异,而不是位置。如果保持A点的位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦相似度cosθ是保持不变的,因为夹角不变,而A、B两点的距离显然在发生改变,这就是欧氏距离和余弦相似度的不同之处。应用层面余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。(见此大佬转载更好的解释)关于对余弦相似度的应用,有以下见解:正如上所述,相比欧氏距离,余弦相似度计算更加注重的是在方向范围上的应用,对绝对数值是相当的不够敏感,在机器学习中,做聚类或分类的时候,针对多维不同特征,在数值上的联系是相当重要的,故本菜自认为可应用性不大。在对多层维度进行分析体现不同特征之间的差异时,欧式距离或标准化欧氏距离会更占优势。余弦在方向上区分不同特征的差异占优势,可对一些用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题。(这条我抄的别说了)吴军. 数学之美 系列 12 -余弦定理和新闻的分类.(一个比较好的栗子)http://www.google.com.hk/ggblog/googlechinablog/2006/07/12_4010.html杰卡德相似系数(Jaccardsimilarity coefficient)Jaccard index , 又称为Jaccard相似系数(Jaccard similarity coefficient)用于比较有限样本集之间的相似性与差异性。Jaccard系数值越大,样本相似度越高。原理公式官方定义:给定两个集合A,B,Jaccard 系数定义为A与B交集的大小与A与B并集的大小的比值,定义如下:当集合A,B都为空时,J(A,B)定义为1。与Jaccard 系数相关的指标叫做Jaccard 距离,用于描述集合之间的不相似度。Jaccard 距离越大,样本相似度越低。公式定义如下:其中对参差(symmetric difference):应用层面非对称二元属性的相似性在数据挖掘领域,常常需要比较两个具有布尔值属性的对象之间的距离,Jaccard距离就是常用的一种方法。给定两个比较对象A,B。A,B 均有n个二元属性,即每个属性取值为{0,1}。定义如下4个统计量:其中,Jaccard 系数:Jaccard距离:主要应用场景:1.比较文本相似度,用于文本查重与去重;2.计算对象间距离,用于数据聚类等。Python有相应的库包scipy.spatial.distance ,包含有杰卡德距离计算,可直接调用# scipy距离公式 from numpy import * import scipy.spatial.distance as dist matV = mat([[1,1,0,1,0,1,0,0,1], [0,1,1,0,0,0,1,1,1]]) print ("dist.jaccard:", dist.pdist(matV,'jaccard'))项目相似性度量是协同过滤系统的核心。 相关研究中,基于物品协同过滤系统的相似性度量方法普遍使用余弦相似性。 然而,在许多实际应用中,评价数据稀疏度过高,物品之间通过余弦相似度计算会产生误导性结果。 将杰卡德相似性度量应用到基于物品的协同过滤系统中,并建立起相应的评价分析方法。 与传统相似性度量方法相比,杰卡德方法完善了余弦相似性只考虑用户评分而忽略了其他信息量的弊端,特别适合于应用到稀疏度过高的数据。(引用自百科)
Elman神经网络近期开题,阅读到了一篇文章关于故障诊断的,其中用到了Elman神经网络,具体是结合EMD、PCA-SOM的Elman的性能评估/预测故障诊断,对Elman神经网络有点陌生,网上资源也讲的特别杂,来做个汇总Introduction吧!介绍Elman神经网络 是 J. L. Elman于1990年首先针对语音处理问题而提出来的,是一种典型的局部回归网络( global feed forward local recurrent)。Elman网络可以看作是一个具有局部记忆单元和局部反馈连接的递归神经网络。Elman网络具有与多层前向网络相似的多层结构。它的主要结构是前馈连接, 包括输入层、 隐含层、 输出层, 其连接权可以进行学习修正;反馈连接由一组“结构 ” 单元构成,用来记忆前一时刻的输出值, 其连接权值是固定的。在这种网络中, 除了普通的隐含层外, 还有一个特别的隐含层,称为关联层 (或联系单元层 ) ;该层从隐含层接收反馈信号, 每一个隐含层节点都有一个与之对应的关联层节点连接。关联层的作用是通过联接记忆将上一个时刻的隐层状态连同当前时刻的网络输入一起作为隐层的输入, 相当于状态反馈。隐层的传递函数仍为某种非线性函数, 一般为 Sigmoid函数, 输出层为线性函数, 关联层也为线性函数。----词条来自于百度百科Elman组成Elman神经网络是一种典型的动态神经网络,通常有四层:输入层、中间层(隐含层)、 承接层和输出层。输入层、隐含层和输出层的连接类似于前馈网络。输入层的单元只传输信号,输出层的单元具有线性加权的功能。隐层细胞的传递函数可以是线性函数,也可以是非线性函数。承接层又称为上下文层或状态层,用于记忆隐层的前一个时间步长输出,因此可以看作是一步时间延迟算子。Elman网络结构带反馈的的BP网络行程迟滞具有短期记忆功能(Figure来自于网络)Elman神经网络的特点是通过受体层的延迟和存储,隐层的输出与隐层的输入本身相连。这种自连接对其历史状态的数据非常敏感,内部反馈网络也增加了动态信息处理的能力,从而达到动态建模的目的。选择用历史训练的Elman神经网络同步预测,数据流程图如下图所示。Elman网络学习算法用BP算法进行权值修正,指标函数为误差平方和Matlab实例代码本实例是引用的《Matlab神经网络30个案例分析》中的一个,觉得很不错,就更新一下下!~内容较为古老,直接附上了,请多担待。电力负荷预测概述模型建立电力系统负荷数据具体数据及其源代码在我的GitHub上可下载:https://github.com/YurBro/Project-Code/tree/main/ElmanNNMatlab Code:%% 基于Elman神经网络的电力负荷预测模型研究 % % % <html> % <table border="0" width="600px" id="table1"> <tr> <td><b><font size="2">该案例作者申明:</font></b></td> </tr> <tr> <td><span class="comment"><font size="2">1:本人长期驻扎在此<a target="_blank" href="http://www.ilovematlab.cn/forum-158-1.html"><font color="#0000FF">板块</font></a>里,对<a target="_blank" href="http://www.ilovematlab.cn/thread-48362-1-1.html"><font color="#0000FF">该案例</font></a>提问,做到有问必答。</font></span></td></tr><tr> <td><span class="comment"><font size="2">2:此案例有配套的教学视频,配套的完整可运行Matlab程序。</font></span></td> </tr> <tr> <td><span class="comment"><font size="2"> 3:以下内容为该案例的部分内容(约占该案例完整内容的1/10)。</font></span></td> </tr> <tr> <td><span class="comment"><font size="2"> 4:此案例为原创案例,转载请注明出处(<a target="_blank" href="http://www.ilovematlab.cn/">Matlab中文论坛</a>,<a target="_blank" href="http://www.ilovematlab.cn/forum-158-1.html">《Matlab神经网络30个案例分析》</a>)。</font></span></td> </tr> <tr> <td><span class="comment"><font size="2"> 5:若此案例碰巧与您的研究有关联,我们欢迎您提意见,要求等,我们考虑后可以加在案例里。</font></span></td> </tr> <tr> <td><span class="comment"><font size="2"> 6:您看到的以下内容为初稿,书籍的实际内容可能有少许出入,以书籍实际发行内容为准。</font></span></td> </tr><tr> <td><span class="comment"><font size="2"> 7:此书其他常见问题、预定方式等,<a target="_blank" href="http://www.ilovematlab.cn/thread-47939-1-1.html">请点击这里</a>。</font></span></td> </tr></table> % </html> % %% 清空环境变量 clc; clear all close all nntwarn off; %% 数据载入 load data; a=data; %% 选取训练数据和测试数据 for i=1:6 p(i,:)=[a(i,:),a(i+1,:),a(i+2,:)]; end % 训练数据输入 p_train=p(1:5,:); % 训练数据输出 t_train=a(4:8,:); % 测试数据输入 p_test=p(6,:); % 测试数据输出 t_test=a(9,:); % 为适应网络结构 做转置 p_train=p_train'; t_train=t_train'; p_test=p_test'; %% 网络的建立和训练 % 利用循环,设置不同的隐藏层神经元个数 nn=[7 11 14 18]; for i=1:4 threshold=[0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1]; % 建立Elman神经网络 隐藏层为nn(i)个神经元 net=newelm(threshold,[nn(i),3],{'tansig','purelin'}); % 设置网络训练参数 net.trainparam.epochs=1000; net.trainparam.show=20; % 初始化网络 net=init(net); % Elman网络训练 net=train(net,p_train,t_train); % 预测数据 y=sim(net,p_test); % 计算误差 error(i,:)=y'-t_test; end %% 通过作图 观察不同隐藏层神经元个数时,网络的预测效果 plot(1:1:3,error(1,:),'-ro','linewidth',2); hold on; plot(1:1:3,error(2,:),'b:x','linewidth',2); hold on; plot(1:1:3,error(3,:),'k-.s','linewidth',2); hold on; plot(1:1:3,error(4,:),'c--d','linewidth',2); title('Elman预测误差图') set(gca,'Xtick',[1:3]) legend('7','11','14','18','location','best') xlabel('时间点') ylabel('误差') hold off; web browser http://www.ilovematlab.cn/viewthread.php?tid=63640 %% % % <html> % <table align="center" > <tr> <td align="center"><font size="2">版权所有:</font><a % href="http://www.ilovematlab.cn/">Matlab中文论坛</a>&nbsp;&nbsp; <script % src="http://s3.cnzz.com/stat.php?id=971931&web_id=971931&show=pic" language="JavaScript" ></script>&nbsp;</td> </tr></table> % </html> %
💖作者简介:大家好,我是车神哥,府学路18号的车神🥇⚡About—>车神:从寝室到实验室最快3分钟,最慢3分半(那半分钟其实是等红绿灯)📝个人主页:应无所住而生其心的博客_府学路18号车神_CSDN博客🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋📖本系列主要以学习Go语言打怪升级为标准,实现自我能力的提升为目标⚡⚡希望大家多多支持🤗~一起加油 😁专栏《Golang · 过关斩将》《LeetCode天梯》《Neural Network》《Python》《Algorithm》最近在项目中,发现批次过程(Batch Process)的应用还比较广泛,主要是面临一个三维特征的问题,平时我们面临的问题一般都只是二维的,一个是特征维度,另外一个是样本或者时刻(单指的采样时刻);但是会存在这样一个问题,当我们遇到的是一个采样时间很长,或者是连贯性不是那么好的实验样本时,但从采样时刻来进行特征提取,会在时间特性上有所丢失,由此我们应该加上不同时刻,而不只是单个时间段的采样点,或许是day1、day2、…的采样点,这样考虑会出现定义更为准确的结果。因为包含了时空特征进去,所有批次处理过程技术就由此诞生。或许到这里你还不是特别明白是什么意思,接着看下面你就懂了。目前用的最多的,效果最好的,永远是最经典的方法——Macgregor Method,也称作Multi-way PCA。1994的paper,放在这里:Monitoring Batch Processes Using Multiway Principal Component Analysis这是在谷歌学术上的,可能得想点办法才能刚打开哟!~Multi-way PCA上述算法中的矩阵运算为:图2清楚地显示,这个版本的MPCA解释了从参考数据库计算出的测量变量的平均轨迹的变化。从每个变量中减去平均轨迹可以消除过程的主要非线性行为。t-score向量的第i个元素对应于第i批,并总结该批相对于数据库中其他批在其整个持续时间内的总体变化。P加载矩阵总结了测量变量关于其平均轨迹的时间变化,它们的元素是权重,当在批内的每个时间间隔应用于每个变量时,给出该批的t分数。阴影区域表示M PCA 解释的变化其实方法很简单,就是切片,然后再处理,意思就是化繁为简,将三维转化为二维再进行特征提取!
以下为我的天梯积分规则:每日至少一题:一题积分+10分若多做了一题(或多一种方法解答),则当日积分+20分(+10+10)若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60)初始分为100分若差一天没做题,则扣积分-10分(周六、周日除外注:休息)坚持!!!初级算法刷题目录数学题干罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1 。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。给定一个罗马数字,将其转换成整数。示例1:输入: s = “III”输出: 3示例2:输入: s = “IV”输出: 4示例3:输入: s = “IX”输出: 9示例4:输入: s = “LVIII”输出: 58解释: L = 50, V= 5, III = 3.示例5:输入: s = “MCMXCIV”输出: 1994解释: M = 1000, CM = 900, XC = 90, IV = 4.哈希表分析:其实道理都一样,先将这些关键词存入哈希表,然后遍历查表获取表的值在相加得到最后的结果。class Solution: def romanToInt(self, s: str) -> int: dictory = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000} res = 0 n = len(s) for x in range(n-1,-1,-1): if res > 4*dictory[s[x]]: res -= dictory[s[x]] else: res += dictory[s[x]] return res
以下为我的天梯积分规则:每日至少一题:一题积分+10分若多做了一题(或多一种方法解答),则当日积分+20分(+10+10)若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60)初始分为100分若差一天没做题,则扣积分-10分(周六、周日除外注:休息)坚持!!!初级算法刷题目录动态规划题干假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例1:输入: 2输出: 2解释: 有两种方法可以爬到楼顶。1 阶 + 1 阶2 阶示例2:输入: 3输出: 3解释: 有三种方法可以爬到楼顶。1 阶 + 1 阶 + 1 阶1 阶 + 2 阶2 阶 + 1 阶递归分析:有大佬说这道题和青蛙跳台的原理一样。当n=1时,只一次即可,f(1)=1;当n=2时,可以有两次,f(2)=2;当n=3时,有三次,f(3)=f(2)+f(1);借用下图片:class Solution: def climbStairs(self, n: int) -> int: # 递归 if n <= 1: return 1 if n < 3: return n return Solution.climbStairs(self, n-1) + Solution.climbStairs(self, n-2)直接超时,这样递归,有点慢啊!这儿还是不用递归了,改用非递归吧。非递归其实也是用的那个Fibonacci的方法。class Solution: def climbStairs(self, n: int) -> int: if n <=2: return n l = [1, 2] for i in range(n-2): l.append(l[i]+l[i+1]) return l[n-1]
前言今天再训练数据集的时候发现了这样的一个问题,用鸢尾花数据集进行训练跑KPCA的时候可以用,但是到我这故障诊断里就直接报废了,就离谱!!!遇到的问题直接给我红色警告!!!就离谱!!!当然,出错并不可怕,可怕的是你不敢于去解决问题。首先看问题所在:too many indices for array: array is 2-dimensional, but 3 were indexed简单翻译过来就是:数组索引太多:数组是二维的,但是有3个索引后来我才发现,我输入的数据集并不是和鸢尾花一样啊,我这是无监督学习,并没有target呀,导入的是训练和测试数据集,所以,哎!!!解决问题关于这一类的问题,我觉得没有一个标准答案,但肯定是自己的代码出了点小毛病,可以检查一下输入输出的维度是否一致,这是最关键的错误点。
以下为我的天梯积分规则:每日至少一题:一题积分+10分若多做了一题(或多一种方法解答),则当日积分+20分(+10+10)若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60)初始分为100分若差一天没做题,则扣积分-10分(周六、周日除外注:休息)坚持!!!初级算法刷题目录链表题干给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例1:输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head = [1,2]输出:[2,1]示例3:输入:head = []输出:[]提示:链表中节点的数目范围是 [0, 5000]-5000 <= Node.val <= 5000递归法分析:首先看到这题干,是不是很熟悉,不就是反转排序嘛,说搞就搞!!!可以想到的有递归法、迭代法进行反转操作,我们先来实现递归,然后再实现迭代。关于递归这里提一两点:递归基本有这几步递归的模板,1.终止条件,2.递归调用,3.逻辑处理。这里引用下大佬的基本思路:class Solution: def reverseList(self, head: ListNode) -> ListNode: # # 递归终止条件:链表为空,或者是链表没有尾结点的时候,直接返回 if head == None or head.next == None: return head next = self.reverseList(head.next) # 保存当前节点的下一个节点 head.next.next = head # next.next = head head.next = None return next(迭代法)双链表法双链表求解是把原链表的结点一个个摘掉,每次摘掉的链表都让他成为新的链表的头结点,然后更新新链表。再次借用下大佬的图片直接上代码了吧就!class Solution: def reverseList(self, head: ListNode) -> ListNode: # 双链表法 new_link = None while head: # 判断是否为空字符,如果非空则运行下面的 # 保存当前节点的下一个节点 next = head.next # 将当前节点指向前一个节点 head.next = new_link # 上一个节点指向当前节点,再次循环中会被当成上一个值 new_link = head # 头节点指向下一个节点 head = next return new_link
💖作者简介:大家好,我是车神哥,府学路18号的车神🥇📝个人主页:应无所住而生其心的博客_府学路18号车神_CSDN博客🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋⚡希望大家多多支持🤗~一起加油 😁专栏《Fault Diagnosis》其他专栏:《LeetCode天梯》《Neural Network》《Python》《Algorithm》最近由于测试需要,使用到了Matlab,然后遇到了一点点小问题,下面说一下下吧!!~~索引超出子图数目主要是在Plot出图那块,想要放下三个图,依次放在下面,但是,原代码是下面这样的:%% 出图 %绘图 figure subplot(2,1,1); plot(1:XC_row,T2,'k'); title('KPCA Statistics'); xlabel('Sample Points'); ylabel('T^2'); hold on; line([0,XC_row],[t2a99,t2a99],'LineStyle','--','Color','r'); subplot(2,1,2); plot(1:XC_row,Q,'k'); xlabel('Sample Points'); ylabel('SPE'); hold on; line([0,XC_row],[Qa99,Qa99],'LineStyle','--','Color','r'); subplot(2,1,3); plot(1:XC_row,phi,'k'); xlabel('Sample Points'); ylabel('phi'); hold on; line([0,XC_row],[phia99,phia99],'LineStyle','--','Color','r')然后就出现这样一出。以我的判断,很明显,不能这样设置,然后去看来看教程,发现,咦~这个变量命名规则好不人性呀,没办法,将就着改吧!~subplot(2,1,3);这上面代码就子图生产的代码,其中是什么意思呢?括号里面前两个代表的是行列,简单的说可以看出2*1,那么就只能放下两个子图,第三个数,表示的是选取的第几个位置,因为只能放下两个图,所以会爆出使用错误,那么我们只能将其进行改进,才可以放下三个图,OK fine!那咱们就改成:subplot(3,1,3);这样就可以直接放下三个了,学会了吗,小伙伴们!依次类推,前两个相乘得到的数是最大的空间,也就是说,最后第三个数是不能超过前两个数的乘积。subplot(x,y,z); # 只有满足:z <= x*y
以下为我的天梯积分规则:每日至少一题:一题积分+10分若多做了一题(或多一种方法解答),则当日积分+20分(+10+10)若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60)初始分为100分若差一天没做题,则扣积分-10分(周六、周日除外注:休息)坚持!!!初级算法刷题目录字符串题干编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例1:输入:strs = [“flower”,“flow”,“flight”]输出:“fl”示例2:输入:strs = [“dog”,“racecar”,“car”]输出:""解释:输入不存在公共前缀。循环遍历分析:今天的题还算简单吧,但也不能忽视啊!!!可以用切片,可以用查找,可以用集合,可以用遍历~由于是判断前缀,只需查找到用相同的前缀,不用再查找后续的了,则返回公共集合,如果没有返回空字符“”。大家都可以试一试~class Solution: def longestCommonPrefix(self, strs: List[str]) -> str: # 先获取字符串的长度 n = len(strs) # 从最短的字符串中查找如果没有,再进行查找 if n == 0 or not strs: return '' idx = 1 frist = strs[0] while idx < n: while frist not in strs[idx][:len(frist)]: frist = frist[:len(frist)-1] idx += 1 return frist感觉还行吧,用切片,然后再逐步的判断!
💖作者简介:大家好,我是车神哥,府学路18号的车神🥇📝个人主页:应无所住而生其心的博客_府学路18号车神_CSDN博客🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋⚡希望大家多多支持🤗~一起加油 😁专栏《Fault Diagnosis》《LeetCode天梯》《Neural Network》《Python》《Algorithm》CSDN编辑器Markdown测评CSDN的 Markdown 编辑器是全网最好用的编辑器吗?如果不是,你还觉得缺点什么才会成为最好的?你在使用 Markdown 的时候有什么技巧或者招数吗?你觉得Markdown编辑还可以增加什么功能会更好?总结加入CSDN已经有三年多快四年了,从今年三月份开始真正的动手写一些Blog,从一开始写文章的时候会有富文本和Markdown的选择,由于之前学过LaTeX写论文,也用Jupyter notebook写过代码,所以果断选择了Markdown编辑器,但是发现并没有那么的习惯,虽然有很多的相同的地方,比如标题、斜体、加粗、排序、引用、代码块等这些比较常用的基本功能,但依旧还是有一些想说的,那下面就简单唠唠吧~CSDN的 Markdown 编辑器是全网最好用的编辑器吗?如果不是,你还觉得缺点什么才会成为最好的?CSDN的 Markdown 编辑器是全网最好用的编辑器吗?关于这个问题,我觉得并不能用最好这个来说,要写文本,记事本能写,word能行,wps也行,editplus也能行,等等,只能说是各有各的优点,各有各的缺点吧。先说说优点:就我在每次编辑过程中,下面这些是使用频率非常高的功能更多的还是使用的快捷键,在帮助文档里面有,我觉得这一点很好!有些时候会忘记,但又不想使用鼠标去点击再来说说去缺点,也就是我觉得需要改进的地方:字体颜色,我觉得可以出一个功能,直接选中,然后上色,不用让我每次都需要在字体前后使用!!!真的很难受,很冗长,很慢,浪费时间,此处要是能改进那就很好了。公式编辑。对于工科研究生来说,真的,还好学过LaTeX,有点公式编辑的基础,但是又有多少人真正会编辑公式呢,你会发现站内很多博客文章里的公式要么是图片,要么是不正确的公式,要么是脚注角标有问题,真的很难受,建议可以出个LaTeX的简易教程或者公式转换器,亦或者是更加方便快接的公式编辑器,例如接入mathtype等其他第三方公式编辑软件。图片问题。对于博客文章,既要求文章内容有料,有要求图文搭配,但是图文搭配,你会发现很多文章的图片有问题,这样的文章依旧还存在,后台没有进行提醒更新;其次,图片居中问题,每次只要图片没有占据整个界面或小于界面,那么图片会默认靠做对齐,每次我都需要用下面之前我发过的一个图片格式,这个代码对图片链接进行居中及图标命备注,这样会显得原始文章内容很长很长很长,对创作带来了很难受的体验。建议出一个更加简便的图片左、右对齐,居中等功能,这样会方便很多很多很多~你在使用 Markdown 的时候有什么技巧或者招数吗?在使用Markdown 的时候有什么技巧或者招数。说到这样,我觉得和上一个问题相呼应吧,那些让我感觉很不方便的地方都成为了我使用的一些技巧,说真的。那就相互呼应一下吧~字体颜色的编辑。使用下面的代码,然后可以增加文字的颜色和大小,颜色可以从这个网站(HTML取色器)里面进行选取,然后填在color=后面就可以了。格式如下:<font size=3 color=#ff0000>**一键三连**</font>公式编辑。我觉得还是需要对LaTeX进行一定的学习,简单一些公式编辑。公式是放在两个$中间的。这里提供一个在线的公式编辑网站:https://www.latexlive.com/。写论文我也用的比较多在这个网站。图片问题。我一般就是用的我之前保存的那个居中和加标题的代码,每次都用,哎!~Markdown设置图片格式模板在这里也放一下下吧,只需要将图片地址放进去就可以了,还算比较方便的吧!<center> <img style="border-radius: 0.3125em; box-shadow: 0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.08);" src="这里输入图片地址"> <br> <div style="color:orange; border-bottom: 1px solid #d9d9d9; display: inline-block; color: #999; padding: 2px;">这里输入题注</div> </center>你觉得Markdown编辑还可以增加什么功能会更好?需要增加的功能,上面也对应的说明了增加功能。再汇总一下吧!字体颜色。希望增加一个可以直接选中文章,然后取色,上色的操作,如果再加上底纹啥的就更好了。图片问题。希望增加对图片的更新,有些论文的图片都丢失了。还有就是图片的左、右对齐,及其居中问题。公式编辑。希望出一个在能更好更快更方便编辑公式的功能,接入mathtype,或自研公式编辑等等,都可以,只要能更方便的编辑。总结在产品视觉上,感觉还行,不要太花哨,简约才是最美!~以上就是我对Markdown 的这些产品功能测评、使用感受及些许建议,望CSDN能考虑考虑!~
前言在python的语法中, // 和 / 和 % 均表示的做除法运算,但又有一些区别,下面一一介绍一下。/ (常规除)如:5 / 2 = 2.5解释:平常除法是什么结果就是什么结果。//(地板除)如:5 // 2 = 2 (5 ÷ 2 = 2.5)5 // 3 = 1 (5 ÷ 3 = 1.6666666666666667)解释:地板除,只去除完之后的整数部分。% (取余数)如:5 % 2 = 1 (5 - 2*2 = 1)4 % 2 = 0 (4 - 2*2 = 0)7 % 3 = 1 (7 - 3*2 = 1)13 % 5 = 3 (13 - 5*2 = 3)解释: 就是一个取余数的操作,除开被除数的倍数,余下几就得几。上面红色的数字带表被除数的倍数。
今天是这么一回事,换了新电脑。装了PyCharm,然后发现有些库没有一块儿并过来,只好收到装库了,但是,但是,但是,Duang!~红色警告!!!pip : 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。当时我就,蚌埠住了!!!来第一步右键我的电脑,选择属性第二步找到高级属性第三步选择环境变量第四步如图,一定要选择“系统变量”先得Path选中然后点击编辑第五步点击新建第六步复制你的Python的位置路径到这里就行了,我的路径是下图这里查找自己的路径可以用 Everthing这个软件查找,很方便像我这样,复制其路径即可点击确定最后一步最后还有最最最重要的一步操作!!!重启一定要重启才会生效
事情是这样的,由于个人懒惰的原因,故我调用了一个sklearn的包实现PCA降维# sklearn实现PCA降维 def Sklearn_Pca(dataset): """ 对原始数据进行降维处理,并保存为降维后的数据表 :param dataset: 原始数据表,单一层 :return: 返回pca后的降维数据 """ pca = PCA(n_components=4, copy=True, whiten=False) # ‘mle’方法自动选取维度,保留几维度数据 # pca.fit(dataset) pca_result = pca.fit_transform(dataset) # 输出降维后的数据 # print(pca_result) return pca_result然后,就给我爆出个这然后我就蚌湖住了发现C站没有相关解答,害!~然后就看看看看,找到了sklearn的原始包文档,发现“我是废物!!!”并没有下面这个用法(盆友们一点要细心呀!~)修改为下即可就能正常运行了。
还有两天就国庆了,小伙伴们是不是已经按捺不住内心的小鸡冻了呀!!!有没有人和车神哥一起敲代码,科研报国!!!(虽然菜鸡一个,但是心还是有的)最近测试了一个关于SFA(之前博客写过的)算法,现在在做实际项目应用,说实话,实际与理论确实有很大的偏差,需要做到很多次的调试与核验,emmmmmmm,最终应用效果咱们另做打算。项目背景具体算法咱们就不多说了,可以在这里看看。简要说下项目背景,这个项目当然是国家自然。。。。。。。。噼里啪啦噼里啪啦的一大堆,哈哈哈哈,没有没有,就一个很简单的模型测试实验,不然咱也不能这么Poster出来吧~简单说就是有一个地方有很多很多的消耗品(宝物),然而里面现在包含一些其他的杂质(废物),我们并不希望在获取那些宝物的时候也把一些不要的废物给一起揣包里了,需要分辨出哪些是废物,哪些是宝物。然鹅,现在我们有很多很多的表征宝物和废物的特征,但是也不知道什么表征宝物,什么来表征废物,所以说嘛,这里的SFA测试只是第一步,通过过程监控的方式来把他给检测出来,从时间序列上获取稳态和动态信息。目前只需要检测出哪些是宝物哪些是废物,假设废物就是故障,宝物是正常的。了解了整个背景后,明确一件事,检测出废物,得到宝物。好!咱直接上测试测试我们一共有很多层的数据集,由此我们单独对每一层的特征数据进行SFA慢特征分析。按照故障诊断的尿性,必得有正常工况的数据和故障工况的数据,在这,咱只能硬上了。存在的问题:不知道何为正常工况的数据,建立的模型是否准确,方法是否可行可视化干起来!!!我们对应的数据集是空间上的,所谓的层数只是在Z坐标轴方向上进行检测,所以咱们把每一层的检测值给叠加起来,看看效果!!!回过来看,最重要的一点是找到废物,只拿宝物。具体验证过程过于鸡米,不便展示。总结下,SFA在时序特征提取方面还是很有用的,具体落在项目应用上,还得结合更加专业的结合,纯数据驱动很难解释其中的物理意义,解决这一块,我相信数据驱动的相关邻域只是会大力的发展,并会连锁反应带动更多的其他邻域的进步!!!加油!!!为了不受限于人!!!淦!!!
由于项目的需要,一直苦于将多层数据集累加起来做成一个呈堆积状的三维图,有点类似于地形图(实则热力图),但又不是地形图。背景先说说项目背景,本菜鸡是搞故障诊断的,所以免不了用上一些统计学的知识,看过之前我的Blog的都会发现,T 2 T^2T 2 和 S P E SPESPE 在故障诊断邻域或者说是再小范围一点,在过程监控邻域,是很好用且很关键的两个统计量,用于监测过程中的一些有故障的检测点或者区间,会有阈值限,超过阈值的则判断为故障,反而,则为正常。具体可以看->这里。三维图之前尝试过很多中方法来实现三维图,但是,。。。,但是均没实现完美的效果,如Echarts、Pyecharts、Plotly等等,最终还是只有用yyds,真的,没有它解决不了的可视化问题!!!输入(数据就像上面那样,这里我们以 T 2 的多层可视化为例展开吧)那么下面我们直接开始搞可视化吧!!!输出输出最终则为我们的可视化三维图,先不爆料,看后续。可视化我们用的Python来实现可视化。导入库库先给导入进来:import matplotlib.pyplot as plt # 可视化的matplotlib库 import pandas as pd # 数据表操作的库 from mpl_toolkits.mplot3d import Axes3D # 三维可视化 from icecream import ic # 类似于print输出封装一些Function虽然我们的代码不是很长,但为了代码的规范和美观,建议还是讲其封装为一个一个的function,这样调用起来更方便。读取数据表def loaddata(filename): """ 读取传入得数据表 """ dtf = pd.read_csv(filename) # 读取表格文件 return dtfT2 三维热力图def T2_plot(df_value, df_xy): """ 绘制T2三维热力图 """ #获取行列数 q1 = df_value.shape[1] # 列数 r1 = df_value.shape[0] # 行数 print('x_y有%r行,%r列。' % (r1, q1)) X = [] Y = [] Z = [] # 设置空数组备用 for a in range(2, q1): # 选择需要叠加的Value量选值范围2~11, 应该遍历所有列,因为每个数据表的维度不一定一致,所以最大通过获取的列传入 for xx in range(r1 + 1): # 循环迭代不同的层数 if xx < r1: IIx = df_xy.iloc[xx, 0] # 取第一列的值 IIy = df_xy.iloc[xx, 1] # 取第二列的值 IIz = df_value.iloc[xx, a] # 取相应的T2或SPE的值 # 将每个坐标轴X,y及其T2或SPE的值存入一个list中 X.append(IIx) Y.append(IIy) Z.append(IIz) ic(len(Z)) # 查看Z的数量 # 开始制图 fig = plt.figure() ax = Axes3D(fig) ax.set_xlabel('IX', fontsize=10, color='black') # 设置x标签及其参数 ax.set_ylabel('JY', fontsize=10, color='black') # 设置y标签及其参数 ax.set_zlabel('Value', fontsize=10, color='black') # 设置z标签及其参数 ax.plot_trisurf(X, Y, Z, cmap=plt.get_cmap('jet'), linewidth=0.1) # 三角表面图 plt.show() # 渲染3D图显示主函数# 主函数 if __name__=="__main__": # 导入数据表文件名 T2_name = "T2.csv" xy_name = "x_y.csv" # 读取数据表 t2 = loaddata(T2_name) xy = loaddata(xy_name) # 制作T2三维图 T2_plot(df_value=t2, df_xy=xy)最终的效果图像这样:换个方位再来一张:让我们再看看底部:深色的地方则是有多个相近的点堆积到一起的,所以会在那些点显得颜色很深。来个大汇总,完整代码:import matplotlib.pyplot as plt import pandas as pd from mpl_toolkits.mplot3d import Axes3D from icecream import ic # 读取数据表 def loaddata(filename): """ 读取传入得数据表 """ dtf = pd.read_csv(filename) # 读取表格文件 return dtf # T2三维热力图 def T2_plot(df_value, df_xy): """ 绘制T2三维热力图 todo:完善 """ #获取行列数 q1 = df_value.shape[1] # 列数 r1 = df_value.shape[0] # 行数 print('x_y有%r行,%r列。' % (r1, q1)) X = [] Y = [] Z = [] # 设置空数组备用 for a in range(2, q1): # 选择需要叠加的Value量选值范围2~11, 应该遍历所有列,因为每个数据表的维度不一定一致,所以最大通过获取的列传入 for xx in range(r1 + 1): # 循环迭代不同的层数 if xx < r1: IIx = df_xy.iloc[xx, 0] # 取第一列的值 IIy = df_xy.iloc[xx, 1] # 取第二列的值 IIz = df_value.iloc[xx, a] # 取相应的T2或SPE的值 # 将每个坐标轴X,y及其T2或SPE的值存入一个list中 X.append(IIx) Y.append(IIy) Z.append(IIz) ic(len(Z)) # 查看Z的数量 # 开始制图 fig = plt.figure() ax = Axes3D(fig) ax.set_xlabel('IX', fontsize=10, color='black') # 设置x标签及其参数 ax.set_ylabel('JY', fontsize=10, color='black') # 设置y标签及其参数 ax.set_zlabel('Value', fontsize=10, color='black') # 设置z标签及其参数 ax.plot_trisurf(X, Y, Z, cmap=plt.get_cmap('jet'), linewidth=0.1) # 三角表面图 plt.show() # 渲染3D图显示 # 主函数 if __name__=="__main__": # 导入数据表文件名 T2_name = "T2.csv" xy_name = "x_y.csv" # 读取数据表 t2 = loaddata(T2_name) xy = loaddata(xy_name) # 制作T2三维图 T2_plot(df_value=t2, df_xy=xy)
最近传出了黑客帝国4(The Matrix 4)的消息,真的是激动啊!!!《黑客帝国4:重生》(The Matrix: Resurrections)将于2021年12月22日上映。官网的预告片更是震撼,据说每个人的选择,看到的预告片都不一样,具体你可以进去试一试哟~地址:https://thechoiceisyours.whatisthematrix.com/cn/小时候看前三部的时候始终没看懂,那些人为什么了能飞过去飞过来的,以为是超人还是什么超级英雄,上大学后,再回过头来看,基本就能看懂了,不经感叹道,这是在1999年拍出来的啊!!!The Matrix是不是觉得电影里的屏保很炫酷,同样你也可以拥有!然后就小研究了一下,先说下HTML实现。先在桌面上建立一个文本文件,如下图(名字随便取)然后将文件的后缀名改为(.html)然后通过记事本打开,再复制下面的代码,直接保存即可<html> <head> <title>黑客帝国-代码雨</title> <canvas id="canvas" style="background:red" width="620" height="340"></canvas> <audio autoplay="autoplay" src="C:\Users\gxkj-040\Desktop\黑客帝国代码雨\Rob Dougan、Don Davis - Chateau.mp3"></audio> <script type="text/javascript"> window.onload = function(){ //获取图形对象 var canvas = document.getElementById("canvas"); //获取图形的上下文 var context = canvas.getContext("2d"); //获取浏览器屏幕的宽度和高度 var W = window.innerWidth; var H = window.innerHeight; //设置canvas的宽度和高度 canvas.width = W; canvas.height = H; //每个文字的字体大小 var fontSize = 15; //计算列 var colunms = Math.floor(W /fontSize); //记录每列文字的y轴坐标 var drops = []; //给每一个文字初始化一个起始点的位置 for(var i=0;i<colunms;i++){ drops.push(0); } //运动的文字 var str ="0123456789abcdefghijklmnopqurstuvwxyz"; //4:fillText(str,x,y);原理就是去更改y的坐标位置 //绘画的函数 function draw(){ //让背景逐渐由透明到不透明 context.fillStyle = "rgba(0,0,0,0.05)"; context.fillRect(0,0,W,H); //给字体设置样式 //context.font = "700 "+fontSize+"px 微软雅黑"; context.font = fontSize + 'px arial'; //给字体添加颜色 context.fillStyle ="green";//随意更改字体颜色 //写入图形中 for(var i=0;i<colunms;i++){ var index = Math.floor(Math.random() * str.length); var x = i*fontSize; var y = drops[i] *fontSize; context.fillText(str[index],x,y); //如果要改变时间,肯定就是改变每次他的起点 if(y >= canvas.height && Math.random() > 0.92){ drops[i] = 0; } drops[i]++; } }; function randColor(){ var r = Math.floor(Math.random() * 256); var g = Math.floor(Math.random() * 256); var b = Math.floor(Math.random() * 256); return "rgb("+r+","+g+","+b+")"; } draw(); setInterval(draw,33); }; </script> <style type="text/css"> body{margin: 0; padding: 0; overflow: hidden;} </style> </head> <body> </body> </html>像下面这样保存完毕之后。直接双击打开吧~(前提得有浏览器,这应该大家都有吧!)全屏的话,可以直接按下F11。emmmmmmmmmm…好像做成屏保还差那么点意思,然后我就找到了一个国外免费的(竟然还在针对不同版本的Windows更新的)一个屏保。下面上链接:http://www.kellysoftware.com/ssaver/Matrix_ks.php这网站可以说是很良心了!下面还有一个下载链接:Matrix_ks黑客帝国屏保小插件下载下来,傻瓜安装即可,然后再点击上图,跳转下你就即将拥有黑客帝国的屏保,其中很多图形、颜色、数字等等都可以DIY,开发者很厉害了!Respect~
最近研究二次判别分析(Quadratic Discriminant Analysis,QDA),发现运用到了交替方向乘数法(ADMM),就很迷。(关键是太菜)很多博主都是直接翻译或者搬运的,搜罗且了解了很多相关知识,那就来个大总结及其一些自己的想法吧!(内力有限,仅供学习交流)确实很难,理论性很强,没有虚的,阅读完内容需要有“勇气”!ADMM背景咱们先来了解了解,ADMM到底是个什么东西?交替方向乘数法(Alternating Direction Method of Multipliers),从字面意思上理解,交替方向?是不是很迷?交替计算?交替求解?。。。难道是对偶问题?对偶求解?先不管了,再看后半句,乘数法?咦~是不是感觉有点熟悉。la.la.la…Lagrange乘数法???(没错,就是Lagrange,直接干起来,等等,这里只说对了一半,具体咱们下面慢慢道来~)ADMM是一个不算是太新的算法,其实就是一种求解优化问题的计算框架, 适用于求解分布式凸优化问题,特别是统计学习问题。 ADMM 通过分解协调(Decomposition-Coordination)过程,将大的全局问题分解为多个较小、较容易求解的局部子问题,并通过协调子问题的解而得到大的全局问题的解。简单的理解就是,整个算法只是整合许多不少经典优化思路,然后结合现代统计学习所遇到的问题,提出了一个比较一般的比较好实施的分布式计算框架。而他的历史可以追溯到看下面:ADMM 最早分别由 Glowinski & Marrocco 及 Gabay & Mercier 于 1975 年和 1976年提出,并被 Boyd 等人于 2011 年重新综述并证明其适用于大规模分布式优化问题。由于 ADMM的提出早于大规模分布式计算系统和大规模优化问题的出现,所以在 2011 年以前,这种方法并不广为人知。作为搞自动化、控制、优化、诊断…的本菜来说,当然是奔着优化求解去学习的。先来看看一个大佬对目前大数据及其优化的见解,简直是一针见血,说出来我的心声:业界一直在谈论大数据,对于统计而言,大数据其实意味着要不是样本量增加n → ∞ n\rightarrow \inftyn→∞,要不就是维度的增加p → ∞ p \rightarrow \inftyp→∞,亦或者两者同时增加,并且维度与样本量的增长速度呈线性或者指数型增长。在稀疏性的假设条件下,再加上一些正则性方法,统计学家可以证明各种加penalty的模型所给出的参数估计具有良好的统计性质,收敛速度也有保证,同时还会给出一些比较好的迭代算法,但是,他们并没有考虑真实环境下的所消耗的计算时间。虽然统计学家也希望尽量寻求迭代数目比较少的算法(比如one-step估计),但是面对真实的Gb级别以上的数据,很多时候我们还是无法直接用这些算法,原因是一般的硬件都无法支撑直接对所有数据进行运算的要求。如果想减少抽样误差,不想抽样,又想提高估计的精度,那么还是需要寻求其他思路,结合已有的模型思想来解决这些问题。在目前条件下,并行化、分布式计算是一种比较好的解决思路,利用多核和多机器的优势,这些好算法便可以大规模应用,处理大数据优势便体现出来了。对于统计而言,数据量越大当然信息越可能充分(假设冗余成分不是特别多),因为大样本性质本身就希望样本越多越好嘛。—源自此处还需要知道的一点,我们都知道搞优化会遇到很多问题,无非是数据量上和维度的变化,关键词大都为:降维,收敛,迭代等等,而这里的ADMM算法不同于那些梯度下降法或其他改进的SGDM、RMSProp、Adam等等更多高级算法,应用的大多为以GB级别的数据量的数据集,如果与SGDM、Adam这些算法在同样的低维数据(这里指的是较GB级别低的)进行比较,收敛速度绝壁没它们好,很慢,实际的收敛速度往往比那些算法慢得多。ADMM的主要应用,主要是在解空间规模非常大的情况下(比如X、Y 都是存储空间上GB的超大规模矩阵),这个时候很多传统的方法不好用,强制需要分块求解,而且对解的绝对精度往往要求也没那么高。所以我觉得这是,需要提前知道的一点。确实,这个算法很难理解,公式也很难,不敢保证,我能将其解释清楚,抱着互相学习的态度写这篇Blog!(望各位大佬批评指正)具体结构,从ADMM需要用到的背景知识、ADMM原理、具体应用这几块进行解释。下面咱们从基本框架结构入手吧~背景知识《Distributed Optimization and Statistical Learning via the Alternating Direction Method of Multipliers》文章中提到了一些预备知识,学过最优化或最优估计等优化课程的童鞋应该能够很快能够理解,对偶问题若很陌生的小伙伴,可以补充补充相关的知识。先来了解一些基本算法思想吧~对偶上升对于凸函数的优化问题,对偶上升法核心思想就是引入一个对偶变量,然后利用交替优化的思路,使得两者同时达到optimal。读到这里,让我们想起咱们的主题,“交替方向”,是不是有点感觉了。对于凸函数,我们只需要知道,凸优化问题有一个良好的性质即:局部最优解便是全局最优解对凸函数有不解的地方,可看这位大佬的博客。一个凸函数的对偶函数其实就是原凸函数的一个下界,因此可以证明一个较好的性质:在强对偶性假设下,即最小化原凸函数(primal)等价于最大化对偶函数(dual),两者会同时达到optimal。这种转化可以将原来很多的参数约束条件变得少了很多,以利于做优化。具体表述如下:对于对偶问题有所不解的,可以简单理解成为原函数是Y关于X的函数,那么对偶的函数则为X关于Y的函数,这样理解是不是更容易一点呢。在强对偶的假设下,原问题和对偶问题的解都是一样的,同时达到最优。什么是强对偶性?就是指原问题的解与对偶问题的解是相同的,也即是:arg 是变元(即自变量argument)的英文缩写。arg min 就是使后面这个式子达到最小值时的变量的取值>arg max 就是使后面这个式子达到最大值时的变量的取值假如g ( y ) g(y)g(y)可求其导数,那么利用梯度上升法,交替更新参数,使得同时收敛到最优。迭代如下:对偶分解虽然对偶上升的方法有所缺陷,导致我们在实际操作中会遇到重重困难。但是世界万物都是存在着两面,有其弊也有其利,就如下面的太极双鱼图那么,我们可以利用其优秀的一面,当目标函数 f 是可分的(separable)时候(参数亦或feature可分),整个问题可以拆解成多个子参数问题,分块优化后汇集起来整体更新。这也就是快接近咱们的主题了,分布式凸优化问题。我们可以分块,然后并行化处理。由此,我们可分离的目标函数为:对偶分解是非常经典的优化方法,可追溯到1960年代。这种思想对后面的分布式优化方法影响较大,比如近期的graph-structure优化问题。(具体可自行查询一下下)增广的拉格朗日乘数法反正,记住一点即可:增加惩罚项,扩大约束条件的容纳范围,放松假设条件。可使其收敛的更快。那么,增加惩罚项的拉格朗日项为:其中,最后加了的L2正则化,二范数,也就是岭回归优化项就是惩罚项。ρ \rhoρ 则为我们的松弛因子(惩罚系数),用于更加精细的调节扩大的范围边界。我们可以将其等价为优化的目标函数形式:我们增加的惩罚函数的好处是为了让对偶函数更具有可导性,更新参数的计算过程和对偶上升的一致。除最小化x xx的时候加上惩罚项:解除严格凸函数的限制的任务已经完成了,但是同时又存在另外一个问题,当增加惩罚项后,其平方项写成矩阵形式无法是用之前那种分块形式的,因此,在更新x xx最小化时,无法做到并行优化多个x i 参数,关于新的问题的解决办法,ADMM则杀出重围了!!!ADMM算法原理在上述的层层递进的方法中,你是否也发现了其中的奥秘,对偶上升法解决了可分解性问题,增广乘子法解决了严格的凸函数限制条件,增强了收敛性。那么是否,我们可以将二者集合在一起,取其各自的优点呢?答案当然是肯定的,那就是ADMM算法,同时解决了将原函数进行分解和扩展函数的约束范围问题。使得f ( x ) f(x)f(x)能够适应于更多的更广泛的约束条件求解问题。结合两者的优点,就有了下式目标函数:和上面的增广拉格朗日一样,只不过增加了新的变量z zz而已。于是ADMM的优化就变成了如下序贯型迭代(这正是被称作alternating direction交替方向的缘由):可以看出,每次迭代分为三步:求解与 x 相关的最小化问题,更新变量 x 求解与 z 相关的最小化问题,更新变量 z 更新对偶变量 u ADMM名称中的“乘子法”是指这是一种使用增广拉格朗日函数(带有二次惩罚项)的对偶上升(Dual Ascent)方法,而“交替方向”是指变量 x 和 z 是交替更新的。两变量的交替更新是在 f ( x )或 g ( z )可分时可以将优化问题分解的关键原因。到此,通过以上的内容来理解“交替方向乘数法(ADMM)”是不是就豁然开朗了许多,开篇说很难,其实是不是并没有那么的难。当然,写成这种形式有利于后面简化优化问题,也可不作任何的处理。具体应用大佬回答及点评ADMM( Alternating Direction Method of Multipliers)算法是机器学习中比较广泛使用的约束问题最优化方法,它是ALM算法的一种延伸,只不过将无约束优化的部分用块坐标下降法(block coordinate descent,或叫做 alternating minimization)来分别优化。产生这种方法主要是为了弥补二次惩罚的缺点。在一些问题当中,用二次惩罚来近似约束问题在最优点附近需要惩罚项的系数趋近于无穷,而这种要求会使得海森矩阵很大,因此近似的目标函数很不稳定。为了解决这个问题,引入了线性逼近的部分,通过线性项系数不断的接近最优解(对偶上升),使得在二次惩罚项的系数很小的情况下,也能得到满足要求精度的解。ADMM目前是比较成熟,比较受欢迎的约束问题最优化通用框架。(引用源自知乎大佬)受约束的凸优化问题一般的受约束的凸优化问题可以写成如下形式:可将此类型写成ADMM形式,增加新变量,以分解原始变量:相应的增广拉格朗日项为:其中的 g 函数即 C 的示性函数,上述是scaled形式,那么具体算法就是:示性函数,顾名思义,是表示自变量性态的一个函数。统计学习中的应用统计学习问题也是模型拟合问题(我们知道有拟合和过拟合),可表示为:对于带L1正则化项的线性回归(Lasso),其平方损失函数为对于逻辑回归(Logistic Regression),其极大似然损失函数为对于线性支持向量机(Linear Support Vector Machine),其合页(Hinge)损失函数为将训练数据在其原始样本M维度下将其划分为N块:由此我们可得到分块的目标函数来实现分布式计算:相应的简洁迭代更新D 、 d 、 x 的计算方式为:个人见解最后说两句,虽然优化算法千千万,在不同时期,随着科技的发展与进步,老的算法暂时过时,新的算法逐步崛起,但终归要落实到实际应用当中才是真正的好算法,并不是说一味的提高求解速度,提高精度,有些时候成本会很高,有些时候老的算法会被拾起成为yyds,新的算法未必就好。终究说来,希望能够有更多更实际应用范围更加广泛的优化算法逐步崛起吧~
❤九月❤份了,车神哥又回归了校园❉冬天❉还会远吗♪推荐一首最近很⚡喜欢⚡的歌♪❀No Fear In My Heart -朴树❀由于最近在写一篇相关的论文,就说说其中遇到的一些问题吧~Minisom之前做过一个对minisom的第三方开源库的介绍,可以点击看这里。对相应的代码添加了注释:导入各种库吧# 导入库 from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Patch import pandas as pd from minisom import MiniSom import math import xlrd from icecream import ic from tqdm import tqdm from openpyxl import load_workbook import openpyxl from time import time第一步是导入数据的Function,这很简单就不解释了# 传入数据成DataFrame的矩阵格式 def loaddata(datafile, num_name): df = pd.read_excel(datafile, sheet_name=num_name, index_col=0) # 导入数据 return df # 返回值由于代码不是很长,就没有按照模块来写了然后是导入源文件及其标签。说实话,在现实项目中,想要找到不同特征的标签是真的真的真的太难了!!!不要问为什么,当你实践你就知道了~# 导入原始数据 # 1.导入训练和测试数据集 datafile = "*********.xls" # 原始数据文件名 # 2.导入标签数据 y = pd.DataFrame(pd.read_csv('label****.csv')) # 读取你的标签数据或者原有的标签是最好的 yy = [] # 设置空矩阵 # 循环将标签导入yy矩阵中 for iy in range(y.shape[0]): Uy = y.iloc[iy, 0] yy.append(int(Uy)) y = yy # 赋值给y再读取每个sheet中的不同特征名称,我的数据集是这样,如果你没有特征名称,最好对其进行标记,这样会更加有效。# 3.读取特征标签 feature_names = pd.DataFrame(pd.read_excel(datafile, index_col=0)).columns # 取数据的列:特征标签 class_names = [0, 1] # 标签名称 feat = [] # 设置空矩阵 # 循环将特征名称添加到feat矩阵中 for tz in range(feature_names.shape[0]): tezh = feature_names[tz] feat.append(tezh) # 逐步添加进feat feature_names = feat # 赋值给feature_names print('特征名称:', feature_names)由于我的源文件会有很多个sheet,所以需要对每一个sheet进行训练及测试,再进行保存操作,如果你只要一个数据表的话,可以对此进行相应的改进。# 按照每一个数据Sheet读取每一层的数据 # 读取文件数据集 workbook = xlrd.open_workbook(datafile) # 打开数据文件 sheets = workbook.sheet_names() # 读取原始数据的数据表sheet名 SheetNames = [] # 设置空矩阵 # 循环输出 for sheetname in tqdm(sheets): print("表格的名称是:", sheetname) SheetNames.append(sheetname) # 循环添加进空矩阵SheetNames中 print('原始数据表的表单名称为:', SheetNames) num_n = pd.DataFrame(SheetNames).shape[0] # 获取表单的个数 print('表单的个数为:', num_n) # 设置空数据表1 dff = pd.DataFrame(columns=["title", "content"]) # 添加列名 dff.to_excel('SOM_Result.xlsx') # 保存到'SOM_Result.xlsx' ## 设置空数据表2 dff2 = pd.DataFrame(columns=["title1", "content1"]) # 添加列名 dff2.to_excel('SOM_label_result.xlsx') # 保存到'SOM_label_result.xlsx' start_time = time() # 记录设置开始的时间接下来也是对我的每一个表单进行循环遍历训练及其测试的过程,如果只需要进行一次,那么只需要取消循环过程,更改其中的一些变量即可。其中包含SOM的训练及测试,权值矩阵、map、聚类结果的可视化,精确度等操作。for i_c in range(num_n): if i_c < num_n: print('程序目前处在第%r层数.' % SheetNames[i_c]) XMat = loaddata(datafile, num_name=SheetNames[i_c]) # 返回得到浮点型矩阵 # 设置空数据表1 dff = pd.DataFrame(columns=["title", "content"]) # 添加列名 dff.to_excel('SOM_Result_'+ SheetNames[i_c] +'.xlsx') # 保存到'SOM_Result.xlsx' ## 设置空数据表2 dff2 = pd.DataFrame(columns=["title1", "content1"]) # 添加列名 dff2.to_excel('SOM_label_result_'+ SheetNames[i_c] +'.xlsx') # 保存到'SOM_label_result.xlsx' X = XMat.values # 将DataFrame格式改为np.array矩阵 # 划分训练集、测试集 7:3 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) # X为原始数据,y为标签数据,test_size为训练集和测试集划分比例,random_state为选择随机打乱的方式,可设置为0或1方式 N = X_train.shape[0] #样本数量 M = X_train.shape[1] #维度/特征数量 ''' 设置超参数 ''' size = math.ceil(np.sqrt(5 * np.sqrt(N))) # 经验公式:决定输出层尺寸 print("训练样本个数:{} 测试样本个数:{}".format(N, X_test.shape[0])) print("输出网格最佳边长为:", size) max_iter = 1000 # 迭代次数 # Initialization and training(初始化及其训练) size为神经元数,M为输入维度/特征数量, learning——rate为学习率 som = MiniSom(size, size, M, sigma=3, learning_rate=0.5, neighborhood_function='bubble') # Neighborhood_function’近邻函数‘可选的设置有'gaussian'、'mexican_hat'、'bubble'. 调参的时候可以都试一遍,看效果 ''' 初始化权值,有2个API ''' som.pca_weights_init(X_train) # PCA降维初始化 som.train_batch(X_train, max_iter, verbose=False) # train_batch 每次按顺序取一个样本,用过最后一个样本后跳回第一个样本,循环直到迭代次数满足max_iter winmap = som.labels_map(X_train, y_train) # 求取获胜神经元 # 判断样本的类别 def classify(som,data,winmap): from numpy import sum as npsum # 导入库 default_class = npsum(list(winmap.values())).most_common()[0][0] # 获取获胜神经元的值 result = [] # 设置空矩阵 for d in data: # 循环迭代 win_position = som.winner(d) # 获胜神经元的权值位置 if win_position in winmap: # 判断是否属于获胜神经元 result.append(winmap[win_position].most_common()[0][0]) # 将其添加进空矩阵result中 else: result.append(default_class) # 若不满足上面的条件则将default_class添加进result中 print('输出result结果:', result) return result # 返回值 # 输出混淆矩阵 y_pred = classify(som, X_test, winmap) # 调用classify函数 print(classification_report(y_test, np.array(y_pred))) # 输出混淆矩阵 # 绘制各种图 # U-Matrix heatmap = som.distance_map() #生成U-Matrix plt.imshow(heatmap, cmap='bone_r') #miniSom案例中用的pcolor函数,需要调整坐标 plt.colorbar() # 颜色卡 plt.figure(figsize=(9, 9)) # 设置图像大小 # 背景上画U-Matrix heatmap = som.distance_map() # 热力图 plt.pcolor(heatmap, cmap='bone_r') # plotting the distance map as background 设置样式 # 定义不同标签的图案标记 markers = ['o', 's'] # 设置图案样式 colors = ['C0', 'C1'] # 定义不同标签图案的颜色 category_color = {'Normal': 'C0', 'fault': 'C1', } # 设置对应字典 for cnt, xx in enumerate(X_train): # 迭代获取X_train训练数据 w = som.winner(xx) # getting the winner # 在样本Heat的地方画上标记 plt.plot(w[0]+.5, w[1]+.5, markers[y_train[cnt]], markerfacecolor='None', markeredgecolor=colors[y_train[cnt]], markersize=12, markeredgewidth=2) # plot绘制图像,markerfacecolor:标记颜色,markersize:标记尺寸,markeredgewidth:标记宽度 plt.axis([0, size, 0, size]) # 设置坐标系 ax = plt.gca() # 进行坐标轴的移动,gca就是get current axes ax.invert_yaxis() #颠倒y轴方向 legend_elements = [Patch(facecolor=clr, edgecolor='w', label=l) for l, clr in category_color.items()] plt.legend(handles=legend_elements, loc='center left', bbox_to_anchor=(1, .95)) # 设置图像界面细节 # plt.show() # 显示图 label_name_map_number = {"Normal":0,"Fault":1} # 神经元占比饼图 from matplotlib.gridspec import GridSpec plt.figure(figsize=(9, 9)) # 设置图像界面大小 the_grid = GridSpec(size, size) # 神经元个数 for position in winmap.keys(): # 迭代获取获胜神经元位置 label_fracs = [winmap[position][label] for label in [0,1]] # 获取标签 plt.subplot(the_grid[position[1], position[0]], aspect=1) # 表示把显示界面分割成the_grid[position[1]*position[0]的网格 patches, texts = plt.pie(label_fracs) # 用于绘制饼图 plt.text(position[0]/100, position[1]/100, str(len(list(winmap[position].elements()))), color='black', fontdict={'weight': 'bold', 'size': 15}, va='center', ha='center') # 给图中加标签 plt.legend(patches, class_names, loc='center right', bbox_to_anchor=(-1, 9), ncol=3) # 显示图中的各种标签 # plt.show() # 输出显示图像 # 权重热力图 plt.figure(figsize=(10, 10)) # 设置图像大小 for i, f in enumerate(feature_names): # 迭代循环获取feature_names特征 plt.subplot(4, 4, i+1) # 表示把显示界面分割成 4*4 的网格 plt.title(f) # 设置标题 W = som.get_weights() # 获得权重数据 plt.imshow(W[:,:,i], cmap='coolwarm') # 输出热力图,W[:,:,i]变量存储图像,可以是浮点型数组、unit8数组以及PIL图像,参数cmap用于设置热图的Colormap,代表热力块的样式颜色 plt.colorbar() # colorbar,颜色卡尺 plt.xticks(np.arange(size+1)) # 设置主图的横坐标的刻度字体大小 plt.yticks(np.arange(size+1)) # 设置主图的纵坐标的刻度字体大小 # plt.show() # 输出显示图像 # 保存result——label print('开始SOM标签Result保存!') df_winmap = pd.DataFrame.from_dict(winmap, orient='index') # 读取转换winmap ic(df_winmap) # 输出显示df_winmap writer1 = pd.ExcelWriter('SOM_label_result_'+ SheetNames[i_c] +'.xlsx', engine='openpyxl') # 读取'SOM_label_result.xlsx' book1 = load_workbook(writer1.path) # 获取文件路径 writer1.book = book1 # 赋值 df_winmap.to_excel(excel_writer=writer1, sheet_name=str(SheetNames[i_c])) # 建立为数据表 writer1.save() # 保存数据表 writer1.close() # 关闭数据表 print('SOM标签Result保存结束!') # 保存result_data print('开始SOM最终Result坐标保存!') winner = som.win_map(X_train, return_indices=True) # 获取SOM的获胜神经元结果 my_df = pd.DataFrame.from_dict(winner, orient='index') # 转换输出赋值给my_df ic(my_df) # 显示输出 writer = pd.ExcelWriter('SOM_Result_'+ SheetNames[i_c] +'.xlsx', engine='openpyxl') # 建立数据表'SOM_Result.xlsx' book = load_workbook(writer.path) # 获取文件路径 writer.book = book # 赋值 my_df.to_excel(excel_writer=writer, sheet_name=str(SheetNames[i_c])) # 保存数据表 writer.save() # 保存操作 writer.close() # 关闭操作 print('SOM最终Result坐标保存结束!')大体的流程就是这样了,minisom的库训练起来比Matlab快了不知道多少倍,⚡yyds⚡!!!
最近写的代码漏洞百出,困扰于:ValueError: cannot convert float NaN to integer虽然已经有很多大佬做了相应的解答,下面说说我遇到的问题及其解决办法吧!~存在的问题本来是要遍历一个数据列表的,源代码部分如下:for sd in slice_dt: data_sum.append(int(sd)) # 将切片的数存入单一集合simple_sum中是的,你木有看错,就这!!!然后就给我报错(由于项目保密固然打个马(•́へ•́╬))就这!就这!!就这!!!从字面意思上理解是,“不能将浮点NaN(空值)转换为整数”。意思就是遇到有空值的情况了呗!首先应该想到的是,替换。一起来搞定它思路我们有了,不就是替换嘛。直接两条语句判断干起来!for sd in slice_dt: if sd == sd: # 判断是否为空,若不为空,则运行下面语句 data_sum.append(int(sd)) # 将切片的数存入单一集合simple_sum中 else: data_sum.append(0) # 消除空值项,若为空值则填为0然后就能完美输出啦~
❤九月❤份了,车神哥又回归了校园❉冬天❉还会远吗♪推荐一首最近很⚡喜欢⚡的歌♪❀No Fear In My Heart -朴树❀由于最近在写一篇相关的论文,就说说其中遇到的一些问题吧~Minisom之前做过一个对minisom的第三方开源库的介绍,可以点击看这里。对相应的代码添加了注释:导入各种库吧# 导入库 from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report import numpy as np import matplotlib.pyplot as plt from matplotlib.patches import Patch import pandas as pd from minisom import MiniSom import math import xlrd from icecream import ic from tqdm import tqdm from openpyxl import load_workbook import openpyxl from time import time第一步是导入数据的Function,这很简单就不解释了# 传入数据成DataFrame的矩阵格式 def loaddata(datafile, num_name): df = pd.read_excel(datafile, sheet_name=num_name, index_col=0) # 导入数据 return df # 返回值由于代码不是很长,就没有按照模块来写了然后是导入源文件及其标签。说实话,在现实项目中,想要找到不同特征的标签是真的真的真的太难了!!!不要问为什么,当你实践你就知道了~# 导入原始数据 # 1.导入训练和测试数据集 datafile = "*********.xls" # 原始数据文件名 # 2.导入标签数据 y = pd.DataFrame(pd.read_csv('label****.csv')) # 读取你的标签数据或者原有的标签是最好的 yy = [] # 设置空矩阵 # 循环将标签导入yy矩阵中 for iy in range(y.shape[0]): Uy = y.iloc[iy, 0] yy.append(int(Uy)) y = yy # 赋值给y再读取每个sheet中的不同特征名称,我的数据集是这样,如果你没有特征名称,最好对其进行标记,这样会更加有效。# 3.读取特征标签 feature_names = pd.DataFrame(pd.read_excel(datafile, index_col=0)).columns # 取数据的列:特征标签 class_names = [0, 1] # 标签名称 feat = [] # 设置空矩阵 # 循环将特征名称添加到feat矩阵中 for tz in range(feature_names.shape[0]): tezh = feature_names[tz] feat.append(tezh) # 逐步添加进feat feature_names = feat # 赋值给feature_names print('特征名称:', feature_names)由于我的源文件会有很多个sheet,所以需要对每一个sheet进行训练及测试,再进行保存操作,如果你只要一个数据表的话,可以对此进行相应的改进。# 按照每一个数据Sheet读取每一层的数据 # 读取文件数据集 workbook = xlrd.open_workbook(datafile) # 打开数据文件 sheets = workbook.sheet_names() # 读取原始数据的数据表sheet名 SheetNames = [] # 设置空矩阵 # 循环输出 for sheetname in tqdm(sheets): print("表格的名称是:", sheetname) SheetNames.append(sheetname) # 循环添加进空矩阵SheetNames中 print('原始数据表的表单名称为:', SheetNames) num_n = pd.DataFrame(SheetNames).shape[0] # 获取表单的个数 print('表单的个数为:', num_n) # 设置空数据表1 dff = pd.DataFrame(columns=["title", "content"]) # 添加列名 dff.to_excel('SOM_Result.xlsx') # 保存到'SOM_Result.xlsx' ## 设置空数据表2 dff2 = pd.DataFrame(columns=["title1", "content1"]) # 添加列名 dff2.to_excel('SOM_label_result.xlsx') # 保存到'SOM_label_result.xlsx' start_time = time() # 记录设置开始的时间接下来也是对我的每一个表单进行循环遍历训练及其测试的过程,如果只需要进行一次,那么只需要取消循环过程,更改其中的一些变量即可。其中包含SOM的训练及测试,权值矩阵、map、聚类结果的可视化,精确度等操作。for i_c in range(num_n): if i_c < num_n: print('程序目前处在第%r层数.' % SheetNames[i_c]) XMat = loaddata(datafile, num_name=SheetNames[i_c]) # 返回得到浮点型矩阵 # 设置空数据表1 dff = pd.DataFrame(columns=["title", "content"]) # 添加列名 dff.to_excel('SOM_Result_'+ SheetNames[i_c] +'.xlsx') # 保存到'SOM_Result.xlsx' ## 设置空数据表2 dff2 = pd.DataFrame(columns=["title1", "content1"]) # 添加列名 dff2.to_excel('SOM_label_result_'+ SheetNames[i_c] +'.xlsx') # 保存到'SOM_label_result.xlsx' X = XMat.values # 将DataFrame格式改为np.array矩阵 # 划分训练集、测试集 7:3 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0) # X为原始数据,y为标签数据,test_size为训练集和测试集划分比例,random_state为选择随机打乱的方式,可设置为0或1方式 N = X_train.shape[0] #样本数量 M = X_train.shape[1] #维度/特征数量 ''' 设置超参数 ''' size = math.ceil(np.sqrt(5 * np.sqrt(N))) # 经验公式:决定输出层尺寸 print("训练样本个数:{} 测试样本个数:{}".format(N, X_test.shape[0])) print("输出网格最佳边长为:", size) max_iter = 1000 # 迭代次数 # Initialization and training(初始化及其训练) size为神经元数,M为输入维度/特征数量, learning——rate为学习率 som = MiniSom(size, size, M, sigma=3, learning_rate=0.5, neighborhood_function='bubble') # Neighborhood_function’近邻函数‘可选的设置有'gaussian'、'mexican_hat'、'bubble'. 调参的时候可以都试一遍,看效果 ''' 初始化权值,有2个API ''' som.pca_weights_init(X_train) # PCA降维初始化 som.train_batch(X_train, max_iter, verbose=False) # train_batch 每次按顺序取一个样本,用过最后一个样本后跳回第一个样本,循环直到迭代次数满足max_iter winmap = som.labels_map(X_train, y_train) # 求取获胜神经元 # 判断样本的类别 def classify(som,data,winmap): from numpy import sum as npsum # 导入库 default_class = npsum(list(winmap.values())).most_common()[0][0] # 获取获胜神经元的值 result = [] # 设置空矩阵 for d in data: # 循环迭代 win_position = som.winner(d) # 获胜神经元的权值位置 if win_position in winmap: # 判断是否属于获胜神经元 result.append(winmap[win_position].most_common()[0][0]) # 将其添加进空矩阵result中 else: result.append(default_class) # 若不满足上面的条件则将default_class添加进result中 print('输出result结果:', result) return result # 返回值 # 输出混淆矩阵 y_pred = classify(som, X_test, winmap) # 调用classify函数 print(classification_report(y_test, np.array(y_pred))) # 输出混淆矩阵 # 绘制各种图 # U-Matrix heatmap = som.distance_map() #生成U-Matrix plt.imshow(heatmap, cmap='bone_r') #miniSom案例中用的pcolor函数,需要调整坐标 plt.colorbar() # 颜色卡 plt.figure(figsize=(9, 9)) # 设置图像大小 # 背景上画U-Matrix heatmap = som.distance_map() # 热力图 plt.pcolor(heatmap, cmap='bone_r') # plotting the distance map as background 设置样式 # 定义不同标签的图案标记 markers = ['o', 's'] # 设置图案样式 colors = ['C0', 'C1'] # 定义不同标签图案的颜色 category_color = {'Normal': 'C0', 'fault': 'C1', } # 设置对应字典 for cnt, xx in enumerate(X_train): # 迭代获取X_train训练数据 w = som.winner(xx) # getting the winner # 在样本Heat的地方画上标记 plt.plot(w[0]+.5, w[1]+.5, markers[y_train[cnt]], markerfacecolor='None', markeredgecolor=colors[y_train[cnt]], markersize=12, markeredgewidth=2) # plot绘制图像,markerfacecolor:标记颜色,markersize:标记尺寸,markeredgewidth:标记宽度 plt.axis([0, size, 0, size]) # 设置坐标系 ax = plt.gca() # 进行坐标轴的移动,gca就是get current axes ax.invert_yaxis() #颠倒y轴方向 legend_elements = [Patch(facecolor=clr, edgecolor='w', label=l) for l, clr in category_color.items()] plt.legend(handles=legend_elements, loc='center left', bbox_to_anchor=(1, .95)) # 设置图像界面细节 # plt.show() # 显示图 label_name_map_number = {"Normal":0,"Fault":1} # 神经元占比饼图 from matplotlib.gridspec import GridSpec plt.figure(figsize=(9, 9)) # 设置图像界面大小 the_grid = GridSpec(size, size) # 神经元个数 for position in winmap.keys(): # 迭代获取获胜神经元位置 label_fracs = [winmap[position][label] for label in [0,1]] # 获取标签 plt.subplot(the_grid[position[1], position[0]], aspect=1) # 表示把显示界面分割成the_grid[position[1]*position[0]的网格 patches, texts = plt.pie(label_fracs) # 用于绘制饼图 plt.text(position[0]/100, position[1]/100, str(len(list(winmap[position].elements()))), color='black', fontdict={'weight': 'bold', 'size': 15}, va='center', ha='center') # 给图中加标签 plt.legend(patches, class_names, loc='center right', bbox_to_anchor=(-1, 9), ncol=3) # 显示图中的各种标签 # plt.show() # 输出显示图像 # 权重热力图 plt.figure(figsize=(10, 10)) # 设置图像大小 for i, f in enumerate(feature_names): # 迭代循环获取feature_names特征 plt.subplot(4, 4, i+1) # 表示把显示界面分割成 4*4 的网格 plt.title(f) # 设置标题 W = som.get_weights() # 获得权重数据 plt.imshow(W[:,:,i], cmap='coolwarm') # 输出热力图,W[:,:,i]变量存储图像,可以是浮点型数组、unit8数组以及PIL图像,参数cmap用于设置热图的Colormap,代表热力块的样式颜色 plt.colorbar() # colorbar,颜色卡尺 plt.xticks(np.arange(size+1)) # 设置主图的横坐标的刻度字体大小 plt.yticks(np.arange(size+1)) # 设置主图的纵坐标的刻度字体大小 # plt.show() # 输出显示图像 # 保存result——label print('开始SOM标签Result保存!') df_winmap = pd.DataFrame.from_dict(winmap, orient='index') # 读取转换winmap ic(df_winmap) # 输出显示df_winmap writer1 = pd.ExcelWriter('SOM_label_result_'+ SheetNames[i_c] +'.xlsx', engine='openpyxl') # 读取'SOM_label_result.xlsx' book1 = load_workbook(writer1.path) # 获取文件路径 writer1.book = book1 # 赋值 df_winmap.to_excel(excel_writer=writer1, sheet_name=str(SheetNames[i_c])) # 建立为数据表 writer1.save() # 保存数据表 writer1.close() # 关闭数据表 print('SOM标签Result保存结束!') # 保存result_data print('开始SOM最终Result坐标保存!') winner = som.win_map(X_train, return_indices=True) # 获取SOM的获胜神经元结果 my_df = pd.DataFrame.from_dict(winner, orient='index') # 转换输出赋值给my_df ic(my_df) # 显示输出 writer = pd.ExcelWriter('SOM_Result_'+ SheetNames[i_c] +'.xlsx', engine='openpyxl') # 建立数据表'SOM_Result.xlsx' book = load_workbook(writer.path) # 获取文件路径 writer.book = book # 赋值 my_df.to_excel(excel_writer=writer, sheet_name=str(SheetNames[i_c])) # 保存数据表 writer.save() # 保存操作 writer.close() # 关闭操作 print('SOM最终Result坐标保存结束!')大体的流程就是这样了,minisom的库训练起来比Matlab快了不知道多少倍,⚡yyds⚡!!!
今天算是⚡正式开学⚡了~一年过得真快,这就研二了o(╥﹏╥)o呜呜呜。。。怎么就开学了(我还没放假呢).❤更新一篇Blog打卡一下吧!❤⚡新学期⚡,⚡新气象⚡,⚡新风貌⚡来迎接新挑战!!!加油!!!搜罗了很多正则化(Regularization)的解释,发现在不同的地方有着不同的含义却又有着相似的味道。下面,来细品!定义正则化(regularization),是指在线性代数理论中,不适定问题通常是由一组线性代数方程定义的,而且这组方程组通常来源于有着很大的条件数的不适定反问题。大条件数意味着舍入误差或其它误差会严重地影响问题的结果。(来源自网络)正则化:代数几何中的一个概念。通俗定义给平面不可约代数曲线以某种形式的全纯参数表示。如上图为一个平面,为不可约代数曲线,用纯参数的多项式来表示此曲线,有点像线性回归,但又没有线性回归做的那么好。为什么取图片中的红色点呢,看下面的广义定义。严格定义设C是不可约平面代数曲线,S是C的奇点的集合。如果存在紧Riemann面C及全纯映射σ:C→PC^2,使得σ(C*)=Cσ^(-1)(S)是有限点集 (3) σ:C*\σ^(-1)(S)→C\S是一对一的映射则称(C*,σ)为C的正则化。不至于混淆的时候,也可以称C*为C的正则化。正则化的做法,实际上是在不可约平面代数曲线的奇点处,把具有不同切线的曲线分支分开,从而消除这种奇异性。上面图中的红点,可看出奇点,如图可知,奇点处于曲线中单调的线上,前后则是局部极值。从数学角度来说,所谓奇异性就是指函数的不连续或导数不存在,表现出奇异性的点称为奇异点。而此处则表现为导数不存在的情况。则为了消除这种奇异性,而提出了正则化的方法。解决的问题正则化就是对最小化经验误差函数上加约束,这样的约束可以解释为先验知识(正则化参数等价于对参数引入先验分布)。约束有引导作用,在优化误差函数的时候倾向于选择满足约束的梯度减少的方向,使最终的解倾向于符合先验知识(如一般的l-norm先验,表示原问题更可能是比较简单的,这样的优化倾向于产生参数值量级小的解,一般对应于稀疏参数的平滑解)。同时,正则化解决了逆问题的不适定性,产生的解是存在,唯一同时也依赖于数据的,噪声对不适定的影响就弱,解就不会过拟合,而且如果先验(正则化)合适,则解就倾向于是符合真解(更不会过拟合了),即使训练集中彼此间不相关的样本数很少。由于加了正则化项,原来不可逆的Hessian矩阵也变的可逆了。深入拓展提到正则化,现在一般都会联想到机器学习。在Machine Learning(下面都用简称ML)中, 若参数过多,模型过于复杂,则会容易造成过拟合(overfitting)。即模型在训练样本数据上表现的很好,但在实际测试样本上表现的较差,不具备良好的泛化能力。解决方法: 为了避免过拟合,最常用的一种方法是使用正则化,例如 L1 和 L2 正则化。L1、L2正则化在SVM(支持向量机)中,会引入一个叫做软间隔的概念,简单来说就是,在假定训练样本在样本空间中是线性可分的,也即为存在一个超平面可将其不同类的样本给完全分离开来。在现实中,很难确定合适的核函数使得训练样本在特征空间中线性可分,就算是可以找到这样一个核函数,但也不知道其可分的结果是否是由于过拟合造成的。如下图,为了缓解这样的问题,则想了个办法,就算将约束项给扩大,但也不是扩大到将所有样本都能够正确的划分,如果是这样的话,这就是“硬间隔”的概念了。故“软间隔”只是允许某些样本可不需要满足约束条件,扩大到能包含一些重要的样本特征就足够了。软间隔示意图,红色圈出了不满足约束的样本--图片源自《机器学习》周志华则会在优化的目标后面增加损失函数的惩罚项,如现在回到正则化中。在上面的惩罚项中大体可看做为L1正则化(具体为0/1损失函数),使用L1正则化的模型建叫做Lasso回归,使用L2正则化的模型叫做Ridge回归(岭回归)。正则化的功能关于正则化操作的意义或者说作用,大部分的Paper或者学者的理解:L1正则化可以产生稀疏权值矩阵,即产生一个稀疏模型,可以用于特征选择。L2正则化可以防止模型过拟合(overfitting);一定程度上,L1也可以防止过拟合。关于稀疏权值矩阵,最开始我也很懵逼,从字面上也很难理解到其中的意义。稀疏矩阵简单来说,稀疏矩阵指的是很多元素为0,只有少数元素是非零值的矩阵,即得到的线性回归模型的大部分系数都是0。此处引用一个很好的解释。机器学习中特征数量很多,例如文本处理时,如果将一个词组(term)作为一个特征,那么特征数量会达到上万个(bigram)。在预测或分类时,那么多特征显然难以选择,但是如果代入这些特征得到的模型是一个稀疏模型,表示只有少数特征对这个模型有贡献,绝大部分特征是没有贡献的,或者贡献微小(因为它们前面的系数是0或者是很小的值,即使去掉对模型也没有什么影响),此时我们就可以只关注系数是非零值的特征。这就是稀疏模型与特征选择的关系。(源自网络)这里让我想到了PCA的特征提取,通过对不同特征的贡献度不同来进行选择。生成稀疏权值矩阵的话,可以进一步的细化特征的选择。关于L1、L2的直观理解可以看这位大佬的。关于L1比L2正则化更容易获得稀疏解从上面大佬的直观图解中其实也能看出点眉目,还是搬运一下下吧。所以说,为了获得稀疏权值或者说稀疏解,我们在更好的选择是加上L1正则化惩罚项。
⚡最近很烦⚡有一阵子没更新了,感觉整个暑假被忽悠了,六月份找Boss指明了一个Direction,然后整个暑假都在忙于补充Proposal相关的Knowledge,但是,被忽悠局局长Boss给忽悠了(谁人能明白其中的难受),干工科的master怎么可能不依靠数据,本来就知道拿不到数据,还跟着让指哪儿打哪儿,最终项目还是拿不到,唉~,Project always Project(Boss),一心就只有Project,这还让等到Sep去Proposal,调研的都白费了,谁爱去Proposal谁去。终究或许还是自己太菜了。Sometimes one pays most for the things one gets for nothing.最近看到算法比较多,其中发现一个FGD(Feasible Gradient Direction)方法,可行梯度方向法,很是疑惑,到处寻找答案,找不到。和Zoutendijk可行方向法相比好像又有所区别,下面根据Paper的SEDA(sparse exponential discrimination analysis)稀疏指数判别分析算法求解其目标函数进行解释一下(菜鸡的自我修养)。背景首先,先介绍一下背景,之前出过一篇LDA的解释Blog,LDA主要用于降维和简单分类,在多分类问题上比较有用。在过去的几十年里,针对LDA方法提出过很多中改进的方法,如惩罚判别分析(PDA)、两阶段主成分判别分析(PCA+LDA)、零空间LDA(NLDA)、指数判别分析(EDA)、灵活判别分析(FDA)、混合判别分析(HDA)、稀疏判别分析(SDA)等等…一系列改进方法。最近研究到一篇是关于对指数判别分析(EDA)的改进方法—稀疏指数判别分析(sparse exponential discrimination analysis,SEDA)。简单来说一下作者的改进路线。EDA而改进的EDA的目标函数长这样:注意,其中此为改进的地方,可使用类间距离与类内距离的比率来评估判别分析方法的性能。SEDA现在我们加上EDA的约束条件,将其进一步等价为,加上lasso(套索)惩罚后得到SEDA,其中,γ为一个非负调谐参数,应予以指定。一般来说,随着lasso惩罚因子γ的增加,SEDA算法的模型可解释性和判别性能有所提高,但当γ 超过一定程度时,情况正好相反。(中间过程过于复杂已忽略)最终变形为下面这样的目标函数(为凸函数,原本为非凸函数,估计是为了增加一个创新点吧或许,本来可以直接拉格朗日干起来,搞非凸函数求其最优解,现在改进使用最小化-最大化(MM)算法将其重新表达为一个迭代凸优化问题变为凸函数,学到了):可行梯度方向法这里主要针对稀疏判别优化的可行梯度方向法,将(*)式的约束优化问题转变为无约束优化问题,(公式太多了,就不打公式了哈)上式的Hessian矩阵显然是对称正定的。因此,上式的无约束优化问题是严格凸的,这意味着其极值点对应于最优解。首先将上式的优化问题简化为一个标准的二次规划问题,然后利用一种可行的梯度方向法来有效地求解该问题。将上式进行进一步优化,同理,原无约束优化函数变为,再将二次项重新表述为,同样的,因此,无约束优化的问题可以简化为一个标准的二次规划(二次规划凸优化有个好处,就是,局部最优解即为全局最优解),其中,下面是关于可行梯度方向法的核心观点:可行梯度方向法示意图其中,τ表示为
事情是这样的,就是某天在本菜日常"飙车"回宿舍的途中,想着曾经有个项目在对数据进行预处理的时候,用过一个操作,本来就已经对数据进行了标准化处理,然而在甲方(注意这里是万恶之源)对我算法代码的阅读时提出了,没有进行归一化处理的疑惑,顿时间,我想了想,好像是这么一回事哈,一个转身像超人一样消失在甲方面前,回去加了两行代码(归一化处理),跑完发现,咦~~好像真的效果提高了不少诶。故引发了我对下面的内容的思考,并想多说两句,望各位看官批评指点!!!(上面不算,不能计时哈o(╥﹏╥)o)其实有很多博主已经做了对标准化、归一化和中心化的理解介绍,但我始终感觉还是有一一点的繁琐,下面 本菜鸡 就尝试⚡一分钟⚡让你搞懂标准化、归一化和中心化,且他们的适用场景!指明一点其中标准化和归一化其实都属于特征缩放(Feature scaling)的方法,被人误解很久(估计是翻译问题),下面只讲简单的标准化和归一化,复杂的在后续Blog呈现。(o(╥﹏╥)o上面也不算哈,不能计时呀o(╥﹏╥)o)标准化(Standardized)简单粗暴的定义:将数据按比例缩放,使之落入一个小的特定区间,缩放到均值为0,方差为1。首先,上公式,参考sklearn的数据预处理官方文档,这里引用一下假设的身高和体重数据特征,且均满足正态分布原始数据集当我们通过标准化后,得到的为,标准化后的数据可见标准化后也同样满足正态分布,可以看出每个维度上的尺度是一致的,适合进行综合对比。适用范畴:常用于数据之间差异过大。归一化(Normalization)简单的归一化指的就是,缩放到0和1之间,且保留原始数据的分布。同样,简单归一化后的数据为,归一化数据的分布不变,去除了量纲的影响,缩小到(0,1)之间。适用范畴:主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速。提高收敛速度,提高模型精度。中心化处理(Decentralized)在回归分析中,中心化处理(又叫零均值化)常常指的是将变量减去它的均值,可得到均值为0,标准差为1的服从标准正态分布的数据。简单来说就是将数据平移到坐标中心原点处。引用一张网络上的元老级图来解释中心化和标准化左边为原始数据,中间为中心化处理,右边则为标准化处理数据。中心化处理后的数据则是以原点为基准的,对向量也更容易描述。在做PCA时有所用到。
在故障诊断中,我们常常会面对大量的且维数很高的数组,通过我们需要先对数据集进行划分及预处理,而预处理阶段极为重要的一步就是对数据进行降维特征提取,通过某种数学变换将原始高维空间转变成一个低维的子空间。然鹅,我们常用到的基本就只有两个,一个是主成分分析(PCA),另一个则是今天所要介绍的Fisher判别分析(Fisher Discriminant Analysis,FDA)。主成分分析的基本思想:设法将原来众多具有一定相关性(比如P个指标,即主成分),重新组合成一组新的互相无关的综合指标来代替原来的指标。通过寻找在最小均方误差(Mean Square Error,MSE)下的最具代表性的投影向量,再用这些向量来表示数据。Fisher判别分析的基本思想:利用已知类别的样本建立判别模型,对未知类别的样本进行分类。在最小均方误差(也就是最小二乘法MSE)意义下,寻找最能分开各个类别的最佳方向。最先的是提出的线性判别法(Linear Discriminant Analysis,LDA),这还是一种经典的线性学习方法。在降维方面LDA是最著名的监督学习降维方法。但是,在二分类问题上,因为最早是有(Fisher,1936)提出的,因此也被称为是“Fisher判别分析(Fisher Discriminant Analysis,FDA)”。其实LDA和FDA两种判别分析方法,是略有不同的。其中LDA则假设了各类样本数据的协方差矩阵相同,且满秩。线性判别分析(LDA)及Fisher判别分析(FDA)LDA的思想:由所给定的数据集,设法将样例数据投影在一条直线上,使得同类数据的投影点尽可能的接近、而异类数据的投影点之间将可能间隔更远。在我们做新样本数据的分类时,将其投影到同样的直线上,再根据投影点的位置来确定新样本的类别。如下图(源自周志华《机器学习》)所示:这里的投影直线也用到了最小二乘的思想,所有数据样本垂直投影在直线上,只是我们的约束条件表为了不同数据样本之间的投影在直线上的距离度量。我们需要寻找到在投影方向w ww上,使得数据样本满足两个条件:1) 相同数据之间投影距离最小;2)不同数据之间投影点位置最大(可通过求其不同数据的投影中心点来判别)LDA二维示意图图中,“+”和“-”代表的是两种不同的数据簇,而椭圆表示数据簇的外轮廓线,虚线表示其投影,红色实心圆●和红色实心三角形△分别代表的两类数据簇投影到w 方向上的中心点。下面思考另一个问题,如何让同类的数据样本投影点尽可能的靠近,而使得不同样本投影点离得更远呢?这里需要引入协方差的概念,小小复习一下协方差及样本方差的知识(因为本菜鸡数学基础差)协方差(Covariance)在概率论和统计学中用于衡量两个变量的总体误差。而方差是协方差的一种特殊情况,即当两个变量是相同的情况。上面的Σ 0 、 Σ 1因为是自协方差也就是代表方差(也即为样本方差)。方差:当数据分布比较分散(即数据在平均数附近波动较大)时,各个数据与平均数的差的平方和较大,方差就较大;当数据分布比较集中时,各个数据与平均数的差的平方和较小。总的说来:方差越大,数据的波动越大;方差越小,数据的波动就越小。协方差表示的是两个变量的总体的误差,这与只表示一个变量误差的方差不同。 如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。 如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。简而言之:两个变量之间差距越大,协方差就越小;相反,两个变量越相似变化趋势一致,则协方差越大。复习完协方差、样本方差的知识后,解决上面的问题应该不难。引入一下类内和间散度矩阵的知识:类间散度矩阵用于表示各样本点围绕均值的散布情况。类内散度矩阵用于表示样本点围绕均值的散步情况,关于特征选择和提取的结果,类内散布矩阵的积越小越好。具体可参考这里,还有这里。首先,我们来定义“类内散度矩阵”(within-class scatter matrix)“类间散度矩阵”(between-class scatter matrix):然后我们的J 可以表示为下面开始构建我们的函数及约束条件。由拉格朗日乘数法(具体可参考CCA中Lagrange的应用)可得,其中,λ为拉格朗日乘子。LDA还可从贝叶斯决策理论的角度来描述(关于贝叶斯可参考这里),可证明,当两类数据同先验、满足高斯分布(正态分布)且协方差相等时,LDA可以达到最优的分类效果。上述讲了这么多都是二分类问题,那么关于多分类任务。LDA推广(多分类任务)其中,由上式可得到,上式可由如下的广义特征值问题求解:从上图中可容易理解PCA和LDA。可看出PCA多满足高斯分布,投影了最具代表性的主成分分量;而LDA如上所述,投影下来使其更容易区分出各类别之间的最佳方向。
过程监控中会用到很多中方法,如主成分分析(PCA)、慢特征分析(SFA)、概率MVA方法或独立成分分析(ICA)等为主流算法。其中PCA主要多用于降维及特征提取,且只对正太分布(高斯分布)数据样本有效;SFA被用来学习过程监控的时间相关表示,SFA不仅可以通过监测稳态分布来检测与运行条件的偏差,还可以根据时间分布来识别过程的动态异常,多用于分类分析;概率MVA方法,多以解决动力学、时变、非线性等问题。今天要介绍的是独立成分分析(ICA),由浅入深,细细道来。此外文末还附有ICA可实现的代码哟~不要错过独立成分分析(Independent Component Analysis,ICA)基本原理在信号处理中,独立成分分析(ICA)是一种用于将多元信号分离为加性子分量的计算方法。这是通过假设子分量是非高斯信号,并且在统计上彼此独立来完成的。ICA是盲源分离的特例。一个常见的示例应用程序是在嘈杂的房间中聆听一个人的语音的“ 鸡尾酒会问题 ”。首先,引入一下经典的鸡尾酒宴会问题(Cocktail Party Problem)。假设我们令一个未知的混合系数矩阵(mixing coefficient matrix)为A ,用来组合叠加信号S ,ICA的不确定性(ICA ambiguities)由于h 和s 都不确定,那么在没有先验知识的情况下,无法同时确定这两个相关参数。ICA 算法下面直接上ICA算法。独立成分分析 ICA(Independent Component Correlation Algorithm)是一种函数,X为n维观测信号矢量,S为独立的m(m<=n)维未知源信号矢量,矩阵A被称为混合矩阵。ICA的目的就是寻找解混矩阵W(A的逆矩阵),然后对X进行线性变换,得到输出向量U。此公式代表一个假设前提:每个人发出的声音信号各自独立。求导可得,举个Paper的栗子下面为我们观测到的信号:然后,再通过ICA还原后的信号为:MATLAB代码实现MATLAB代码:Fast ICA% Input:X 行变量维数,列采样个数;需要对原始矩阵转置 % Output:Sources重构的原信号, Q白化矩阵, P白化信号解混矩阵 function [Sources, Q, P] = FastICA(X, P) % 白化处理 [dim, numSample] = size(X); Xcov = cov(X'); [U, lambda] = eig(Xcov); Q = lambda^(-1/2)*U'; Z = Q*X; % FastICA maxiteration = 10000; %最大迭代次数 error = 1e-5; % 收敛误差 % P = randn(dim,dim); % 随机初始化P,并按照列更新 for k = 1:dim Pk = P(:,k); Pk = Pk./norm(Pk); % 向量归一化 lastPk = zeros(dim,1); % 0不需要再归一化 count = 0; while abs(Pk - lastPk)&abs(Pk + lastPk) > error count = count + 1; lastPk = Pk; g = tanh(lastPk'*Z); % g(y)函数 dg = 1 - g.^2; % g(y)的一阶导函数 %-------------------------------核心公式------------------------------------ Pk = mean(Z.*repmat(g,dim,1), 2) - repmat(mean(dg),dim,1).*lastPk; Pk = Pk - sum(repmat(Pk'*P(:,1:k-1),dim,1).*P(:,1:k-1),2); Pk = Pk./norm(Pk); %-------------------------------------------------------------------------- if count == maxiteration fprintf('第%d个分量在%d次迭代内不收敛!\n',k,maxiteration); break; end end P(:,k) = Pk; end Sources = P'*Z; % end 此外还有基于故障诊断的ICA算法代码实现->在这里下面给出部分代码:% 基于ICA的故障诊断 clear;clc;close all; load('MPD2000.mat'); Xnormal = MPD0'; % 数据归一化 [dim, numSample] = size(Xnormal); XnormalMean = mean(Xnormal, 2); XnormalStd = std(Xnormal, 0, 2); XnormalNorm = normalization(Xnormal, XnormalMean, XnormalStd); % 正常数据计算 解混矩阵W % P = rand(dim,dim)*100; load('P.mat'); [S, Q, P] = FastICA(XnormalNorm, P); W = P'*Q; % ------------------------利用2范数大小对W的行重新排列--------------------- Wnorm = zeros(dim,1); for k = 1:dim Wnorm(k) = norm(W(k,:)); end [Wnorm, indices] = sort(Wnorm, 'descend'); % -------------------------确定主导成分Sd与参与成分Se---------------------- threshold = 0.80; percentage = cumsum(Wnorm)./sum(Wnorm); for k = 1:dim if percentage(k) > threshold break; end end效果如下:
最近学习机器学习,项目也有用到分类,用到了Softmax函数。相信很多小伙伴都会用到。简单说来,Softmax⟶ \longrightarrow⟶归一化指数函数。为什么说是指数函数呢?下面来看一下当我们在做回归的时候左边是我们的估计值和输出,右边使我们的回归模型当我们需要做分类的时候,左边的估计值标签只有0-1,而我们得到的y 的值会有正有负,有大有小,若这样得到的损失函数L 则会有很大的偏差,影响分类效果故引入了Softmax函数,将y 的值归一化到0-1之间。将y 归一化的Soft-max函数公式:且具体图解如下:CautionSummarySoftmax 让输入归一化到0-1之间。归一化后的值比原本的值之间的差距更大。
数据驱动过程监控或统计过程监控(SPM)将多元统计和机器学习方法应用于工业过程操作和生产结果的故障检测和诊断,复杂工业过程监控及诊断主要有一下几个步骤:(i)故障检测;(ii)故障识别或诊断;(iii)无故障估计值和无故障估计值;和(iv)产品质量监控。数据驱动过程监控中的许多基础和高级问题,包括故障检测、识别、重构和诊断。故障重构有可以理解为故障识别的一部分,今天介绍一下故障重构。异常过程操作条件的特点是意外的变化,这些变化偏离了根据正常数据建立的模型。PCS中捕获的数据相关性决定了变量之间的通常关系。因此,当这些关系被破坏或超出其正常变化范围时,会检测到异常操作条件。检测到故障后,需要诊断和识别故障源,并采取必要措施纠正异常情况。通过在错误数据中应用校正来估计正常值的过程称为重构;对于给定类型的故障,通过重构识别故障的过程称为通过重构识别。通过沿故障方向估计故障大小,可以从故障测量中重建无故障数据。因此,接下来讨论故障重构,然后通过重构进行故障识别。基于SPE的故障重构重构的测量向量为在剩余空间中使用故障模型,可以直接写做,重建的SPE变成:具有重建后故障消除的效果。这些关系可用于进一步的故障识别和分析。基于组合指标的故障重构如果重建目标应使SPE和T2最小化,则重建向量的组合指标应最小化,且目标函数定义为,通过最小化上述组合指标,得到最优重构使用故障模型,可以直接得到,在重建后,断层的影响被消除。基于ϕ 的重建意味着故障在PCS和RS中都得到了纠正。这种情况的一个特例是以Hotelling的T2为目标进行重建。然而,这不是一个明智的选择,因为它不强制重构向量以保持模型中的相关性。
随着对数据驱动的工业检测与诊断方法的逐步深入,过程监测的多元统计需要总结的东西越来越多,那么今天来整理一下。内容较多,理论较复杂,建议细品,你品!最好推一遍~It’s time to conclude PLS!!!PCA和偏最小二乘(PLS)是从数据中描述正常情况的首选方法。天气热,冰凉一下吧~偏最小二乘法(PLS)基本原理偏最小二乘多用于寻求两个矩阵(X和Y)的基本关系,也就是一种在这两个向量空间中对协方差结构建模的隐变量方法。偏最小二乘模型将试图找到X空间的多维方向来解释Y空间方差最大的多维方向。偏最小二乘回归特别适合当预测矩阵比观测的有更多变量,以及X的值中有多重共线性的时候。通过投影预测变量和观测变量到一个新空间来寻找一个线性回归模型。公式偏最小二乘回归 ≈ ≈≈ 多元线性回归分析 + ++ 典型相关分析 + ++ 主成分分析特点与传统多元线性回归模型相比,偏最小二乘回归的特点是:(1)能够在自变量存在严重多重相关性的条件下进行回归建模;(2)允许在样本点个数少于变量个数的条件下进行回归建模;(3)偏最小二乘回归在最终模型中将包含原有的所有自变量;(4)偏最小二乘回归模型更易于辨识系统信息与噪声(甚至一些非随机性的噪声);(5)在偏最小二乘回归模型中,每一个自变量的回归系数将更容易解释。在计算方差和协方差时,求和号前面的系数有两种取法:当样本点集合是随机抽取得到时,应该取1/(n-1);如果不是随机抽取的,这个系数可取1/n。在过程监控中,PLS类型的监控,包括非线性PLS,使用质量数据指导过程数据的分解,并提取与产品质量最相关的潜在变量。由于使用了质量数据,在质量相关性方面的诊断能力得到了增强,误报率降低。首先让我们回顾一下 CCA 的知识。在CCA中,我们将X和Y分别投影到直线得到U和V,然后计算u和v的Pearson系数(也就是Corr(u,v)),认为相关度越大越好。形式化表示:PLS算法看似比CCA的简单,这里附上CCA的目标函数:上面CCA是一次求解的过程,而我们的PLS回归只是对目前的第一主成分做了优化计算,剩下的主成分还得再计算。关于优化的目标求解的办法,和CCA一样,也是引用了拉格朗日乘数法来求解。(下面给出详细计算步骤)首先,引入拉格朗日乘子:PLSR 回归算法让我们回到上面的介绍,从新建立我们的回归方程:这里的c 和d 不同于上面的p 和q ,但是它们之间有一定联系,待会下面证明。其中,E 和G 是残差矩阵。然后,进行以下几步操作:计算得到第二组回归系数:从上一步得到回归方程:若还有残差矩阵的话,可以继续计算下去。如此计算下去,最终得到:到此,所有的PLSR回归模型的计算结束,下面再度请出我的灵魂画手,来言简意赅的总结一下上述流程:手绘大致流程图PLS 模型虽然类似PCA的过程监控可以检测和诊断过程数据中的异常情况,但它无法判断检测到的异常情况是否会导致产品质量问题。这是PCA从业者经常提出的投诉,如监测和干扰警报,若检测到的过程故障最终不会导致质量问题,则会发生。为了检测与质量相关的过程问题,PLS模型用于利用质量输出数据中的信息划分输入数据空间,如下图所示。PLS还将输入空间划分为以PLS分数为特征的主子空间和与分数互补的剩余子空间。早期文献表明,主子空间由T2监控,T2被认为反映了与Y相关的主要变化,剩余子空间由Q监控,Q被认为包含与输出Y无关的变化。为了计算新数据样本x上的模型估计值和残差,PLS模型将斜投影引入输入数据空间CPLS 模型(潜在结构的并行投影)最近读的一篇Paper提出了一种并行PLS(CPLS)算法和相关监测指标,以提供对输出变化的完整监测,并将输入数据空间简洁地分解为输出相关子空间和输入相关子空间。下面具体介绍模型建立的思路。为了提供质量数据和过程操作数据的完整监控方案,提出了一种并行PLS(CPLS)模型,以实现三个目标:(i)从标准PLS投影中提取与输出的可预测变化直接相关的分数,形成协变量子空间(CVS)(ii)将不可预测的输出变化进一步投影到输出主子空间(OPS)和输出剩余子空间(ORS),以监测这些子空间中的异常变化;和(iii)将与预测输出无关的输入变化进一步投影到输入主子空间(IPS)和输出子空间(IRS),以监测这些子空间中的异常变化。基于CPLS算法,数据矩阵X和Y分解如下:给出了CPLS的模型关系。根据上面给出的CPLS模型,设计故障监测指标非常简单。输出相关得分可通过以下方法进行监控:并行 PLS 算法将原始数据缩放为零平均值和单位方差,得到X和Y。使用(1)对X和Y执行PLS,得出T、Q和R。PLS因子l的数量通过交叉验证确定。
最近研究的故障检测新的方法,发现一个基于故障重构的贡献方法,准确的说是一种基于沿变量方向重建故障检测指标的贡献分析新方法。在检测到导致故障检测指标超出控制极限的故障情况后,沿每个变量方向使故障检测指标最小化的重构量被定义为该变量的基于重构的贡献(RBC)。Reconstruction Based Contribution(RBC)RBC方法在几个方面优于传统的贡献图。结果表明,即使在传感器故障的情况下(将其作为简单故障进行了讨论),传统的贡献图也不能保证故障传感器具有最大的贡献,无论故障大小如何。进一步表明,RBC保证了正确的诊断,因为故障变量的贡献最大。这些结论通常适用于SPE指数、霍特林指数和组合指数。这很方便,因为传统的贡献没有很好的定义。基于贡献图和RBC的故障诊断能力传统的贡献图和RBC方法的目的不是在故障发生时唯一地识别故障。它们用于选择因故障情况而具有最大贡献的变量子集,然后检查那些具有较大贡献的变量以进行故障诊断。然而,据报道,贡献图具有从一个变量到另一个变量的断层涂抹效应。因此,了解故障点的重要性何时足以导致误诊是很有意思的。为了分析误诊的可能性,考虑了变量J JJ中的一个简单故障的情况。该故障对SPE指数的第i 个贡献为因此,变量j中故障的影响被涂抹到变量i的RBC中。这一结果表明,即使对于简单的故障,传统的贡献图也无法避免误诊。论文Alcala和Qin(2009)对聚酯薄膜工艺进行了工业案例研究,结果表明,对于除综合指数外的所有指数,RBC法给出的正确诊断率均大于传统贡献法给出的正确诊断率。此外,当从每个故障案例中提取并使用过程故障方向时,RBC方法给出的正确诊断率更高。当组合指数与RBC方法结合使用时,可获得最大的正确诊断率。
读Paper读的头炸(原因:太菜),坚持每天简单通俗总结一下!故障检测是多变量过程监控的第一步。通常,SPE(或Q-统计量)和霍特林的T2指数分别用于监测RS和PCS的正常变异性。应注意的是,PCA或PLS建模不要求数据为高斯分布。高斯假设仅用于推导故障检测指数的适当控制限值。此外,在推导控制限值时,不需要样本的时间独立性,因为仅指定I类错误来控制假警报率。当涉及II类错误时,监测测量的时间独立性是必要的,即未检测到的故障率。当测量值假设为高斯分布时,通常适合使用马氏距离来定义故障检测的正常区域,例如,在主分量子空间中。然而,由于过程数据通常高度相关,这使得剩余分量的方差接近于零,因此在RS中使用马氏距离将是病态的。因此,Q统计量或SPE使用欧几里德距离来定义故障检测的正常区域。由于这两个指标的互补性,还提出了用于故障检测和诊断的组合指标。以下,我总结了这些故障检测指标。平方预测误差(Squared prediction error,SPE)SPE指数测量样本向量在剩余子空间上的投影,如果出现以下情况,则该过程视为正常霍特林统计量(Hotelling’s T2)综合指标(Combined Indices)在实践中,有时最好使用一个指标而不是两个指标来监控流程。有的论文中建议采用组合统计,但不给出控制限。其中,其中系数
纯理论推导,建议慢食!!!建议推一遍公式,挺好的。主成分分析(PCA Model, PM)PCA是一种统计方法,广泛应用于工程和科学应用中,与傅里叶分析相比,尤其适用于质量监测。其中,残差向量:且动态主成分分析(Dynamic PCA Models, DPM)同样的PCA分解可以扩展到表示时间相关的动态过程数据,通过传递函数矩阵提取与测量向量相关的潜在变量。在潜变量建模中,测量变量不分为输入变量和输出变量。相反,所有变量都与许多潜在变量相关,以表示它们的相关性。扩展变量向量可以定义为PCA潜在变量得分可根据(5)计算,如下所示:由(10) 可以用传递矩阵的形式表示,
上次说到典型相关分析,在故障诊断邻域用及,下面来实操。这里是几个数据集下载及相关文档的Link:MATLAB代码:http://depts.washington.edu/control/LARRY/TE/download.html#Basic_TE_Code卡玛拉姆/田纳西-伊士曼-prof Braatz——GitHub:https://github.com/camaramm/tennessee-eastman-profBraatz标准的正常和故障数据集来自 Washington大学网站:http://brahms.scs.uiuc.eduTE田纳西-伊斯曼(TE)仿真平台依据实际化工反应过程,美国 Eastman 化学公司开发了具有开放性和挑战性的化工模型仿真平台-Tennessee Eastman(TE)仿真平台,其产生的数据具有时变、强耦合和非线性特征,广泛用于测试复杂工业过程的控制和故障诊断模型。(这个介绍感觉都介绍烂了⟶ \longrightarrow⟶来自网络)图1.TE过程流程图TE(Tennessee Eastman) Benchmark 实验平台是模拟美国 Eastman 化学公司一个实际的化工联合反应过程。该平台是一个开放的非常具有挑战性的化工模型试验平台, 主要由连续搅拌式反应釜、 分凝器、 气液分离塔、 汽提塔、 再沸器和离心式压缩机等多个操作单元组成, 该过程的流程示意图如图 1 所示。三种气体反应剂 A、 D 和 E 直接进入反应釜。进料 C 和一定量的进料 A 通过分凝器进入过程。更多关于TE的介绍可参考此篇Paper:WANG Yinming,YANG Jianbo,XU Donglin.Environmental impact assessment using the evidential reasoning approach[J].European Journal of Operational Research,2006,174(3):1885- 1913.TE 过程一共有 11 个操作变量和 41 个过程变量。在确定过程监测变量时, 选取常用的与过程运行状况紧密相关的几个过程变量, 其中 11 个操作变量 XMV(1) ~ XMV(11)作为输入, 分别为物料 D(流量 2)、 物料 E(流量 3)、 物料 A(流量 1)、 物料 A 和 C(流量 4)、 压缩机循环阀、 放空气阀、 分离器液体流量、 解吸塔蒸汽阀、 反应器冷水流量、 冷凝器冷水流量。成分 F、 G 和 H 作为输出变量。(源自一篇Paper)建模数据集具体可根据自己的需求来建立。运用CCA对TE过程参数进行监控,具体分析步骤在这里,我们可以得到监控的T 2 T^2T 2 统计值,检验CCA的有效性:由监测结果可知,对过程故障较为敏感,如上图中,在数据样本快达到第200个,监测到了故障,故障检测率与输入变量的操作有一定的关系,故会出现一定的偏差。
随着对CCA的深入研究,是时候对CCA进行一下总结了。本菜鸡主要研究方向为故障诊断,故会带着从应用角度进行理解。典型相关分析基本原理从字面意义上理解CCA,我们可以知道,简单说来就是对不同变量之间做相关分析。较为专业的说就是,一种度量两组变量之间相关程度的多元统计方法。关于相似性度量距离问题,在这里有一篇Blog可以参考参考。首先,从基本的入手。当我们需要对两个变量X , Y 进行相关关系分析时,则常常会用到相关系数来反映。学过概率统计的小伙伴应该都知道的吧。还是解释一下。相关系数:是一种用以反映变量之间相关关系密切程度的统计指标。相关系数是按积差方法计算,同样以两变量与各自平均值的离差为基础,通过两个离差相乘来反映两变量之间相关程度;着重研究线性的单相关系数。复习了一下大学本科概率统计知识,那么,如果我们需要分析的对象是两组或者多组向量,又该怎么做呢?CCA的数学表达我们会得到一个这样的矩阵:这样的话,我们把每个变量的相关系数都求了出来,不知道会不会和我一样觉得这样很繁琐呢。如果我们能找到两组变量之间的各自的线性组合,那么我们就只分析讨论线性组合之间的相关分析。典型相关系数:是先对原来各组变量进行主成分分析,得到新的线性关系的综合指标,再通过综合指标之间的线性相关系数来研究原各组变量间相关关系。现在我们利用主成分分析(PCA)的思想,可以把多个变量与多个变量之间的相关转化成两个变量之间的相关。典型相关分析最朴素的思想:首先分别在每组变量中找出第一对典型变量,使其具有最大相关性,然后在每组变量中找出第二对典型变量,使其分别与本组内的第一对典型变量不相关,第二对本身具有次大的相关性。如此下去,直到进行到K步,两组变量的相关系被提取完为止,可以得到K组变量。So,典型相关系数及变量的求法(一起来复习高数–拉格朗日乘数法)前提条件,我们有个计算公式,约束条件也有了,故这是一个求解条件极值题呀!!!列出我们的拉格朗日函数:也就是我们由式可得典型相关分析应用基于 CCA 的故障检测方法对于CCA应用在故障检测中,基于 CCA 的故障检测方法可以视为基于 PCA 和基于 PLS 故障检测方法的一种扩展。基本思想:是利用典型相关关系构建一个残差发生器, 通过对残差信号的评价做出故障检测的相应决策。该方法中提出了 4 个统计量, 将输入空间分为两个部分, 即与输出空间相关的子空间和与输出空间不相关的子空间;同理,将输出空间分为两个部分, 即与输入空间相关的子空间和与输入空间不相关的子空间。结合 CCA 方法, 可得:但是在实际系统中, 测量变量难免受到噪声影响, 两者之间的相关性可表示为:同理, 还可以得到另一残差向量其协方差矩阵由式(9)(11) 可以看出, 残差 r1和 r2的协方差相同。 对于故障检测, 可构造如下两个统计量:同理, 为了检测发生在输入空间且与输出不相关的那部分故障, 可构造另一统计量Python代码:## 通过sklearn工具包内置的CCA实现 import numpy as np from sklearn.cross_decomposition import CCA from icecream import ic # ic用于显示,类似于print A = [[3, 4, 5, 6, 7] for i in range(2000)] B = [[8, 9, 10, 11, 12] for i in range(2000)] # 注意在A、B中的数为输入变量及输出变量参数 # 建模 cca = CCA(n_components=1) # 若想计算第二主成分对应的相关系数,则令cca = CCA(n_components=2) # 训练数据 cca.fit(X, Y) # 降维操作 X_train_r, Y_train_r = cca.transform(X, Y) #输出相关系数 ic(np.corrcoef(X_train_r[:, 0], Y_train_r[:, 0])[0, 1]) #如果想计算第二主成分对应的相关系数 print(np.corrcoef(X_train_r[:, 1], Y_train_r[:, 1])[0, 1]) 另有一个包含可视化CCA的Python代码在 这里。Matlab代码:function[ccaEigvector1, ccaEigvector2] = CCA(data1, data2) dataLen1 = size(data1, 2); dataLen2 = size(data2, 2); % Construct the scatter of each view and the scatter between them data = [data1 data2]; covariance = cov(data); % Sxx = covariance(1 : dataLen1, 1 : dataLen1) + eye(dataLen1) * 10^(-7); Sxx = covariance(1 : dataLen1, 1 : dataLen1); % Syy = covariance(dataLen1 + 1 : size(covariance, 2), dataLen1 + 1 : size(covariance, 2)) ... % + eye(dataLen2) * 10^(-7); Syy = covariance(dataLen1 + 1 : size(covariance, 2), dataLen1 + 1 : size(covariance, 2)); Sxy = covariance(1 : dataLen1, dataLen1 + 1 : size(covariance, 2)); % Syx = Sxy'; % using SVD to compute the projection Hx = (Sxx)^(-1/2); Hy = (Syy)^(-1/2); H = Hx * Sxy * Hy; [U, D, V] = svd(H, 'econ'); ccaEigvector1 = Hx * U; ccaEigvector2 = Hy * V; % make the canonical correlation variable has unit variance ccaEigvector1 = ccaEigvector1 * diag(diag((eye(size(ccaEigvector1, 2)) ./ sqrt(ccaEigvector1' * Sxx * ccaEigvector1)))); ccaEigvector2 = ccaEigvector2 * diag(diag((eye(size(ccaEigvector2, 2)) ./ sqrt(ccaEigvector2' * Syy * ccaEigvector2)))); end
通过Matlab示例来解释偏最小二乘的原理此示例显示如何在matlab中应用偏最小二乘回归(PLSR)和主成分回归(PCR),并讨论这两种方法的有效性。当存在大量预测变量时,PLSR和PCR都是对因变量建模的方法,并且这些预测变量高度相关或甚至共线性。两种方法都将新的预测变量(称为成分)构建为原始预测变量的线性组合,但它们以不同的方式构造这些成分。PCR创建成分来解释预测变量中观察到的变异性,而根本不考虑因变量。另一方面,PLSR确实将因变量考虑在内,因此通常会导致模型能够使用更少的成分来适应因变量。加载数据加载包括401个波长的60个汽油样品的光谱强度及其辛烷值的数据集。set(gcf,'DefaultAxesColorOrder',jet(60)); plot3(repmat(1:401,60,1)',repmat(octane(h),1,401)',NIR(h,:)'); set(gcf,'DefaultAxesColorOrder',oldorder); xlabel('Wavelength Index'); ylabel('Octane'); axis('tight'); grid on使用两个拟合数据使PLSR模型拟合10个PLS成分和一个因变量。为了充分拟合数据,可能需要十个成分,但可以使用此拟合的诊断来选择具有更少成分的更简单模型。例如,选择成分数量的一种快速方法是将因变量中解释的方差百分比绘制为成分数量的函数。在实践中,在选择成分数量时可能需要更加谨慎。例如,交叉验证是一种广泛使用的方法,稍后将在本示例中进行说明。目前,上图显示具有两个成分的PLSR解释了观察到的大部分方差y。计算双组分模型的拟合因变量。plot(1:10,cumsum(100*PLSPctVar(2,:)),'-bo'); xlabel('Number of PLS components'); ylabel('Percent Variance Explained in Y');接下来,拟合具有两个主要成分的PCR模型。第一步是X使用该pca函数执行主成分分析,并保留两个主成分。然后,PCR只是这两个成分的因变量的线性回归。当变量具有非常不同的可变性时,通常首先通过其标准偏差来规范每个变量。plot(y,yfitPLS,'bo',y,yfitPCR,'r^');xlabel('Observed Response');ylabel('Fitted Response');legend({'PLSR with 2 Components' 'PCR with 2 Components'}, ... 'location','NW'); 从某种意义上说,上图中的比较并不合理 – 通过观察双组分PLSR模型预测因变量的程度来选择成分数(两个),并且没有说明为什么PCR模型应该限制相同数量的成分。然而,使用相同数量的成分,PLSR做得更好。实际上,观察上图中拟合值的水平分布,使用两个分量的PCR几乎不比使用常数模型好。回归的r方值证实了这一点。比较两种模型的预测能力的另一种方法是在两种情况下将因变量绘制成两个预测变量。plot3(Xscores(:,1),Xscores(:,2),y-mean(y),'bo'); legend('PLSR'); grid on; view(-30,30);如果不能以交互方式旋转图形,有点难以看到,但上面的PLSR图显示了紧密分散在平面上的点。另一方面,下面的PCR图显示点几乎没有线性关系。plot3(PCAScores(:,1),PCAScores(:,2),y-mean(y),'r^'); legend('PCR'); grid on; view(-30,30);请注意,尽管两个PLS成分是观察到的更好的预测因子,但下图显示它们解释的方差比例比PCR中使用的前两个主成分少。PCR曲线一致性较高的事实表明,为什么使用两种成分的PCR相对于PLSR在拟合时表现很差。PCR构建成分以便最好地解释X,因此,前两个成分忽略了数据拟合中观察到的重要信息y。拟合更多成分随着在PCR中添加更多成分,它必然会更好地拟合原始数据y,这仅仅是因为在某些时候,大多数重要的预测信息X将存在于主要成分中。例如,使用10个成分时,两种方法的残差远小于两个成分的残差。交叉验证在预测未来变量的观察结果时,选择成分数量以减少预期误差通常很有用。简单地使用大量成分将很好地拟合当前观察到的数据,但这是一种导致过度拟合的策略。过于拟合当前数据会导致模型不能很好地推广到其他数据,并对预期误差给出过度乐观的估计。交叉验证是一种统计上更加合理的方法,用于选择PLSR或PCR中的成分数量。它通过不重复使用相同的数据来拟合模型和估计预测误差来避免过度拟合数据。因此,预测误差的估计不会乐观地向下偏差。pls可以选择通过交叉验证来估计均方预测误差(MSEP),在这种情况下使用10倍CV。[X1,Y1,Xs,Ys,β,pctVar,PLSmsep] = plsregress(X,y,10,'CV',10);对于PCR,crossval结合用于计算PCR的平方误差之和,可以再次使用10倍交叉验证来估计MSEP.PCRmsep = sum(crossval(@ pcrsse,X,y,'KFold',10),1)/ n;PLSR的MSEP曲线表明两个或三个成分好。另一方面,PCR需要四个成分才能获得相同的预测精度。事实上,PCR中的第二个成分会增加模型的预测误差,这表明该成分中包含的预测变量的组合与其没有很强的相关性y。再次,这是因为PCR构建成分来解释X,而不是y。模型简约因此,如果PCR需要四个成分来获得与具有三个成分的PLSR相同的预测精度,那么PLSR模型是否更加简约?这取决于您考虑的模型的哪个方面。PLS权重是定义PLS分量的原始变量的线性组合,即,它们描述了PLSR中的每个分量依赖于原始变量的权重。类似地,PCA载荷描述了PCR中每个成分依赖于原始变量的强度。对于PLSR或PCR,可以通过检查每个成分最重要的变量来为每个成分提供有意义的解释。例如,利用这些光谱数据,可以根据汽油中存在的化合物解释强度峰值,然后观察特定成分的权重挑选出少量这些化合物。从这个角度来看,更少的成分更易于解释,并且由于PLSR通常需要更少的成分来充分预测因变量,因此会导致更简约的模型。另一方面,PLSR和PCR都导致每个原始预测变量的一个回归系数加上截距。从这个意义上讲,两者都不是更简约,因为无论使用多少成分,两种模型都依赖于所有预测变量。更具体地,对于这些数据,两个模型都需要401个光谱强度值以进行预测。然而,最终目标可能是将原始变量集减少到仍然能够准确预测因变量的较小子集。例如,可以使用PLS权重或PCA载荷来仅选择对每个成分贡献最大的那些变量。如前所示,来自PCR模型拟合的一些成分可主要用于描述预测变量的变化,并且可包括与因变量不强相关的变量的权重。因此,PCR会导致保留预测不必要的变量。对于本例中使用的数据,PLSR和PCR所需的成分数量之间的差异不是很大,PLS权重和PCA载荷选择了相同的变量。其他数据可能并非如此。
Distance ClassificationDistance欧氏距离(Euclidean Distance)闵可夫斯基距离(Minkowski distance)曼哈顿距离(Manhattan distance)切比雪夫距离 ( Chebyshev distance )标准化欧氏距离(Standardized Euclidean distance )马氏距离(Mahalanobis Distance)汉明距离(Hamming distance)余弦相似度(Cosine Similarity)杰卡德相似系数(Jaccardsimilarity coefficient)ReferenceDistance由于最近在做故障诊断相关研究,不断学习各种算法,发现在很多算法里面都用到了Distance来定义各种变量之间的关系,确定之间的相关类指标。且在运用算法做分类时需要估不同样本之间的相似性度量(Similarity Measurement,SM),这时通常采用的方法就是计算样本间的“距离”(Distance)。在下面一 一道来!这可太有意思了,不经让我去寻找,究竟有多少种Distance可以运用在不同的算法里面呢?在不同算法里的计算方式是否有所不同?在计算效率上哪种Distance更优?哪种Distance在算法中运行速度更快,效果更好呢?什么Distance能够使得你的分类或聚类效果更加优秀呢?…针对太多了疑问和不解,那么现在开始做做Distance的相关解读吧!首先,了解一下距离计算(聚类分析)对于函数Dist( ; ),倘若它是一个“距离度量”(distance measure),则需要满足一些基本性质:欧氏距离(Euclidean Distance)相信欧氏距离(EuclideanDistance)是很多人都知道且用到的一个距离计算方法,且简单高效。在我们做聚类分析中常用的基于欧几里得距离的相似矩阵作为一种可行的方法。欧几里得简而言之,就是欧式空间中,两点之间的距离公式。在数学中,欧几里得距离或欧几里得度量是欧几里得空间中两点间“普通”(即直线)距离。使用这个距离,欧氏空间成为度量空间。相关联的范数称为欧几里得范数。较早的文献称之为毕达哥拉斯度量。欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离。—来源于网络原理公式下面简述下计算公式:二维空间的公式其中,简单的说,就是求其二维平面上两点之间的模长。—>本人心得三维空间的公式和二维空间一样,只不过多加了一个坐标系的值再简单的说,同理就是求其三维平面上两点之间的模长。—>本人心得n维空间的公式将每个维度的求其模长。 及其不标准描述,别说我说的拓展内容:所谓欧氏距离变换,是指对于一张二值图像(在此我们假定白色为前景色,黑色为背景色),将前景中的像素的值转化为该点到达最近的背景点的距离。欧氏距离变换在数字图像处理中的应用范围很广泛,尤其对于图像的骨架提取,是一个很好的参照。三角关系最简单的公式:应用层面欧氏距离看作信号的相似程度。 距离越近就越相似,就越容易相互干扰,误码率就越高。最近看了一篇 Paper,大佬级别的,引用率很高。讲的是关于欧几里得距离(欧氏距离)作为主成分分析(PCA)的相似性度量。理论性很强,本人菜鸡一个,目前读的有些老火,上传了网盘,论文可在这里下载【提取码:fvj2】。《Euclidean Distance as a Similarity Metric for Principal Component Analysis》–KIMBERLY L. ELMOREcite:[1] Elmore K L , Richman M B . Euclidean Distance as a Similarity Metric for Principal Component Analysis[J]. Monthly Weather Review, 2010, 129(3):540-549.闵可夫斯基距离(Minkowski distance)闵氏距离不是一种距离,而是一组距离的定义。是欧氏空间中的一种测度,被看做是欧氏距离的一种推广,欧氏距离是闵可夫斯基距离的一种特殊情况。闵氏空间指狭义相对论中由一个时间维和三个空间维组成的时空,为俄裔德国数学家闵可夫斯基(H.Minkowski,1864-1909)最先表述。他的平坦空间(即假设没有重力,曲率为零的空间)的概念以及表示为特殊距离量的几何学是与狭义相对论的要求相一致的。闵可夫斯基空间不同于牛顿力学的平坦空间。闵可夫斯基一个小故事:阿尔伯特·爱因斯坦在瑞士苏黎世联邦科技大学(Eidgen?ssische Technische Hochschule, ETH; Swiss Federal Institute of Technology)时期的数学老师赫尔曼·闵可夫斯基在爱因斯坦提出狭义相对论之后,于1907年将爱因斯坦与亨德里克·洛仑兹的理论结果重新表述成(3+1)维的时空,其中光速在各个惯性参考系皆为定值,这样的时空即以其为名,称为闵可夫斯基时空,或称闵可夫斯基空间。原理公式官方原理:闵氏距离有时也指时空间隔,关于时空间隔的内容可跳转看词条解释。设n维空间中有两点坐标x, y,v为常数,闵式距离定义为(1)闵氏距离与特征参数的量纲有关,有不同量纲的特征参数的闵氏距离常常是无意义的。(2)闵氏距离没有考虑特征参数间的相关性,而马哈拉诺比斯距离解决了这个问题。特殊情况当v = 2上面说到欧氏距离是闵可夫斯基距离的一种特殊情况,那么当 v = 2的时候,闵可夫斯基距离即为欧氏距离,欧氏距离中各特征参数是等权的:当v = 1 可得到绝对值距离,也叫曼哈顿距离(Manhattan distance)、出租汽车距离或街区距离(city block distance)。在二维空间中可以看出,这种距离是计算两点之间的直角边距离,相当于城市中出租汽车沿城市街道拐直角前进而不能走两点连接间的最短距离。绝对值距离的特点是各特征参数以等权参与进来,所以也称等混合距离。当v → ∞得到切比雪夫距离,下面再做介绍。应用层面我们常常将属性划分为“连续属性”(continuous attribute)和“离散属性”(categorical attribute),前者在定义域上有无穷多个可能的取值,后者在定义域上式有限个取值。然而,在讨论距离计算的时候,属性上是否定义“序”关系更为重要。例如,定义域在{1,2,3}的离散属性和连续属性的性质更为接近一些,能直接在属性值上计算距离:“1”和“2”比较接近、与“3”比较远,这样的属性称为“有序属性”(ordinal attribute);而定义为{火车、飞机、船}这样的离散属性则不能直接在属性值上计算距离,称为“无序属性”(non-ordinal attribute)。在这里,闵可夫斯基距离可用于有序距离,连续属性亦成为“数值属性”(numerical attribute)离散属性亦成为“列名属性”(nominal attribute)简单总结:闵可夫斯基距离在面对离散数据集的时候则不适用,而对于有序数列数据集可用。—来自菜鸡解释,不对可忽略。曼哈顿距离(Manhattan distance)由上可知,在闵可夫斯基距离中,当v = 1 时,可得到绝对值距离,也叫曼哈顿距离(Manhattan distance)、出租汽车距离或街区距离(city block distance)。同样也是由上面那位图片上的大佬创建的,这里就不放Photo了出租车几何或曼哈顿距离(Manhattan Distance)是由十九世纪的赫尔曼·闵可夫斯基所创词汇 ,是种使用在几何度量空间的几何学用语,用以标明两个点在标准坐标系上的绝对轴距总和。原理公式官方解释很好理解(附上了)曼哈顿距离上图中红线代表曼哈顿距离,绿色代表欧氏距离,也就是直线距离,而蓝色和黄色代表等价的曼哈顿距离。曼哈顿距离——两点在南北方向上的距离加上在东西方向上的距离,即对于一个具有正南正北、正东正西方向规则布局的城镇街道,从一点到达另一点的距离正是在南北方向上旅行的距离加上在东西方向上旅行的距离,因此,曼哈顿距离又称为出租车距离。曼哈顿距离不是距离不变量,当坐标轴变动时,点间的距离就会不同。曼哈顿距离示意图在早期的计算机图形学中,屏幕是由像素构成,是整数,点的坐标也一般是整数,原因是浮点运算很昂贵,很慢而且有误差,如果直接使用AB的欧氏距离(欧几里德距离:在二维和三维空间中的欧氏距离的就是两点之间的距离),则必须要进行浮点运算,如果使用AC和CB,则只要计算加减法即可,这就大大提高了运算速度,而且不管累计运算多少次,都不会有误差。菜鸡理解:曼哈顿距离在处理大规模运算的时候,将一些需要用到浮点运算的地方(欧氏距离运算)换成加减运算,在处理器较强的现在,(不懂算法提速的我),或许还会提高运算速度(虽然没有试过,大胆假设一波,再去补补Paper)。在二维三维平面上本来走直线的,现在通过走曲折的“直线”减小计算难度,但增加了计算过程,最终的结果是使得运算速度提速了!!!很神奇煮个栗子吧现在请出灵魂画师此时的曼哈顿距离应用层面关于曼哈顿距离的应用,搜罗了大部分Paper,发现都是在计算机领域的应用较多,比如提高改进GPU运算性能、算法层面的性能提升、CV等等…太多了这里有几篇引用率且水平较高的Paper可读一读。本菜在不断摸索当中[1] Chang D J , Desoky A H , Ming O , et al. Compute Pairwise Manhattan Distance and Pearson Correlation Coefficient of Data Points with GPU[C]// 10th ACIS International Conference on Software Engineering, Artificial Intelligences, Networking and Parallel/Distributed Computing, SNPD 2009, in conjunction with 3rd International Workshop on e-Activity, IWEA 2009, 1st International Workshop on Enterprise Architecture Challenges and Responses, WEACR 2009, Catholic University of Daegu, Daegu, Korea, 27-29 May 2009. IEEE, 2009.[2] Mattausch H J , Omori N , Fukae S , et al. Fully-parallel pattern-matching engine with dynamic adaptability to Hamming or Manhattan distance[C]// VLSI Circuits Digest of Technical Papers, 2002. Symposium on. IEEE, 2002.[3] Oike Y , Ikeda M , Asada K . A high-speed and low-voltage associative co-processor with exact Hamming/Manhattan-distance estimation using word-parallel and hierarchical search architecture[J]. IEEE Journal of Solid-State Circuits, 2004, 39(8):1383-1387.深入了解后再细挖(待更新)。切比雪夫距离 ( Chebyshev distance )在数学中,切比雪夫距离(Chebyshev distance)或是L ∞ L_∞L ∞ 度量,是向量空间中的一种度量,二个点之间的距离定义是其各坐标数值差绝对值的最大值。以数学的观点来看,切比雪夫距离是由一致范数(uniform norm)(或称为上确界范数)所衍生的度量,也是超凸度量(injective metric space)的一种。(—来自网络)切比雪夫最形象的一个比如应该当属“国际象棋”,相信有大部分人像本弱鸡一样不会下国际象棋,下面直接讲原理。原理公式国际象棋棋盘上二个位置间的切比雪夫距离是指王要从一个位子移至另一个位子需要走的步数。由于王可以往斜前或斜后方向移动一格,因此可以较有效率的到达目的的格子。下图是棋盘上所有位置距f6位置的切比雪夫距离。一维空间中,所有的Lp度量都是一样的------------(即为二坐标差的绝对值)。假设平面中存在两个点分别为那么它们之间的切比雪夫距离为也即是,求其两点之间横纵坐标x , y对应差的绝对值,在选出最大的一个作为它们之间的切比雪夫距离。炒个栗子吧此时又得拿出灵魂画师的水准此时,在网路上学习的过程中找到一个狠好的解释:曼哈顿距离和切比雪夫距离相互转换。(图片来自网络)因此平面的切比雪夫距离可以视为平面曼哈顿距离旋转再放大后的结果。应用层面关于切比雪夫距离,在聚类上有所用到,在图象识别领域,改进的切比雪夫相似性度量来替代聚类分析中现有的度量(如欧几里得和标准切比雪夫),通过改进的算法应用到医学的图像识别上,效果很好。所提出的措施产生最小的目标函数值,并在迭代次数最少时收敛。这里推荐一篇Paper.Mousa A , Yusof Y . An improved Chebyshev distance metric for clustering medical images[C]// American Institute of Physics Conference Series. AIP Publishing LLC, 2015:040020.标准化欧氏距离(Standardized Euclidean distance )标准欧氏距离的定义:标准化欧氏距离是针对简单欧氏距离的缺点而作的一种改进方案。本菜理解:针对多维变量,将输入样本X XX进行标准化的欧式距离计算操作。原理公式首先,将各个分量都“标准化”到均值、方差相等。应用层面在机器学习中,聚类用的标准化欧氏距离比较多,在面对求解长方形区域聚类的时候,普通的距离无法满足相似性度量,这是就得采用标准化欧氏距离来度量。这里推荐一本书。Chikodili N B , MD Abdulmalik, Abisoye O A , et al. Outlier Detection in Multivariate Time Series Data Using a Fusion of K-Medoid, Standardized Euclidean Distance and Z-Score[M]. 2021.马氏距离(Mahalanobis Distance)马氏距离(Mahalanobis distance)是由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出的,表示点与一个分布之间的距离。它是一种有效的计算两个未知样本集的相似度的方法。与欧氏距离不同的是,它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的),并且是尺度无关的(scale-invariant),即独立于测量尺度。(百科也很详细)生来清贫,没有头像,只留下一本书马氏距离(MahalanobisDistance)是度量学习中一种常用的距离指标,同欧氏距离、曼哈顿距离、汉明距离等一样被用作评定数据之间的相似度指标。但却可以应对高维线性分布的数据中各维度间非独立同分布的问题。(来自知乎大佬)原理公式什么是马氏距离?简单来说就是,作为一种距离的度量,可以看作是欧氏距离的一种修正,修正了欧式距离中各个维度尺度不一致且相关的问题。单个数据点的马氏距离数据点x , y之间的马氏距离其中Σ是多维随机变量的协方差矩阵,μ为样本均值,如果协方差矩阵是单位向量,也就是各维度独立同分布,马氏距离就变成了欧氏距离。应用层面马氏距离实际意义:那么马氏距离就能能干什么?它比欧氏距离好在哪里?再炒几个栗子欧式距离近就一定相似?先举个比较常用的例子,身高和体重,这两个变量拥有不同的单位标准,也就是有不同的scale。比如身高用毫米计算,而体重用千克计算,显然差10mm的身高与差10kg的体重是完全不同的。但在普通的欧氏距离中,这将会算作相同的差距。归一化后欧氏距离近就一定相似?当然我们可以先做归一化来消除这种维度间scale不同的问题,但是样本分布也会影响分类举个一维的栗子,现在有两个类别,统一单位,第一个类别均值为0,方差为0.1,第二个类别均值为5,方差为5。那么一个值为2的点属于第一类的概率大还是第二类的概率大?距离上说应该是第一类,但是直觉上显然是第二类,因为第一类不太可能到达2这个位置。所以,在一个方差较小的维度下很小的差别就有可能成为离群点。就像下图一样,A与B相对于原点的距离是相同的。但是由于样本总体沿着横轴分布,所以B点更有可能是这个样本中的点,而A则更有可能是离群点。算上维度的方差就够了?还有一个问题——如果维度间不独立同分布,样本点一定与欧氏距离近的样本点同类的概率更大吗?可以看到样本基本服从f(x) = x的线性分布,A与B相对于原点的距离依旧相等,显然A更像是一个离群点即使数据已经经过了标准化,也不会改变AB与原点间距离大小的相互关系。所以要本质上解决这个问题,就要针对主成分分析(PCA)中的主成分来进行标准化。马氏距离的几何意义上面搞懂了,马氏距离就好理解了,只需要将变量按照主成分进行旋转,让维度间相互独立,然后进行标准化,让维度同分布就OK了。由主成分分析可知,由于主成分就是特征向量方向,每个方向的方差就是对应的特征值,所以只需要按照特征向量的方向旋转,然后缩放特征值倍就可以了,可以得到以下的结果:离群点就被成功分离,这时候的欧式距离就是马氏距离。(很妙啊!)马氏距离的问题1.协方差矩阵必须满秩里面有求逆矩阵的过程,不满秩不行,要求数据要有原维度个特征值,如果没有可以考虑先进行PCA,这种情况下PCA不会损失信息2.不能处理非线性流形(manifold)上的问题只对线性空间有效,如果要处理流形,只能在局部定义,可以用来建立KNN图不能处理非线性流形(manifold)上的问题只对线性空间有效,如果要处理流形,只能在局部定义,可以用来建立KNN图汉明距离(Hamming distance)理查德·卫斯里·汉明原理在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。例如:1011101 与 1001001 之间的汉明距离是 22143896 与 2233796 之间的汉明距离是 3“toned” 与 “roses” 之间的汉明距离是 3可视化的煮个栗子吧汉明距离多用于编码等信息论方面的计算,对于为什么上面的汉明距离结果为此,简单来看,拿出我灵魂画手工笔这样来看是不是更好理解一点呢。只需要从字符串中寻找出不同的项,不同项的数量就为之间的汉明距离。这里写了一个小的求汉明距离的Python封装代码(直接调用即可):def HammingDistance(x, y): """返回等长序列之间的汉明距离""" if len(x) != len(y): raise ValueError("对于长度不等的序列未定义") return sum(t1 != t2 for t1, t2 in zip(x, y))最小汉明距离例如:(00)与(01)的距离是1,(110)和(101)的距离是2。在一个码组集合中,任意两个编码之间汉明距离的最小值称为这个码组的最小汉明距离。最小汉明距离越大,码组越具有抗干扰能力。应用层面汉明距离更多的用于信号处理,表明一个信号变成另一个信号需要的最小操作(替换位),实际中就是比较两个比特串有多少个位不一样,简洁的操作时就是两个比特串进行异或之后包含1的个数。汉明距在图像处理领域也有这广泛的应用,是比较二进制图像非常有效的手段。计算一个数字的比特位包含1的个数有个小技巧:value &= value - 1这个运算的结果就是把value最后一个1去掉,循环进行运算直到value等于0(所有的1都被去掉)就可以知道vaule拥有多少个1了。其在包括信息论、编码理论、密码学等领域都有应用。但是,如果要比较两个不同长度的字符串,不仅要进行替换,而且要进行插入与删除的运算,在这种场合下,通常使用更加复杂的编辑距离等算法。(源自百科)在信号处理方面,本菜就不班门弄斧了据说,在机器学习领域中,汉明距离也常常被用于作为一种距离的度量方式。在LSH算法汉明距离也有重要的应用。具体还有待研究(待进一步深挖后 更新)余弦相似度(Cosine Similarity)为什么在这里会提到余弦?等等,这不是在学几何三角!虽然几何中夹角余弦可用来衡量两个向量方向的差异,但是我们在机器学习中借用这一概念来可以衡量样本向量之间的差异,从此进行相似性度量。原理公式来自网络或许可以理解为:求空间中两点的余弦值,值越大表示两个向量的夹角越小,值越小表示两向量的夹角越大。从上图中可以看出,夹角越小代表两个向量点越相似,夹角越大代表两个向量的相似度越小。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。欧氏距离和余弦相似度的区别从上图可以看出距离度量衡量的是空间各点间的绝对距离,跟各个点所在的位置坐标(即个体特征维度的数值)直接相关;而余弦相似度衡量的是空间向量的夹角,更加的是体现在方向上的差异,而不是位置。如果保持A点的位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦相似度cosθ是保持不变的,因为夹角不变,而A、B两点的距离显然在发生改变,这就是欧氏距离和余弦相似度的不同之处。应用层面余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。(见此大佬转载更好的解释)关于对余弦相似度的应用,有以下见解:正如上所述,相比欧氏距离,余弦相似度计算更加注重的是在方向范围上的应用,对绝对数值是相当的不够敏感,在机器学习中,做聚类或分类的时候,针对多维不同特征,在数值上的联系是相当重要的,故本菜自认为可应用性不大。在对多层维度进行分析体现不同特征之间的差异时,欧式距离或标准化欧氏距离会更占优势。余弦在方向上区分不同特征的差异占优势,可对一些用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题。(这条我抄的别说了)吴军. 数学之美 系列 12 -余弦定理和新闻的分类.(一个比较好的栗子)http://www.google.com.hk/ggblog/googlechinablog/2006/07/12_4010.html杰卡德相似系数(Jaccardsimilarity coefficient)Jaccard index , 又称为Jaccard相似系数(Jaccard similarity coefficient)用于比较有限样本集之间的相似性与差异性。Jaccard系数值越大,样本相似度越高。原理公式官方定义:给定两个集合A,B,Jaccard 系数定义为A与B交集的大小与A与B并集的大小的比值,定义如下:当集合A,B都为空时,J(A,B)定义为1。与Jaccard 系数相关的指标叫做Jaccard 距离,用于描述集合之间的不相似度。Jaccard 距离越大,样本相似度越低。公式定义如下:其中对参差(symmetric difference):应用层面非对称二元属性的相似性在数据挖掘领域,常常需要比较两个具有布尔值属性的对象之间的距离,Jaccard距离就是常用的一种方法。给定两个比较对象A,B。A,B 均有n个二元属性,即每个属性取值为{0,1}。定义如下4个统计量:其中,Jaccard 系数:Jaccard距离:主要应用场景:1.比较文本相似度,用于文本查重与去重;2.计算对象间距离,用于数据聚类等。Python有相应的库包scipy.spatial.distance ,包含有杰卡德距离计算,可直接调用# scipy距离公式 from numpy import * import scipy.spatial.distance as dist matV = mat([[1,1,0,1,0,1,0,0,1], [0,1,1,0,0,0,1,1,1]]) print ("dist.jaccard:", dist.pdist(matV,'jaccard'))项目相似性度量是协同过滤系统的核心。 相关研究中,基于物品协同过滤系统的相似性度量方法普遍使用余弦相似性。 然而,在许多实际应用中,评价数据稀疏度过高,物品之间通过余弦相似度计算会产生误导性结果。 将杰卡德相似性度量应用到基于物品的协同过滤系统中,并建立起相应的评价分析方法。 与传统相似性度量方法相比,杰卡德方法完善了余弦相似性只考虑用户评分而忽略了其他信息量的弊端,特别适合于应用到稀疏度过高的数据。(引用自百科)
Learning Rate机器学习尝试Train的第一个数据集Mnist,大部分都会从此入手。当你的Loss在逐渐减小的时候,Gradient却不一定减小怎样做才能将gradient descent(下面用gd代替)做的更好?需要一个更好版本的gd?在之前做gd的时候,所有的参数都是设同样的Lr,这肯定是不够的。Lr应该为每一个参数客制化客制化的Lr(Learning Rate)Learning Rate(以下用Lr代替)将决定Update参数时的步伐有多大。Lr设置的太大,显然步伐很大。不同参数需要不同的学习率若在某一个方向上gd的值很小很小,非常平坦(如下图蓝色箭头),我们希望Lr调大一点。相反,如果在某一个方向上(下图绿色箭头)很陡峭,那么,我们希望将Lr调小一点。Learning Rate如何做自动调整?我们需要修改原来的Gradient Descent的式子。原本的gd公式,这里只更改一个参数θ θθ原式将上式原来的η ηη修改为下面这个方法被用到Adagrad到此,这并不是最终的Lr版本。Lr怎么实现动态调整呢?再来看以下Error Surface当在陡峭的(绿色箭头)地方,我们需要很小的Lr。走到中间比较平滑的(红色箭头),我们需要很大的Lr。和上面的不同,这是在同一个参数同一个方向上,也能够动态的调整Learning Rate!就出现了以下的一个江湖失传的算法(找不到论文出处)RMS Prop第一步算g i 0 g_i^0g i0 和上面Root Mean Square是一样的,从第二步开始有所变化,其中α需要自己调。由此就得到了一个目前比较常用的Optimization策略—AdamAdam : RMSProp + Momentum现在在Pytorch上有Adam的套件,直接可用,Adam的介绍在Pytorch里面的Doc讲的更加详细!学习速率调度Learning Rate Decay通过不断调整η ηη的大小。训练结束后,我们离目的地很近,所以我们降低了学习率。Summary从最原始的Gradient Descent版本进阶版Gradient Descent
Elman神经网络近期开题,阅读到了一篇文章关于故障诊断的,其中用到了Elman神经网络,具体是结合EMD、PCA-SOM的Elman的性能评估/预测故障诊断,对Elman神经网络有点陌生,网上资源也讲的特别杂,来做个汇总Introduction吧!介绍Elman神经网络 是 J. L. Elman于1990年首先针对语音处理问题而提出来的,是一种典型的局部回归网络( global feed forward local recurrent)。Elman网络可以看作是一个具有局部记忆单元和局部反馈连接的递归神经网络。Elman网络具有与多层前向网络相似的多层结构。它的主要结构是前馈连接, 包括输入层、 隐含层、 输出层, 其连接权可以进行学习修正;反馈连接由一组“结构 ” 单元构成,用来记忆前一时刻的输出值, 其连接权值是固定的。在这种网络中, 除了普通的隐含层外, 还有一个特别的隐含层,称为关联层 (或联系单元层 ) ;该层从隐含层接收反馈信号, 每一个隐含层节点都有一个与之对应的关联层节点连接。关联层的作用是通过联接记忆将上一个时刻的隐层状态连同当前时刻的网络输入一起作为隐层的输入, 相当于状态反馈。隐层的传递函数仍为某种非线性函数, 一般为 Sigmoid函数, 输出层为线性函数, 关联层也为线性函数。----词条来自于百度百科Elman组成Elman神经网络是一种典型的动态神经网络,通常有四层:输入层、中间层(隐含层)、 承接层和输出层。输入层、隐含层和输出层的连接类似于前馈网络。输入层的单元只传输信号,输出层的单元具有线性加权的功能。隐层细胞的传递函数可以是线性函数,也可以是非线性函数。承接层又称为上下文层或状态层,用于记忆隐层的前一个时间步长输出,因此可以看作是一步时间延迟算子。Elman网络结构带反馈的的BP网络行程迟滞具有短期记忆功能(Figure来自于网络)Elman神经网络的特点是通过受体层的延迟和存储,隐层的输出与隐层的输入本身相连。这种自连接对其历史状态的数据非常敏感,内部反馈网络也增加了动态信息处理的能力,从而达到动态建模的目的。选择用历史训练的Elman神经网络同步预测,数据流程图如下图所示。Elman网络学习算法用BP算法进行权值修正,指标函数为误差平方和Matlab实例代码本实例是引用的《Matlab神经网络30个案例分析》中的一个,觉得很不错,就更新一下下!~内容较为古老,直接附上了,请多担待。电力负荷预测概述模型建立电力系统负荷数据具体数据及其源代码在我的GitHub上可下载:https://github.com/YurBro/Project-Code/tree/main/ElmanNNMatlab Code:%% 基于Elman神经网络的电力负荷预测模型研究 % % % <html> % <table border="0" width="600px" id="table1"> <tr> <td><b><font size="2">该案例作者申明:</font></b></td> </tr> <tr> <td><span class="comment"><font size="2">1:本人长期驻扎在此<a target="_blank" href="http://www.ilovematlab.cn/forum-158-1.html"><font color="#0000FF">板块</font></a>里,对<a target="_blank" href="http://www.ilovematlab.cn/thread-48362-1-1.html"><font color="#0000FF">该案例</font></a>提问,做到有问必答。</font></span></td></tr><tr> <td><span class="comment"><font size="2">2:此案例有配套的教学视频,配套的完整可运行Matlab程序。</font></span></td> </tr> <tr> <td><span class="comment"><font size="2"> 3:以下内容为该案例的部分内容(约占该案例完整内容的1/10)。</font></span></td> </tr> <tr> <td><span class="comment"><font size="2"> 4:此案例为原创案例,转载请注明出处(<a target="_blank" href="http://www.ilovematlab.cn/">Matlab中文论坛</a>,<a target="_blank" href="http://www.ilovematlab.cn/forum-158-1.html">《Matlab神经网络30个案例分析》</a>)。</font></span></td> </tr> <tr> <td><span class="comment"><font size="2"> 5:若此案例碰巧与您的研究有关联,我们欢迎您提意见,要求等,我们考虑后可以加在案例里。</font></span></td> </tr> <tr> <td><span class="comment"><font size="2"> 6:您看到的以下内容为初稿,书籍的实际内容可能有少许出入,以书籍实际发行内容为准。</font></span></td> </tr><tr> <td><span class="comment"><font size="2"> 7:此书其他常见问题、预定方式等,<a target="_blank" href="http://www.ilovematlab.cn/thread-47939-1-1.html">请点击这里</a>。</font></span></td> </tr></table> % </html> % %% 清空环境变量 clc; clear all close all nntwarn off; %% 数据载入 load data; a=data; %% 选取训练数据和测试数据 for i=1:6 p(i,:)=[a(i,:),a(i+1,:),a(i+2,:)]; end % 训练数据输入 p_train=p(1:5,:); % 训练数据输出 t_train=a(4:8,:); % 测试数据输入 p_test=p(6,:); % 测试数据输出 t_test=a(9,:); % 为适应网络结构 做转置 p_train=p_train'; t_train=t_train'; p_test=p_test'; %% 网络的建立和训练 % 利用循环,设置不同的隐藏层神经元个数 nn=[7 11 14 18]; for i=1:4 threshold=[0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1;0 1]; % 建立Elman神经网络 隐藏层为nn(i)个神经元 net=newelm(threshold,[nn(i),3],{'tansig','purelin'}); % 设置网络训练参数 net.trainparam.epochs=1000; net.trainparam.show=20; % 初始化网络 net=init(net); % Elman网络训练 net=train(net,p_train,t_train); % 预测数据 y=sim(net,p_test); % 计算误差 error(i,:)=y'-t_test; end %% 通过作图 观察不同隐藏层神经元个数时,网络的预测效果 plot(1:1:3,error(1,:),'-ro','linewidth',2); hold on; plot(1:1:3,error(2,:),'b:x','linewidth',2); hold on; plot(1:1:3,error(3,:),'k-.s','linewidth',2); hold on; plot(1:1:3,error(4,:),'c--d','linewidth',2); title('Elman预测误差图') set(gca,'Xtick',[1:3]) legend('7','11','14','18','location','best') xlabel('时间点') ylabel('误差') hold off; web browser http://www.ilovematlab.cn/viewthread.php?tid=63640 %% % % <html> % <table align="center" > <tr> <td align="center"><font size="2">版权所有:</font><a % href="http://www.ilovematlab.cn/">Matlab中文论坛</a>&nbsp;&nbsp; <script % src="http://s3.cnzz.com/stat.php?id=971931&web_id=971931&show=pic" language="JavaScript" ></script>&nbsp;</td> </tr></table> % </html> %
基于经验模式分解的特征提取近期看的算法就是EMD的,发现很多Paper用的地方还挺多的,在特征提取方面,来做个以轴承振动信号的故障诊断EMD特征提取的学习总结。建议可以先看文章后半部分基础归类在看前半部分特征提取。EMD方法是从一个简单的假设发展而来,即任何信号都是由不同的简单固有振型组成的。每个线性或非线性模式都有相同数目的极值和过零。在连续的零交点之间只有一个极值。每个模式都应该独立于其他模式。这样,每个信号就可以分解为若干个IMF(intrinsic mode functions,固有模态函数),每个IMF必须满足以下定义:定义1:在整个数据集中,极值数和过零数必须相等或不大于1。定义2:在任意点上,由局部极大值和局部极小值定义的包络线的均值为零。与简谐函数相比,IMF表示一个简单的振动模式。EMD的步骤如下:找出原始信号x ( t ) x(t)x(t)的所有最大值点和最小值点,并用三次样条函数拟合原始信号的波动包络。计算波动包络的均值,用u 1 ( t ) u_1(t)u 1 (t)表示,将原始数据序列减去均值得到新的数据序列y 1 ( t ) y_1(t)y 1 (t):因此,将信号分解得到了n nn个经验模态,并得到了残差r n ( t ) r_n(t)r n (t),即残差x ( t ) x(t)x(t)的平均趋势。----图片来自于网络不同故障的轴承在运行时,振动信号中产生相应的共振频率分量,故障振动信号的能量随频率分布而变化。为了说明这种情况,计算了每个IMF的能量。首先,计算n 个 IMFs n 个 \text { IMFs }n个 IMFs 的总能量:构造以能量为元素的特征向量F:为方便后续神经网络的训练,将能量特征向量归一化如下:然后以下算是对EMD的一些小知识点总结吧~简单基础总结EMD(Empirical Mode Decomposition)作为时频域的处理方法,最显著的特点,就是其克服了基函数无自适应性的问题。相对于同样是时频域方法的小波分析,小波分析是需要选定某一个小波基的,小波基的选择对整个小波分析的结果影响很大,一旦确定了小波基,在整个分析过程中将无法更换,即使该小波基在全局可能是最佳的,但在某些局部可能并不是,所以小波分析的基函数缺乏适应性。简单说来,EMD就像一台机器,把一堆混在一起的硬币扔进去,他会自动按照1元、5毛、1毛、5分、1分地分成几份。内涵模态分量(Intrinsic Mode Functions, IMF)就是原始信号被EMD分解之后得到的各层信号分量。或许和上面文章开头解释的固有模态函数的翻译不同,但其实是一样的~—此处引用:大佬解释 膜拜----图片来自于网络原始信号:x ( t ) x(t)x(t)IMF1:信号分量IMF2:信号分量IMF3:信号分量,可能会出现EMD端点效应残差:r n ( t ) r_n(t)r n (t)EMD特点:自适应地进行信号的主成分分析,主要此处的主成分分析和 PCA 不同,关于PCA,我之前的博客有所提及。对一段未知信号,而不需要做出预先分析及研究,就能够直接开始分解。这个方法会按照一些固有模式按层次分好,而不需要人为设置或者干预。关于 EMD的代码,日后研究再更新!
Gradient Descent(梯度下降) + Momentum(动量)上次 这里 介绍了Gradient Descent寻找最优解的过程学习到发现还有一个算法就是加上Momentum(动量,就是上一次Gradient Descent后的步长值)来作为下一次更新位置的参数,这样来寻找局部最优解Local Minima的话,会比单独使用梯度下降法来求解效果更好,有一点像粒子群算法。Movement:最后一步的移动目前是最小的梯度首先同梯度下降法一样,找到一点起始点此时的位移(Movement)为0,故紧接着Gradient Descent来计算再计算下一步的由于加了动量,故不再按照梯度下降法的反方向寻找Local Minima了然后注意,此时的θ 2 θ^2θ 2 为Gradient Descent(梯度下降) + Momentum(动量)以后的方向,这样的话寻找 Local MInima会更加精确,避免overfitting,和共轭方向法类似。然后,以此类推求下去具体地,如下图,加上动量后,寻找的过程可能会比单一梯度下降慢,就比如在遇见第一个Local MInima的时候,Gradient Descent或许就会停下来了,而Gradient Descent(梯度下降) + Momentum(动量)呢,当上一步的Movement和g x g^xg x 的大小相等,方向相反,那么会被抵消;若Movement大于g x g^xg x 的值,那么会继续往后面去寻找局部最优解,但是最终,还是会回到最好的局部最优解位置来。Deep Learning Fitting!!!
Gradient Descent最近在搞Deep Leaning,数学不好的我学的头大啊。在学之前,你或许和我一样First从初始参数起始点 开始Second计算一下然后,向着Gradient的反方向去Update(更新)参数Thrid得到新参数后,不断重复上两步过程直到最终找到 Local Minima
2022年01月
2021年12月