Excel 创建一个按纽用来对B列进行表格排序扩展选定区域什么意思,区域是A4:W200,求代码?

MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的 heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。 

当然MAT也有独立的不依赖Eclipse的版本,只不过这个版本在调试内存的时候,需要将DDMS生成的文件进行转换,才可以在独立版本的MAT上打开。不过Android SDK中已经提供了这个Tools,所以使用起来也是很方便的。

这里是MAT的下载地址:,下载时会提供三种选择的方式: 

  • Archived Update Site 这种方式安装的位置和上一种差不多,只不过第一种是在线下载,这一种是使用离线包进行更新,这种方式劣势是当这个插件更新后,需要重新下载离线包,而第一种方式则可以在线下载更新。

下载安装好之后,就可以使用MAT进行实际的操作了。

Shallow size就是对象本身占用内存的大小,不包含其引用的对象。

  1. 常规对象(非数组)的Shallow size有其成员变量的数量和类型决定。
  2. 数组的shallow size有数组元素的类型(对象类型、基本类型)和数组长度决定 
    因为不像c++的对象本身可以存放大量内存,java的对象成员都是些引用。真正的内存都在堆上,看起来是一堆原生的byte[],char[], int[],所以我们如果只看对象本身的内存,那么数量都很小。所以我们看到Histogram图是以Shallow size进行排序的,排在第一位第二位的是byte,char 。

Retained Heap的概念,它表示如果一个对象被释放掉,那么该对象引用的所有对象(包括被递归释放的)占用的heap也会被释放。 
如果一个对象的某个成员new了一大块int数组,那这个int数组也可以计算到这个对象中。与shallow heap比较,Retained heap可以更精确的反映一个对象实际占用的大小(因为如果该对象释放,retained heap都可以被释放)。

  1. 我在A里new了一块内存,赋值给A的一个成员变量。

  2. 我让B也指向这块内存。

    此时,因为A和B都引用到这块内存,所以A释放时,该内存不会被释放。所以这块内存不会被计算到A或者B的Retained Heap中。

  • 对象A引用B和C,B和C又都引用到D(一个菱形)。

    • A的包括A本身和B,C,D。

在这里例子中,树根是A,而B,C,D是他的三个儿子。B,C,D不再有相互关系。

我觉得是为了加快计算的速度,MAT将对象引用图转换成对象引用树。把引用图变成引用树,计算Retained Heap就会非常方便,显示也非常方便。对应到MAT UI上,在dominator tree这个view中,显示了每个对象的shallow heap和retained heap。然后可以以该节点为树根,一步步的细化看看retained heap到底是用在什么地方了。

这种从图到树的转换确实方便了内存分析,但有时候会让人有些疑惑。本来对象B是对象A的一个成员,但因为B还被C引用,所以B在树中并不在A下面,而很可能是平级。

  • outgoing references :表示该对象的出节点(被该对象引用的对象)。
  • incoming references :表示该对象的入节点(引用到该对象的对象)。

为了更好地理解Retained Heap,下面引用一个例子来说明:

把内存中的对象看成下图中的节点,并且对象和对象之间互相引用。这里有一个特殊的节点GC Roots,这就是reference chain(引用链)的起点: 

从obj1入手,上图中蓝色节点代表仅仅只有通过obj1才能直接或间接访问的对象。因为可以通过GC Roots访问,所以上图的obj3不是蓝色节点;而在下图却是蓝色,因为它已经被包含在retained集合内。

  • GC发现通过任何reference chain(引用链)无法访问某个对象的时候,该对象即被回收。

名词GC Roots正是分析这一过程的起点,例如JVM自己确保了对象的可到达性(那么JVM就是GC Roots),所以GC Roots就是这样在内存中保持对象可到达性的,一旦不可到达,即被回收。

通常GC Roots是一个在current thread(当前线程)的call stack(调用栈)上的对象(例如方法参数和局部变量),或者是线程自身或者是system class loader(系统类加载器)加载的类以及native code(本地代码)保留的活动对象。所以GC Roots是分析对象为何还存活于内存中的利器。

这里介绍的不是MAT这个工具的主界面,而是导入一个文件之后,显示OverView的界面。

一、打开经过转换的hprof文件:

如果选择了第一个,则会生成一个报告。这个无大碍。

我们需要关注的是下面Actions区域,介绍4种分析方法:

  1. Histogram:列出内存中的对象,对象的个数以及大小

该窗口列出了,可能有问题的代码片段。点击Details可以查看相关的详情。 

MAT中的一些有用的视图

