All Posts

matlab批量修改变量的名称

使用matlab做实验的时候,保存的文件里面的变量名都是一样的 ,所以希望能够把变量名全部都重命名。我举个个例子,假设我一堆文件,文件名分别是gds1,gds2,gds2,….. 但是实际上load进来之后的变量名称都是gds,所以我希望能够把变量名能够改成相对应的文件名称。在这里,我使用了eval这个函数,这个函数到是一个非常方便的选择。 %% 变量批量重命名 clear all rootname = 'gds'; extension = '.mat'; for i = 1:n variable = [rootname,int2str(i)]; filename = [variable,extension]; load(filename); eval(['gds',num2str(i),'=','gds',';']); save(filename,variable); clear gds variable filename; end clear all

奇异值分解基础(SVD)

最近要了解一下Incremental PCA的一些知识,然后看到一篇论文里面讲到了SVD(奇异值分解),奈何自己以前没有把机器学习的课好好上,现在很多东西还是要补回来。所以,我就想了解一些SVD的基础知识。 PCA的实现一般有两种方法,一种是用特征值分解去实现,一种是用奇异值分解去实现的,SVD貌似在很多领域都有很重要的应用。 特征值和特征向量 特征值和特征向量是线性代数里面的基础知识,相信大部分人都知道: 很显然,λ就是特征向量v对应的特征值,一个矩阵的一组特征向量都是相互正交的,相信这些大家在线性代数都有学习。特征值分解是将一个矩阵以下面的形式进行分解: 其中Q是这个矩阵A的特征向量组成的矩阵,Σ是一个对角矩阵,每一个对角线上的元素就是一个特征值。 特征值分解可以得到特征值和特征向量,特征值表示的是这个特征值的重要性,而特征向量表示的是这个特征是什么,可以将每一个特征向量理解为一个线性的子空间。不过特征值分解也有很多的局限,比如变换的矩阵必须是方阵。 奇异值 特征值分解只能针对于方阵,局限性较大,而奇异值分解是一个能够用于任意的矩阵的一种分解方法: 假设A是一个NM的矩阵,那么U是一个NN的方阵(里面的向量是正交的,U里面的向量称为左奇异向量),Σ是一个NM的矩阵(除了对角线的元素都是0,对角线上的元素称为奇异值),V’(V的转置矩阵)是一个NN的矩阵,里面的向量也是正教的,称为右奇异向量。 我们将矩阵A和他的转置矩阵相乘,就可以得到一个方阵,我们利用方阵的求特征值可以得到: 这里面的v,就是我们上面所说的右奇异向量,由此我们可以得到 这里的σ就是上面所说的奇异值,u就是上面说的左奇异向量。奇异值σ跟特征值类似,在矩阵Σ中也是从打到小排列,而且σ的减少特别的快。在很多情况下,前10%的甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们可以用前r大的奇异值来近似描述矩阵,因此部分奇异值分解可以如下定义: r是一个远小于m、n的数, 右边的三个矩阵相乘的结果将会是一个接近于A的矩阵,r越接近于n,则相乘的结果越接近于A。而这三个矩阵的面积之和要远远小于原始的矩阵A。 SVD和PCA## PCA的问题其实是一个基的变换,使得变换后的数据有着最大的方差。方差的大小描述的是一个变量的信息量,我们在讲一个东西的稳定性的时候,往往说要减小方差,如果一个模型的方差很大,那就说明模型不稳定了。但是对于机器学习的数据,方差大反而有意义,不然输入的数据就是同一个点了,那方差九尾0了。 这个假设是一个摄像机采集一个物体运动得到的图片,上面的点表示物体运动的位置,假设我们想用一条直线去拟合这些点,那我们应该选择什么方向的线?当然是图上标有signal的那条线。如果我们把这些点单纯的投影到x轴或者y轴上,最后在x轴和y轴上得到的方差就是相似的。 一般来说方差大的方向就是信号的方向,方差小的方向就是噪声的方向,我们在数据挖掘或者数字信号处理中,往往是要提高信噪比。就上图说,如果我们只保留signal方向的数据,就可以对原始数据进行不错的近似了。 PCA的就是对原始的空间中顺序地找一组相互正教的坐标轴,第一个轴使得方差最大,第二个轴是在与第一个轴相交的平面中使得方差最大,第三个轴也是在与第1,2个轴正交的平面中使得方差最大,这种假设在N维空间中,我们就可以找到N个这样的坐标轴,我们取前r个去近似这个空间,这样就从一个N维的空间压缩到r维的空间,但是我们可以选择r个坐标轴使得空间的压缩使得数据的损失最小。 假设我们矩阵的每一行代表一个样本,每一列代表一个feature,将一个mn的矩阵A进行坐标轴的变化,P就是一个变换的矩阵从一个n维的空间变换到另外一个n维的空间 而将一个mn的矩阵A变成一个m*r的矩阵,我们就会使得本来有n个feature的,变成有r个feature了(r小于n),这r个其实就是对n个feature的一种提炼,我们把这个称为feature的压缩: 之前的SVD的式子是: 在矩阵的两边同时乘上一个矩阵V,由于v是一个正交的矩阵 我们对SVD分解的式子两边乘以U的转置矩阵U' PCA几乎可以说是对SVD的一种包装,如果我们实现了SVD,那也就实现了PCA。