在Histogram和Domiantor Tree界面,可以选择将结果用另一种Group的方式显示(默认是Group by Object),切换到Group by package,可以更好地查看具体是哪个包里的类占用内存大,也很容易定位到自己的应用程序。 

这里也要说明一下Java的引用规则: 
从最强到最弱,不同的引用(可到达性)级别反映了对象的生命周期。

  • Strong Ref(强引用):通常我们编写的代码都是Strong Ref,于此对应的是强可达性,只有去掉强可达,对象才被回收。

  • Soft Ref(软引用):对应软可达性,只要有足够的内存,就一直保持对象,直到发现内存吃紧且没有Strong Ref时才回收对象。一般可用来实现缓存,通过java.lang.ref.SoftReference类实现。

}

30到60分钟的速成课,让你了解的实际应用,以及它的缺陷。

人工智能已经成为现在的热门词汇,而医疗健康也是也是很有潜力的行业。最终会完全代替医疗人员吗?或者它们会让从业者从事更加有趣、更有价值的工作吗?

医学专家和研究人员不能一夜之间学会和数据分析,但他们需要了解AI究竟是什么、是如何工作的、现在达到了什么水平、将来会怎样发展,以及数据科学家的工作是什么。这就是本文要讲的内容,从中你会了解机器学习的基础概念,例如交叉验证和过度拟合,以及在实践中最常见的困难和缺点。

我们会在文中讲解如何建立一套,用核磁共振(MRI)数据估计大脑的生理年龄。你会学到如何用入门级线性回归知识和高级深度打造先进的算法,可以自动辨识暗示着大脑的年龄的特征,例如白质稀疏症和大脑皮层萎缩。这篇文章面向所有读者,即使你不是放射科医生也没关系,我们会从科学的角度,向大家展示大脑的生理年龄对理解神经退行性疾病是很有帮助的。在文章的最后,我们会证明,算法估计出患有阿尔兹海默症病人的大脑年龄,比正常人老了六岁。

在最近的一篇文章中,机器学习领军人物Michael Jordan试图给AI去神秘化:

“现在大多被称作AI的东西实际上在过去几十年都属于机器学习。机器学习结合了统计学、计算机科学和很多其他学科,设计算法处理数据,进行预测,从而做出决定。”

事实上,对大脑年龄的估计可以看做是一种监督式的机器学习问题,这是数据科学家们很擅长的问题。监督式机器学习问题的目标就是创造一种算法,能够在给定输入X的情况下输出Y。在这里,我们的X是MRI数据,Y是大脑年龄。机器学习算法关键的一点就是他们用真实世界的数据进行训练,并非根据专家制定的规则进行设计。如果你能用X和Y解决医学问题,那你也能成为半个数据科学家了。

遇到这样的问题,数据科学家们采取的方法是一样的:

分析数据、提取相关特征

用数据训练算法、分析错误、解释结果

不断迭代,直至算法达到最佳性能

我们将对这些步骤一一讲解,重点解释最常用的机器学习工具,以及常见错误。

机器学习的运用少不了对硬件环境的要求,如果你只有一台笔记本、用Excel操作的话,可能会很痛苦,因为这里的数据集体量很大,也很复杂(因为是3D图像)。所以一台好的机器可能需要如下配置:

一个可以存储并快速的SSD硬盘:项目结束后我们可能有大约500GB的数据

大量的(如128GB)

多核处理器(如32核)

至少一台高性能,GPU对于至关重要。

软件方面,我们用作为编程语言。

另外,数据科学需要你掌握一些理论知识,例如应用数学、统计学、算法以及编程经验、数据库管理等等。数据科学家可能来自不同领域,但经常需要分析或咨询,在他们的工作中使用机器学习工具会非常有帮助。

在这个项目里,我们用了两个公开的数据集,A中包含了来自伦敦三家不同医院的数据,有将近600名病人。数据集B包含了来自美国、中国和德国25家不同医院的1200多名病人的数据。一份MRI数据可能包括了多张图像,表示不同生理特征(T1、T2、FLAIR、D等等),称为序列。在我们的实验中,我们只用了最常见的T1序列。

这一部分对我们很容易,因为我们使用的数据集已经是经过管理的,是可用的。而且医学图像都是标准格式(DICOM)。

数据科学项目的开始就伴随着数据清洗,这并不是最令人激动的缓解,并且还会很费时。为了清洗数据,研究者首先需要研究它。

数据集A中包含一个病人信息的表格以及含有大量MRI数据的压缩文件夹。图像以NlfTI格式存储,NlfTI是DICOM的常见替代版本,每个项目都有自己的ID,可以在电子表格和MRI文件夹中找到。观察数据后,我们发现了几个问题:

有些项目有一个MlfTI文件夹,但并没有在电子表格中出现过。

相反地,一些项目在电子表格中出现,但没有在MlfTI中出现。

有些ID在电子表格中重复出现。

来源医院的名称并不在电子表格中显示,而是在压缩文件夹中隐藏。

一些NlfTI文件夹有问题,图像的分辨率会很低,而且经过部分裁剪。

看起来数据一团糟,但是这个数据集还不算无药可救,一些错误在医学数据集中算是很常见的,通常是由于数据的转换才造成了这样的结果。我们在数据集B中也遇到了类似的情况、最后,我们从数据集A中获得了563个“干净”的对象,从数据集中获取了1034个处理过的对象,仍然是较大规模的数据集。我们创建了另一个电子表格,有1597行,5列。每一列分别是ID、年龄、性别、MRI来源医院和相关NlfTI文件路径。具体表格可点击链接查看:/drive/1SWUcKT6bJLaTlxVLMvjHgLOD7Rdy3MQY#scrollTo=emyzNaHln9qa&forceEdit=true&offline=true&sandboxMode=true

数据显示,其中55%的研究对象为女性,最小的为18岁(我们在数据集中排除了儿童),最大的87岁。

当我们打开NlfTI文件夹后,发现图像之间的分辨率、立体像素值、视野、方向等差别很大。所以我们必须对它们进行规范化。

幸运的是,神经科学研究社区的研究人员曾开发过一些用于规范大脑MRI数据的软件工具,我们选择了ANTs以及一些自制的Python脚本,对每份MRI数据进行以下操作:

重新采样:将每立体像素的分辨率设为1mm3

N4偏见域矫正:该步骤是去除图像中的非生物。

制作统一的大脑图像模板:将所有图像转换到相同的方向、调整成同样的比例大小等等。

去除头骨:我们要从图像中移除颅骨,仅保留大脑,方便估计大脑的年龄。

立体像素密度归一化:在MRI中,立体像素的密度值是随机的(从0到100,或者从0到10000……)。我们使用了一种成为白条纹归一化的技术,它会白色物质的密度值,并将其设置为1。

这些操作都需要大量计算力,每个项目操作一遍需要5分钟,所以要处理完整个数据集大约需要5天!

医生有关大脑年龄都了解哪些知识

事实上,医生对大脑年龄的了解并不多!让医生单从一张大脑图像上判断准确的生理年龄几乎不可能。但是放射科医生们知道MRI上正常大脑都具备哪些形态。在大脑衰老的过程中,有三个主要特征可以在MRI的T1序列上发现,如图。

脑萎缩,图中灰色部分的厚度会减少

由于脑萎缩,会导致脑室扩张,其中会积聚脑脊髓液

为了方便解释,我们只对T1进行分析。实际上,放射科医生在判断脑龄时还会节课其他MRI序列。例如,在T2序列上的脑白质疏松症状更明显,其他序列能帮助检测某些与脑龄有关的结构特征。未来,功能性磁共振成像(fMRI)也许可以进一步提升脑龄判断的准确性。

从这里开始,就要进入算法部分了!

最初接触机器学习,最好的实践方法就是用简单的基准算法对复杂问题进行了解。所以,我们决定先不使用3D图像,而是用能够反映它们内容的立体像素强度直方图表示。

对于电脑来说,一份MRI就是由立体像素灰度的数值组成的3D网格,高值通常用黑色表示,低值用白色表示。一份图像的直方图就是这些值的直方图。其中一个例子如下所示,x轴表示灰度的值从0到1,y轴表示每个值的总立体像素值。

检测的核心思想是,同类组织的灰度值是相近的,所以为了确定灰色物质和白色物质的数量和占比,你可以计算二者有相似值的立体像素数量。

回到算法上,我们将输入的X用向量(一串数字)替换,共有200个。用数学表示,即对于单一MRI,X=[X1,X2,…,X200],其中Xi是在第i个项目中立体像素的数量。我们把对MRI的具体描述称为特征向量。机器学习算法的主要概念就是,这里没有人类制定的规则告诉你如何将X输出Y,而是他们可以用数据学习这些规则。这就是深蓝(Deep Blue)和AlphaGo的主要区别之一。

更进一步,“训练”算法,表示搜索一种函数F,算法F(X)可以进行预测,其中输出的结果最接近真值Y。而“学习”就是一个优化问题,让预测结果和真值之间的误差达到最小。在我们的案例中,公寓1597对(X, Y)值,我们试着让|F(X)—Y|的绝对值误差最小。例如如果F(X)预测出年龄为23岁,而此时Y的实际值是21岁,绝对误差就是2岁。