PCA算法和实例

PCA算法 算法步骤: 假设有m条n维数据。 将原始数据按列组成n行m列矩阵X 将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值 求出协方差矩阵C=1/mXXT 求出协方差矩阵的特征值以及对应的特征向量 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P Y=PX即为降维到k维后的数据 实例## 以这个为例,我们用PCA的方法将这组二维数据降到一维 因为这个矩阵的每行已经是零均值,所以我们可以直接求协方差矩阵: 然后求其特征值和特征向量,求解后的特征值为: λ1=2,λ2=2/5 其对应的特征向量分别是: 由于对应的特征向量分别是一个通解,c1和c2可取任意实数。那么标准化后的特征向量为: 因此我们的矩阵P是: 可以验证协方差矩阵C的对角化: 最好我们用P的第一行诚意数据矩阵,就得到了降维后的数据表示: 降维后的投影结果如下图: PCA本质上是将方差最大的方向作为主要特征,并且在各个正交方向上将数据“离相关”,也就是让它们在不同的正交方向上没有相关性。 因此,PCA也存在一些限制,例如它可以很好地解除线性相关,但是对于高阶相关性就没有办法了。对于存在高阶相关性的数据,可以考虑Kernel PCA,通过Kernel将非线性相关转化为线性相关。另外,PCA假设数据各特征分布在正交方向上,如果在非正交方向上存在几个方差较大的方向,PCA的效果就大打折扣。 PCA是一种无参数技术,也就是说面对同样的数据,如果不考虑清晰,谁来做结果都一样,没有主观参数的介入,所以PCA便于通用实现,但是本身没有个性化的优化。 本文主要参考:http://blog.codinglabs.org/articles/pca-tutorial.html

WWDC2015

ios9功能 Proactive:整合siri、联系人、日历以及第三方应用。 Notes: 可调节字体、插图片、支持手写注记等功能。 Maps: 加入新公交试图,Transit提供公交系统和换乘细节。 News:聚合新闻应用,可根据西兴趣选择不同的新闻源。 电池续航:充满殿后设备使用时间延长1小时。 安装包更小,只有1.3G。 用户隐私:数据只会保存在本地,不会上传到云。 OS X EI Capitan 新增多种触控板手势。 safari增加固定标签页功能。 窗口自适应功能,不必手动调整窗口大小和拖动窗口。 Spotlight能够理解日常语言。 Metal首次引入图形管理接口。 swift2将在今年年底开源。 split view将自动并排两个app共用一个屏幕。 邮箱app增强全屏显示功能。 ipad最新功能 quick type键盘 传说中的分屏 支持“画中画”功能

道路模型--linear-parabolic model