交叉验证:分离训练集和测试集

现在,我们要进入机器学习过程中的重要一步:如何判断算法的有效性?机器学习解决这一问题的方法叫做交叉验证(cs-validation)。我们随机将数据集分成两部分:训练集和测试集(也叫做验证集)。训练集用来训练算法,验证集用来评估性能,看算法在从未见过的新数据上表现得怎样。

难处在与,我们如何设置训练集和测试集的比例,训练集越大,算法性能就越好,因为接受训练的数据更多。但是越大的测试集能反映出更可靠的性能,因为数据代表真实世界的情况。

这里我们运用了一种名为K-折交叉验证的方法,随机将数据集分为5部分,重复训练5次,每次都将该数据集用作测试集,其他四个用作训练集。这样进行五次之后,模型会更加可靠。

但是在医学研究中,仅有交叉验证是不够的,通常论文中的结果都被过度高估了,因为模型总在相同的数据集上多次迭代。所以,想要实际验证算法,就要用外部独立的数据集进行检测。

模型的种类有很多,为你的问题选择正确的一种需要有一定的经验。大部分人都是从简单有效的方法开始的,所以这里,线性模型通常是一种好的选择。

在线性回归中,我们能用简单的代数找到最佳可能权重Wi。我们用Scikit Learn

当然,假设MRI直方图和年龄之间的关系是线性的有些过于简单。考虑到其中的非线性关系会让预测更加准确。这里我们用刀的是流行的Gradient tree boosting。这是决策树的一种形式,经过多次迭代可以减少误差。通过这一模型,我们将平均绝对误差减少到了5.71岁,与目前最佳结果4.16岁比较接近了。

在交叉验证中,我们将所有对象集合,随机分出了训练集和测试集。那么如果我们按医院来源分会怎样?最终我们发现线性回归和Boosting模型的绝对误差都增加了5到6岁。

下方的图示表明,对数据进行更认真的分析,可以避免这样的错误。可以看到,每个医院病例的年龄分布,大多数医院的患者年龄并不是平均分布的。

接下来,我们回执了每个医院患者的平均直方图:

每家医院立体像素强度直方图的平均曲线

从中我们得出结论:白色物质的变化与不同来源的医院有关,而灰色物质的变化在各家医院中都存在。所以有了这些特征,算法的目的就很明确了:

根据医院的数据信息限定预测年龄的范围

为了消除这种影响,我们决定返回到预处理的步骤,即立体像素值归一化。我们从单一的只修正白色物质的方法,改变成加入了灰色物质的方法。现在,两种物质都集中在直方图中了,平均直方图如下所示:

重新运行线性和非线性模型后,我们得到了更好地结果:

如果使用得当,非线性模型会很强大

在多中心研究中要十分注意交叉验证,尤其是当每个病人有多个样本,或者样本尺寸很小时。最佳方法是由外部的或独立的验证集,只分割数据有时并不是好方法。

泛化是算法能在从未见过的数据上保持预测性能的能力之前的交叉验证过程就是检测模型从训练数据到测试数据的泛化能力。

拟合表示模型表示数据的准确程度,如果算法在测试集和训练集上的表现都不好,那么就叫“欠拟合”。如果在训练集上表现很好,但测试集表现不好,就叫“过拟合”。

应对过拟合的方法有几种:添加更多数据(增加样本规模)、降低算法复杂程度、添加各种限制和规则、去除无用特征、如果出现过拟合就停止训练等等。在我们的案例中,想要降低模型复杂程度,就只能对MRI的分辨率进行下采样,获得更小的图像以及更少的立体像素。

我们用数据的方法提取了特征,研究能帮助我们进行年龄预测的方法。除此之外,深度学习采取的是另一种方法,即神经网络,可以直接在原始数据上工作。

在我们的研究中,我们将每个MRI轴向维度的200张图片减少到只有10张图,这些图像对应脑室中1cm的轴向区域,可以检测到潜在的脑萎缩、脑室扩张和脑白质疏松症。为了加快训练,我们使用了高性能的图形处理器GTX-1080Ti和 Python库加速训练。

最终,我们设计出了一个简单的、只有10层卷积层的,它在随机分割的数据集中的平均绝对误差为4.57岁,在按照医院划分的数据中平均绝对误差为6.94岁。之后我们用数据增强对模型进行改进。数据增强是指在数据集中加入少量干扰项,将图片旋转或缩放,从而让网络更稳定。