读过很多道路追踪的论文,经常都需要道路模型的建模。我不知道是不是因为自己太笨还是怎样,好多人建的模型我实在无法理解他的用意何在,而且我真的深刻怀疑他们那些模型的参数是不是真的可以求出来。就比如这篇文章“lane detection and tracking using a new lane model and distance transform",我实在无法理解他的建模,还有他的建模参数到底如何求解: 我无法理解他为什么要设置那个角度,我也不知道那个顶点的位置如何获取,如果有大神知道的,还望告知一下。 好,说完不好的,我就要说个我觉得很通俗易懂的模型,这是我第一个遇到一个我能看的懂,而且我又觉得具有实用意义的道路模型,首先如图所示: 这个图片被xm分成为了两个部分,一个部分我们称为far feild,一个部分我们称为near feild,对于这两个部分采用了不同的建模方法。道路模型f(x)由这两个部分组成,near feild线性的,而far feild是抛物线的,定义如下: 这里的xm就是代表了原图中的边界线,同时我们根据道路模型的连续性,可以得出 因为在xm两边的函数值是相等的,并且导数也是相等的。 从而我们就能得到下面的公式: 这样我们可以把c和e用别的变量来表达 因此我们可以把最终的道路模型参数用下面的函数来表达 这就是这个论文提出的道路模型,这样是不是很好理解,而且很有根据。 Reference Jung C R, Kelber C R. A robust linear-parabolic model for lane following[C]//Computer Graphics and Image Processing, 2004. Proceedings. 17th Brazilian Symposium on. IEEE, 2004: 72-79.

常用颜色的RGB分布

RGB色彩模式是工业界的一种颜色标准,它通过对红(RED)、绿(GREEN)、蓝(BLUE)三种基本颜色的相互组合从而叠加出各种颜色。RGB色彩模式为每一个红、绿、蓝分类了0-255范围内的亮度值。 RGB色彩模式通常RGB(0,0,0)的格式来表示颜色,括号中的3个数字分别表示红、绿、蓝的亮度值,常用的颜色的RGB颜色分布有以下这些: 品红色 (255,0,255) 蓝色 (0,0,255) 青色 (0,255,255) 绿色 (0,255,0) 黄色 (255,255,0) 红色 (255,0,0) 紫色 (128,0,128) 深蓝色 (0,128,128) 鸭绿色 (0,128,128) 深绿色 (0,128,0) 橄榄绿 (128,128,0) 栗色 (128,0,0) 黑色 (0,0,0) 灰色 (128,128,128) 银色 (192,192,192) 白色 (255,255,255)

实现combobox模糊查询的时候报错 InvalidArgument=“0”的值对于“index”无效

因为要对combobox实现模糊查询,因为系统实现的匹配只能从左到右进行匹配,所以利用两个list来进行模糊匹配,主要代码如下: List<string> listOnit = new List<string>(); //绑定原始数据源 List<string> listNew = new List<string>(); private void comboBox1_TextUpdate(object sender, EventArgs e) { this.comboBox1.Items.Clear(); listNew.Clear(); //在原始数据源中遍历,把包含当前输入的内容添加到listNew中 foreach (string item in listOnit) { if (item.Contains(this.comboBox1.Text)) { listNew.Add(item); } } this.comboBox1.Items.AddRange(listNew.ToArray()); this.comboBox1.SelectionStart = this.comboBox1.Text.Length; Cursor = Cursors.Default; this.comboBox1.DroppedDown = true; } 这个代码可以实现模糊匹配,但是有个诡异的错误,就是当你输入某些内容先匹配到,但是最后却没有匹配项就会报错。打个比方,你想输入“张四”,数据源中有“张三”,你先输入“张”,然后出现所有带有“张”的匹配项,然后你在输入“四”,则没有了匹配项,则会出现报错,报错信息如下: ************** 异常文本 ************** System.ArgumentOutOfRangeException: InvalidArgument=“0”的值对于“index”无效。 参数名: index 在 System.Windows.Forms.ComboBox.ObjectCollection.get_Item(Int32 index) 在 System.Windows.Forms.ComboBox.get_Text() 在 System.Windows.Forms.ComboBox.WmReflectCommand(Message& m) 在 System.Windows.Forms.ComboBox.WndProc(Message& m) 在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 我在网上找,一直找不到原因,我也找不到这个问题具体错在什么地方。要吐槽的是这个Textupdate事件根本没办法调试,因为当你输入第一个字匹配之后,他就会默认选择第一项从而进入selectchange事件,也就没办法调试了,后来苦苦思索终于想到一个解决方法,虽然不知道原因,但终究还是解决了。就是当combobox没有匹配项的时候,就在它的下拉框添加空字符串,这样就能组织报错了,稍微改了一下代码就可以了。

微软Visual Studio Code基本特征

Visual Studio Code它的核心功能还是作为一个代码编辑器。和其他的代码编辑器一样,VScode采取通用的UI和布局,浏览器在左边,显示所有的文件和文件夹,右边你打开的文件的编辑页面。 文件,文件夹以及项目 VScode是基于文件和文件夹的,你可以立即开始通过打开一个文件和文件夹。除了这些,VScode能够读不同框架和平台定义的项目文件。比如,如果你打开的文件夹包含一个或者多个package.json,project.json,tsconfig.json,或者ASP.NET 解决方案和项目文件,VScode可以读取这些文件并且利用他们来提供额外的功能比如代码补全功能。 打开VScode 你可以从命令行利用VScode打开文件,文件夹或者项目。 打开VScode中的一个index.html文件: code index.html 打开文件夹c:\src\Contents: code c:\src\contents VScode中并不区分是打开文件夹还是打开项目。如果你打开的文件夹包含项目文件,VScode会读取这些文件并且显示这些项目内容在状态栏中。在这你也可以进行不同的项目之间的切换。 打开文件夹c:src\WebApp中包含的项目: code c:\src\webapp 换句话说,打开包含项目的文件夹能够有效地打开项目: 打开当前文件夹: code . 基本布局 VScode布局简单,能够最大化编辑界面并且也能够留下足够的空间浏览文件夹或者项目的内容。UI可以分成四个部分 编辑器 最主要地区域编辑文件。最多可以打开三个编辑页面。 边栏 包括不同的视图,比如你在处理项目时候地浏览器 状态栏 显示你正在打开项目和文件的状态 视图栏 可以让你在不同的视图中进行切换 每次你打开VScode都会恢复到上一次关闭的状态。文件夹布局如下所示。 不是把文件放在不同的tab之中,VScode可以最多同时打开3个编辑器。 并排编辑 你可以最多可以并排打开3个编辑器。 如果你已经有一个编辑器打开,你可以通过各种不同的途径打开另外的编辑器。 Ctrl 在浏览器中打开一个文件 comman+\ 将编辑器分成两个 无论何时你打开另外一个文件,编辑器将会激活正在打开的文件。

如何将网络流转化为内存流 C#

//将获取的文件流转化为内存流 public static MemoryStream ConvertStreamToMemoryStream(Stream stream) { MemoryStream memoryStream = new MemoryStream(); if (stream != null) { byte[] buffer = ReadFull(stream); if (buffer != null) { var binaryWriter = new BinaryWriter(memoryStream); binaryWriter.Write(buffer); } } return memoryStream; } public static byte[] ReadFull(Stream input) { byte[] buffer = new byte[16 * 1024]; using (MemoryStream ms = new MemoryStream()) { int read; while ((read = input.Read(buffer, 0, buffer.Length)) > 0) { ms.Write(buffer, 0, read); } return ms.ToArray(); } }

datagridview里面的checkbox全选和取消全选

全选 设置全选button,选中所有的checkbox private void selectAll_Click(object sender, EventArgs e) { //遍历datagridview中的每一行,判断是否选中,若为选中,则选中 for (int i = 0; i < dataGridView1.Rows.Count; i++) { if ((Convert.ToBoolean(dataGridView1.Rows[i].Cells[0].Value) == false)) { dataGridView1.Rows[i].Cells[0].Value = "True"; } else continue; } } 取消全选 设置取消全选button,取消选中的所有checkbox private void cancelAll_Click(object sender, EventArgs e) { for (int i = 0; i < dataGridView1.Rows.Count; i++) { if ((Convert.ToBoolean(dataGridView1.Rows[i].Cells[0].Value) == true)) { dataGridView1.Rows[i].Cells[0].Value = "False"; } else continue; } }