最终,我们将经过数据增强的CNN模型结果和在分割后的MRI上训练的线性模型结果取平均值,与人类专家的合作结果相比较,最终表明我们的模型在表现上得到了提升。

现在,我们已经可以用机器学习预测大脑年龄了,除此之外,这也有助于医学家们了解阿尔兹海默症这类的神经退行性疾病。不过,研究者在搭建分析模型时依然要小心,交叉验证要采取合适的方法,才能保证结果的可靠。

}

数据合并主要包括两种操作:

  • 融合(merging):pd.merge()方法可以根据一个或多个键将不同的DataFrame中的行连接在一起

pd.concat()函数可以将根据不同的轴进行合并,常用参数如下:

  • axis:需要合并链接的轴,0是行,1是列,默认为0
0
0
0
0

通过以上的结果发现,当join=‘outer’,axis参数为0时,列进行并集处理,纵向表拼接,缺失值由NaN填充,并且会保留原有数据的行索引。

如果两个表的Index都没有实际含义,使用ignore_index参数,设置成True,即可重新整理一个新的index。

0
0
0
0
  • 如果join参数为inner,得到的是两表的交集;
  • 如果join参数为outer,得到的是两表的并集。
  • on:指的是用于连接的列索引名称,必须存在于左右两个DataFrame,如果没有指定且其他参数也没有指定,则以两个DataFrame列名交集作为连接键
0 0 0

merge()默认采用inner连接,并且使用两个DataFrame的列名交集(key)作为连接键,同意,最终连接的数据也是两个DataFrame key列数据的交集

0

当merge()做outer连接时,最终连接的数据是两个DataFrame key列数据的并集,确实内容由NaN填充

0 0

当merge()做left连接时,最终连接的数据是以left数据的链接键为基准合并两个数据的列数据,确实的内容由NaN填充

那么,当两个DataFrame使用right连接时,会发生什么呢?

0 0

两种合并方式的应用场景:

  • 有两张表格分别存储了9月和10月份的成交信息,此时可以使用concat()将两个表沿0轴合并
  • 现在有两张表格,一个是城郊型,包含订单号、金额、客户ID等;第二个是客户信息,包含客户ID、姓名、电话号码等信息,此时可以使用merge()根据客户ID讲两个表合并成一个完整的表

前面的内容中,我们学习了如何获取一条数据或连续的多条数据,但实际工作中我们经常需要处理上万条。,甚至更多的数据。
那么,要如何才能快速的筛选出符合条件的数据呢?

0

1. 要将关注者超过100的用户数据获取出来

来复盘一下以上代码的逻辑:

  1. 首先判断每个用户的关注者数量是否大于100,大于则返回True,表示该行被标记为True,否则被标记为False。bools记录了每一行是否符合筛选条件,是一个Series对象,其中的值是bool类型。
  1. 然后,根据bools每行的值来对df进行筛选,值为True,表示对应的行会留下,否则去除
  1. 最后打印的df1数据就是关注者超过100的用户数据。这是pandas根据某列的值进行筛选的基本逻辑

根据某列的值进行筛选的逻辑如上所述,那么,如果要进行多条件的联合筛选呢?

2. 获取关注者超过300切关注的数量超过100的用户数据

0
0
  1. 因为我们的需求是要同时满足两个条件,所以使用逻辑运算符连接两个值
  2. 最后获取同时满足两个条件的值

3. 数据筛选的第二种方法

使用loc[]方法实现筛选的效果。

0

在数据获取过程中,数据的排序也是我们经常需要处理的问题。例如:我们需要找出关注者数量前10的用户信息

那么,DataFrame的这两个方法有什么区别呢?

1. 根据国家名称来进行排序

  1. inplace=True参数和我们之前见过的作用一样,用来控制是否直接对原始数据进行修改
  2. ascengding可以控制排序的顺序,默认值True小到大升序排列,但设置为False时就可以实现降序排列

2. 获取关注者数据前十的用户数据

那么我们需要根据关注者这一列数据进行排序。

0
  1. by:决定了是按照数据中的哪一列进行排序,将需要按照某列排序的列名赋值给by即可
  2. inplace=Ture:用来控制是否直接对原始数据进行修改
  1. 目前手上有两份数据,将两个csv数据合并成一个,并按骑行时间进行降序排列,获取最长的骑行时间。
0

0

0



  1. 根据第六次全国人口普查中的常住人口数据,获取全国人口最多的10个城市。数据信息:共包含省、地区、结尾、常住人口4个字段。
  • series.str会将每个数据转换成字符串
  • contains()判断字符串是否含有指定字段,返回的是bool类型
}

我要回帖

更多关于 表格排序扩展选定区域什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信