精华内容
下载资源
问答
  • 局部图像处理

    千次阅读 2017-11-23 20:29:54
    局部特征(1)——入门篇  局部特征 (local features),是近来研究的一大热点。大家都了解全局特征(global features),就是方差、颜色直方图等等。如果用户对整个图像的整体感兴趣,而不是前景本身感兴趣的话,...

    (转载请注明来源:http://blog.csdn.net/jiang1st2010/article/details/7621681)    

    局部特征(1)——入门篇

        局部特征 local features),是近来研究的一大热点。大家都了解全局特征(global features),就是方差、颜色直方图等等。如果用户对整个图像的整体感兴趣,而不是前景本身感兴趣的话,全局特征用来描述总是比较合适的。但是无法分辨出前景和背景却是全局特征本身就有的劣势,特别是在我们关注的对象受到遮挡等影响的时候,全局特征很有可能就被破坏掉了。而所谓局部特征,顾名思义就是一些局部才会出现的特征,这个局部,就是指一些能够稳定出现并且具有良好的可区分性的一些点了。这样在物体不完全受到遮挡的情况下,一些局部特征依然稳定存在,以代表这个物体(甚至这幅图像),方便接下来的分析。我们可以看下面这个图,左边一列是完整图像,中间一列是一些角点(就是接下来我们要讲的局部特征),右边一列则是除去角点以外的线段。不知道你会不会也觉得你看中间一列的时候能更敏感地把他们想象成左边一列的原始物品呢?一方面说,如果我们用这些稳定出现的点来代替整幅图像,可以大大降低图像原有携带的大量信息,起到减少计算量的作用。另一方面,当物体受到干扰时,一些冗余的信息(比如颜色变化平缓的部分和直线)即使被遮挡了,我们依然能够从未被遮挡的特征点上还原重要的信息。

        把局部特征说的这么好听,你也许会问怎样的特征能够被当做局部特征点呢?我们不妨来看下面的这幅图:

        我们选择了3个部分:边缘的点、边缘的线、变化缓慢的天空,当我在左边的图像中选择哪个部分的时候,你最有可能从右边的图像中找到对应的部分来呢?很显然是边缘的点吧-------天空,那么多都是一样的;而边缘,一条直线往左看往右看都是差不多的,你让我选哪个点(这也叫做aperture problem);而顶点相比之下更具有唯一性,所以局部特征最初的研究也就是从角点开始的(比如Harris Corner)。

        一种定量的检测方法,就是通过SSD去比较两个块区域以定义一个相似度,值越小,两个块越相似:

        当然我们应该知道,检测出的块应该和周围有一定的区分性,如何体现这种区分性,不妨做个试验:当前块和它的邻域做匹配,显然自己和自己匹配的时候值最小,而如果周围一定范围的值都特别小,那我们岂不是自己和自己都无法找到匹配,那还拿他当特征干啥?所以如果下式有明显极值,就可以把它当做特征点了。(式中的Δu表示当前块与比较邻域之间的位移)

        这个过程就是早期的Harris Corner的核心思想(如果读者想了解Harris Corner的具体细节,请参见该系列的下一篇博客)。

        总结一下,好的特征应该具有以下几个特点:

           1、重复性:不同图像相同的区域应该能被重复检测到,而且不受到旋转、模糊、光照等因素的影响;

           2、可区分性:不同的检测子,应该可以被区分出来,而为了区分它们,应运而生的就是与检测对应的描述子了;

           3、数量适宜:检测子可别太多,不然啥阿猫阿狗都能出来混,但也不能太少,要求太高可就招不到人才了;

           4、高定位(尺度和位置):是在哪出现的,最好就在哪被找到,可别跑偏了;

           5、有效性:检测速度越快越好。

        在接下来的几篇文章里,我主要针对局部特征,特别是目前使用的特别火热的SIFT特征和SURF特征进行一些描述和总结。这两个特征都是鲁棒性特别好的局部特征,被广泛应用在模式识别方面。

        关于局部特征的更多介绍,请见http://download.csdn.net/download/jiang1st2010/4343689 ,下载ppt查看(免积分)。

     

    局部特征(2)——Harris角点

      在入门篇中偶尔谈到了Harris Corner,在这里我们就重点聊一聊Harris Corner。

           Harris Corner是最典型的角点检测子Corner Detector角点经常被检测在边缘的交界处、被遮挡的边缘、纹理性很强的部分。满足这些条件一般都是稳定的、重复性比较高的点,所以实际上他们是不是角点并不重要(因为我们的目标就是找一些稳定、重复性高的点以作为特征点)。

    Harris Corner基于二阶矩阵:

    这个矩阵描述了局部邻域内梯度的分布情况。矩阵的两个特征值可以用来描述两个主要方向上信号的变化,因此特征值可以用来判决是否为特征点。Harris采用的判别方法是:

    显而易见,cornerness的值越大,对应的两个特征值都应该很大,其中λ取0.04,是为了抑制比较明显的直线。最后对整幅图像得到的cornerness做一个非极大抑制,得到最后的特征点。Harris角点具有的优点是平移不变、旋转不变,能克服一定光照变化。可以先从一个例子上观察Harris Corner实现的过程:

    现在有几个问题:首先为什么3.1式矩阵的两个特征值可以用来描述两个主要方向上信号的变化另外一个问题是为什么3.4式用来决定是否为角点。

    要知道为什么3.1可以作为这个矩阵,我们了解一下具体怎么推出这个式子的,那这又要从Moravec算子说起,步骤如下:

    0将要判断的点置于一个3*35*5的图像块的中心,如下图用红色的线环绕的图像块。

    1将红色的框朝8个方向移动一格,得到蓝色的框(下图为向右上角移动)。导致一个缺点:响应是各向异性的(啥意思?)

    2将红色的框和蓝色的框的相同坐标值的点的像素值相减,并求平方和,可以得到8个值。

    38个值中的最小的值作为角点像素的变化值。(因为角点应该在xy方向上变化都比较大;而在边缘上只可能一个方向大、另一个方向小)

    4求出每一个像素点的角点像素变化值,在局部图像块中,该值最大的点为角点。

    Harris算子将Moravec算子做了两个推广:

    1)用像素的变化梯度代替像素值相减引入高斯窗函数(举个x方向上变化的例子为证)。

    引入高斯窗是为了滤除噪声的干扰。

    [-1,0,1]:x方向上的偏导,[-1,0,1]T:y方向上的偏导。

    2)推广出了一个公式这样可以计算任意方向上的像素值变化,而不在是8个固定的方向。

    (这里的u、v表示x/y方向的位移)

    因为Vuv(x,y)的最小值才是这个点需要被考虑的值,因此我们重写以上表达式:

    看到M矩阵的形式了么?这就是Harris算子的那个原始矩阵,我想推到这里,你也就应该了解Harris矩阵为什么是这样子的了。

    第二个问题:为什么3.4可以用来描述是否为角点。

    可以参考这样一个图:描述了不同纹理下α和β的取值情况:

    a)没有什么纹理的情况下,两个值都很小(很小的正值)

    b)边缘的点,一个值大,另外一个值小(由于k取了很小的值,所以3.4的结果为一个小负值)

    c)角点:两个值都比较大(比较大的正值)

    这样,当我们把目标函数定义为3.4式的时候,得到的结果就会尽力满足两个特征值都比较大了。当然,除此之外,还有Harmonic mean等方式实现更理想的组合方式达到检测出的两个特征值都尽可能大。

    检测效果图(右图进行了旋转)

    局部特征(3)——SURF特征总结

    第一部分:兴趣点的检测

     

    1、 建立积分图。

    优点:任何一个垂直矩形区域的面积只需要进行3次 +/-法就能计算。一阶的haar小波响应只要5次+/-法就能计算。计算的时间和区域大小无关。

     

    2、 建立图像的尺度空间(应该分别有Dxx、Dxy、Dyy 三个尺度金字塔):

    用box filters代替二阶高斯差分模板。



    保持图像的大小不变,对box filters进行尺度变换:建立高斯金字塔,金字塔分为多个Octaves,每个Octave分为4个Scale levels。第一级的Octave的模块大小为9、15、21、27(相差6),第二级为15、27、39、51(相差12),第三级为27、51、75、99(相差24)。每一级第一个level的大小为上一级第二个level的大小。继续建立高斯金字塔,直到filter的大小大于原图像的大小为止(问题是大于每一Octave的第一个mask大小还是最后一个mask的大小?)。


     

    尺度变换的方法,与每个Octave第一个scale level的size(L)/3有关,例如第一个Octave的L为9,L/3=9/3=3,则对于每行/列,连续出现L/3个相同的值,则再插入2个相同的值。若某连续3行同时为1,则再插入两行0。若只连续1行为1,则1*(2/3)=1(四舍五入)。插入的行/列要求左右/上下对称。

     

    3、 对于尺度空间中的每一个box filter,与图像卷积,计算每一点上的Dxx、Dyy、Dxy,再计算每一点Hessian矩阵的行列式。(卷积可以用积分图实现快速计算。)

         

    其中w是因为box filters只是高斯二阶差分的近似,为了使行列式的值大致相等,乘以这个权值,取0.9。注意,每Octave提高一级,计算行列式的时候,采样的间隔提高一倍。例如第一个Octave,每个点都计算,到了第二个Octave,隔一个点计算一个……(用增大模板大小,对图像上的点采样计算的方法,等同于实现对图像进行下采样并改变模板尺度的大小。)

    对于每一个Octave,对计算出行列式的值设一个阈值,大于该阈值的列为候选兴趣点。对候选极值点进行非极大抑制:对于该level的周围8个点以及上下scale level相应位置的9*2个点,一共26个点进行比较行列式的大小,若该点是周围26个点中行列式最大的,则保留。(每一个Octave的头尾两个scale level是没法计算的。)

    为什么可以用Hessian矩阵来判断极小值/极大值,请见最后。 


    最后,内插子像素精确定位(具体未看)。

     

    第二部分:特征描述子

     

    1、 主方向的确定(U-Surf没有此步骤)

    s = 当前mask大小 * 1.2 / 9

    以兴趣点为中心,确定6s为半径的圆。对圆内以s为步长的采样点计算haar小波响应(边长为4s)。

    以兴趣点为中心,对小波响应进行高斯加权()。对一个扇形区间(比如π/3)的水平和垂直方向的小波响应分别求和。最长矢量对应的扇形方向就是主方向。(每一个扇形窗可否有重复?)

     

    2、 以兴趣点为中心,主方向为参考x轴方向,20s为边长,做正方形区域,并将该区域分为4*4个子区域。(SURF-36把它分为3*3个子区域,区分性略差但速度快。)每个子区域取5*5个采样点,计算这些采样点上的haar小波响应dx和dy。以兴趣点为中心,对响应进行高斯加权(σ=3.3s)。

     

    3、 对每个子区域的dx、dy、|dx|、|dy|进行求和,归一化为单位向量。对于4*4个子块一共可以构成64维空间。(SURF-128在统计dx和|dx|时,把dy分为大于0时候和小于0时候两种情况,而在统计dy和|dy|时将dx分为大于0和小于0两种情况,这样每个子区域是8维向量)。


    附:最近的思考(2011.7.10补充):

    1、为什么Hessian矩阵可以用来判断极大值/极小值

    我的理解如下:

    在x0点上,hessian矩阵是正定的,且各分量的一阶偏导数为0,则x0为极小值点。

    在x0点上,hessian矩阵是负定的,且各分量的一阶偏导数为0,则x0为极大值点。

    对于某个局部区域,若hessian矩阵是半正定的,则这个区域是凸的(反之依然成立);若负定,则这个区域是凹的(反之依然成立)。而对于正定和负定来说,Hessian矩阵的行列式总是大于等于0的。反过来就是说:某个点若是极大值/极小值,hessian矩阵的行列式必然要大于等于0,而大于等于0如果是满足的,这个点不一定是极大值/极小值(还要判断一阶导数)。所以后面还要进行极大值抑制。


    与SURF相关的局部特征是SIFT,已经有很多专家对它讨论过了,这里我也不再多谈,如果大家对它感兴趣的话,请看这里,而接下来的这篇博客则对SIFT和SURF做了比较

    局部特征(4)——SIFT和SURF的比较

    (转载请注明来源: http://blog.csdn.net/jiang1st2010/article/details/6567452)


    共同点:

    SIFT/SURF为了实现不同图像中相同场景的匹配,主要包括三个步骤:

    1、尺度空间的建立;

    2、特征点的提取;

    3、利用特征点周围邻域的信息生成特征描述子

    4、特征点匹配。

          从博客上看到一片文章,http://blog.csdn.net/cy513/archive/2009/08/05/4414352.aspx,这一段的大部分内容源于这篇文章,推荐大家去看看。

          如果两幅图像中的物体一般只是旋转和缩放的关系,加上图像的亮度及对比度的不同,要在这些条件下要实现物体之间的匹配,SIFT算法的先驱及其发明者想到只要找到多于三对物体间的匹配点就可以通过射影几何的理论建立它们的一一对应。

          如何找到这样的匹配点呢?SIFT/SURF作者的想法是首先找到图像中的一些“稳定点”,这些点是一些特殊的点,不会因为视角的改变、光照的变化、噪音的干扰而消失,比如角点、边缘点、暗区域的亮点以及亮区域的暗点。这样如果两幅图像中有相同的景物,那么这些稳定点就会在两幅图像的相同景物上同时出现,这样就能实现匹配。因此,SIFT/SURF算法的基础是稳定点。

          SIFT/SURF提取的稳定点,首先都要求是局部极值。但是,当两个物体的大小比例不一样时,大图像的局部极值点在小图像的对应位置上有可能不是极值点。于是SIFT/SURF都采用图像金字塔的方法,每一个截面与原图像相似,这样两个金字塔中就有可能包含大小最近似的两个截面了。

          这样找到的特征点会比较多,经过一些处理后滤掉一些相对不稳定的点。

          接下来如何去匹配相同物体上对应的点呢?SIFT/SURF的作者都想到以特征点为中心,在周围邻域内统计特征,将特征附加到稳定点上,生成特征描述子。在遇到旋转的情况下,作者们都决定找出一个主方向,然后以这个方向为参考坐标进行后面的特征统计,就解决了旋转的问题。


     

    共同的大问题有以下几个:

    1、为什么选用高斯金字塔来作特征提取?

          为什么是DOG的金字塔?因为它接近LOG,而LOG的极值点提供了最稳定的特征,而且DOG方便计算(只要做减法。)

          为什么LOG的极值点提供的特征最稳定,有参考文献,未看。

         (7.12补充:)直观理解:特征明显的点经过不同尺度的高斯滤波器进行滤波后,差别较大,所以用到的是DOG。

          但是直观上怎么理解?如果相邻Octave的sigma不是两倍关系还好理解:如果两幅图像只是缩放的关系,那么假设第一个Octave找到了小一倍图像的极值点,那么大一倍图像的极值点会在下一个Octave找到相似的。但是现在,如果把大一倍图像进行一次下采样(这样和小的图像就完全一样了),进行Gauss滤波时,两个图像滤波系数(sigma)是不一样的,不就找不到一样的极值点了么?不理解。

    2、Hessian矩阵为什么能用来筛选极值点?

          SIFT先利用非极大抑制,再用到Hessian矩阵进行滤除。SURF先用Hessian矩阵,再进行非极大抑制。SURF的顺序可以加快筛选速度么?(Hessian矩阵滤除的点更多?)

          至于SURF先用Hessian矩阵,再进行非极大抑制的原因,是不管先极大值抑制还是判断Hessian矩阵的行列式,金字塔上的点的行列式都是要计算出来的。先判断是否大于0只要进行1次判断,而判断是否是极大值点或者极小值点要与周围26个点比较,只比较1次肯定快。

          而在SIFT中,构建的高斯金字塔只有一座(不想SURF是有3座),要进行非极大抑制可以直接用金字塔的结果进行比较。而如果计算Hessian矩阵的行列式,还要再计算Dxx、Dxy、Dyy。因此先进行非极大抑制。这两个步骤的先后与SIFT/SURF的实际计算情况有关的,都是当前算法下的最佳顺序,而不是说哪种先计算一定更好。

    3、为什么采用梯度特征作为局部不变特征?

          这与人的视觉神经相关。采用梯度作为描述子的原因是,人的视觉皮层上的神经元对特定方向和空间频率的梯度相应很敏感,经过SIFT作者的一些实验验证,用梯度的方法进行匹配效果很好。

    4、为什么可以采用某些特征点的局部不变特征进行整幅图像的匹配?

          我在一份博客上找到这样一句话:(http://apps.hi.baidu.com/share/detail/32318290,大家可以看看这篇文章。)

    从直观的人类视觉印象来看,人类视觉对物体的描述也是局部化的,基于局部不变特征的图像识别方法十分接近于人类视觉机理,通过局部化的特征组合,形成对目标物体的整体印象,这就为局部不变特征提取方法提供了生物学上的解释,因此局部不变特征也得到了广泛应用。

          还有:

          图像中的每个局部区域的重要性和影响范围并非同等重要,即特征不是同等显著的,其主要理论来源是Marr的计算机视觉理论和Treisman的特征整合理论,一般也称为“原子论”。该理论认为视觉的过程开始于对物体的特征性质和简单组成部分的分析,是从局部性质到大范围性质。

          SIFT/SURF都是对特征点的局部区域的描述,这些特征点应该是影响重要的点,对这些点的分析更加重要。所以在局部不变特征的提取和描述时也遵循与人眼视觉注意选择原理相类似的机制,所以SIFT/SURF用于匹配有效果。

     

     

    不同点的比较:

    从博客上看到一个总结,我修改了一些内容。大家可以参看以下链接:

    http://blog.csdn.net/ijuliet/archive/2009/10/07/4640624.aspx

     

    SIFT

    SURF

    尺度空间

    DOG与不同尺度的图片卷积

    不同尺度的box filters与原图片卷积

    特征点检测

    先进行非极大抑制,再去除低对比度的点。再通过Hessian矩阵去除边缘的点

    先利用Hessian矩阵确定候选点,然后进行非极大抑制

    方向

    在正方形区域内统计梯度的幅值的直方图,找max对应的方向。可以有多个方向。

    在圆形区域内,计算各个扇形范围内x、y方向的haar小波响应,找模最大的扇形方向

    特征描述子

    16*16的采样点划分为4*4的区域,计算每个区域的采样点的梯度方向和幅值,统计成8bin直方图,一共4*4*8=128维

    20*20s的区域划分为4*4的子区域,每个子区域找5*5个采样点,计算采样点的haar小波响应,记录∑dx,∑dy,∑|dx|,∑|dy|,一共4*4*4=64维

     SURF—金字塔仅仅是用来做特征点的检测。在计算描述子的时候,haar小波响应是计算在原图像(利用积分图)。而SIFT是计算在高斯金字塔上(注意不是高斯差分金字塔。)

    性能的比较:

    论文:A comparison of SIFT, PCA-SIFT and SURF 对三种方法给出了性能上的比较,源图片来源于Graffiti dataset,对原图像进行尺度、旋转、模糊、亮度变化、仿射变换等变化后,再与原图像进行匹配,统计匹配的效果。效果以可重复出现性为评价指标。

    比较的结果如下:

    method

    Time

    Scale

    Rotation

    Blur

    Illumination

    Affine

    Sift

    common

    best

    best

    common

    common

    good

    Pca-sift

    good

    good

    good

    best

    good

    best

    Surf 

    best

    common

    common

    good

    best

    good

     

     

     

     

     

     

        由此可见,SIFT在尺度和旋转变换的情况下效果最好,SURF在亮度变化下匹配效果最好,在模糊方面优于SIFT,而尺度和旋转的变化不及SIFT,旋转不变上比SIFT差很多。速度上看,SURF是SIFT速度的3倍。

    局部特征(5)——如何利用彩色信息 Color Descriptors

    (转载请注明出处:http://blog.csdn.net/jiang1st2010/article/details/7647766)


            前面两讲中主要是针对SIFT和SURF做了一些介绍。他们的检测子比较稳定,描述子比较鲁棒,好像非常棒的样子。但是有一点非常遗憾,就是他们在对图像进行处理的过程中,都把图像转化为灰度图像进行处理,这样就丢失了颜色信息。而颜色,本身提供了很大的信息量,丢失了特别可惜。很多人可能就会想,如何在描述子中加入颜色信息。在这一讲中,我们就重点介绍一下改进的SIFT/SURF的Color Descriptor。

            这里的Descriptor,其实我们可以把它当做大家传统上理解的特征。而特征,应该具有两个比较重要的特点。第一就是它应该是最有区分度、最有代表性的,应该尽可能减少冗余的信息。如果对于大多数物体来说,这个变量的值非常相近,没有什么区分性,自然不适合做特征。而另一个方面,它应该尽可能的稳定和鲁棒。对于同样的物体来说,当它因为噪声的变化或者图像的旋转、尺度变换等影响时,这个变量的值应该是尽可能不变的(invariant)。 我们要评价一个描述子是否鲁棒,重点就看图像被加入噪声后,形成的描述子是否依然稳定(也就是特征的各维是否不发生变化)。这里所谓的噪声,无外乎以下几种:

            这里几乎把所有可能发生的线性变化都列出来了。可以考虑到,现有的灰度的SIFT/SURF特征对于1-3的变化具有不变性。这主要得益于1)他们都采用梯度的直方图(Haar小波也是计算了梯度),这样可以消除intensity shift。2)RGB的线性变化不影响梯度的方向。3)最终都对描述子向量做了归一化,解决了灰度的尺度变化。这样的话,我们需要考虑的就是如何解决4-5的颜色上的变化了。在此之前,我们先看看目前不用在SIFT/SURF上有哪些颜色特征,然后考虑把这些颜色特征放到描述子中。

            1、RGB histogram,最常见的颜色直方图,你懂的,但是不具有任何不变性,想到这里以后还是换个特征用吧。

            2、Opponent histogram


            O1和O2表征了颜色信息,对lightintensity shift是不变的,不过O3这个直接与灰度相关的变量就不是了。

            3、Hue histogram

            这个大家也熟悉,它对灰度的尺度变化和增量变化具有不变性。所以说HSV颜色空间对于RGB颜色空间,在这一点上有着优势。

            4、rg histogram

            相当于对rgb分量做了一个归一化,归一化之后r/g分量就可以描述图像的颜色信息。其中b分量是多余的,因为r+g+b=1。Rg直方图对light intensity change是不变的,对于存在阴影的场景中可以尝试用。


            5、transformed colorhistogram

            考虑到rgb直方图对于灰度和颜色的线性变化不具有任何不变性,但是如果我们考虑对RGB三个通道分别做归一化,归一化的方法如:


            这样,通过减去均值可以抵消各通道的valueshift,通过除以方差可以抵消各通道的value scale change。(均值和方差以待统计的块为单位进行计算。)这样归一化之后的直方图对于light color change and shift是具有不变性的。

     

            列举了颜色直方图的几种统计方法之后,我们可以把他们用在SIFT/SURF描述子之中。因为传统的SIFT/SURF描述子是对单通道进行统计的,当使用上述特征进行统计时,就是对多个通道分别计算描述子,最后形成一个多维的特征作为颜色描述子。重点想提一下的就是:

            C-SIFT:利用Opponentinformation中的 O1/O3和O2/O3作为颜色特征,这么做的目的是为了消除O1和O2中的灰度信息,但是,这样做却不能对intensity shift有不变性。

            Transformedcolor SIFT:这个特征将不仅对灰度的change和shift具有不变性,同时还对各颜色的shift和change都具有不变性;

            RGB-SIFT:很有意思的就是由于Transformedcolor SIFT对各通道的线性变化都具有不变性,而Transformed就是RGB特征经过线性变换而来,因此RGB-SIFT和Transformed color SIFT具有同样的不变性(效果是一样的)。

           最后,对上面介绍的所有特征的不变性做一个总结,见下表,其中“+”表示对这一变化具有不变性,“-”则表示不具有这种不变性。


    转载请注明出处:http://blog.csdn.net/jiang1st2010/article/details/7647766



     

    展开全文
  • 肌肉挫伤处理方法

    千次阅读 2015-06-17 17:07:39
    恒大队医康克宝医生专栏: 肌肉挫伤运动医学中又叫硬伤,是指...传统治疗方法是,直接冰敷然后加压包扎,但是在临床工作中,此方法处理后,第二天受伤的位置淤血发硬,疼痛加重,挫伤严重者几周都有疼痛。我对肌
    恒大队医康克宝医生专栏:


    肌肉挫伤运动医学中又叫硬伤,是指肌肉受到钝性暴力损伤时,引起局部软组织(包括皮肤、皮下组织、肌肉、其中包含有神经、血管和淋巴组织)的挫伤。在体育运动中身体对抗的时候,经常发生肌肉挫伤,受伤后会产生局部疼痛、压痛、肿胀、活动不利。传统治疗方法是,直接冰敷然后加压包扎,但是在临床工作中,此方法处理后,第二天受伤的位置淤血发硬,疼痛加重,挫伤严重者几周都有疼痛。我对肌肉挫伤治疗方法如下:


    1、受伤后第一时间就开始治疗。


    2、在伤处用冰袋上下搓,力度不要太重,时间为1分钟。


    3、然后用手从伤处的远端向近端轻推伤处(以心脏为中心,离心脏远的是远端,近则近端),力度要轻,把皮肤推动即可。时间为1分钟。


    4、再用冰袋在伤处轻搓1分钟,然后用手推伤处1分钟,这样循环治疗15-20分钟。


    5、最后用纱布叠一个与伤者一样大小的块,加压在伤处,然后用弹性绷带由远端向近端包扎。绑弹性绷带的力量一定要适中,不能太轻和太重,绑完后能加压的感觉。如果绑的太紧伤肢会有麻木,血液循环障碍,此时一定要松开。




    6、经处理,第二天伤处周围会出现淤血扩散情况,疼痛也会好转。今天继续用冰搓1分钟,在伤处涂上活血化瘀的药(如:活络油、云南白药等)推1分钟,循环治疗15-20分钟。不需要用绷带包扎。


    7、第三天疼痛基本消失,如果有疼感,只需用活血化瘀的药揉,不需要冰敷。


    注意事项:


    如果挫伤后,局部马上肿胀严重,不能正常行走,应该立即到医院拍片检查,排除骨折、韧带和肌肉断裂等情况。切记禁止热敷。
    展开全文
  • 在TestController中加入异常处理方法 //局部异常处理 @ExceptionHandler (Exception.class) public String exHandler (Exception e) { // 判断发生异常的类型是除0异常则做出响应 if (e ...

    1、构建测试代码

    (1)、新建MAVEN项目

    打开IDE—新建Maven项目—构建一个简单Maven项目

    (2)、编写pom.xml引入包

    编写pom配置引入jar包

    注:引入完毕后可能项目会报红叉,更新maven即可

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.springboot</groupId>
      <artifactId>springboot</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <parent>
    		<groupId>org.springframework.boot</groupId>
    		<artifactId>spring-boot-starter-parent</artifactId>
    		<version>1.4.1.RELEASE</version>
    	</parent>
    
    	<properties>
    		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    		<java.version>1.8</java.version>
    	</properties>
    
    	<dependencies>
    		<!-- 引入web相关包 -->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-web</artifactId>
    		</dependency>
    		<!-- Springboot devtools热部署 依赖包 -->
    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-devtools</artifactId>
    			<optional>true</optional>
    		</dependency>
    
    	</dependencies>
    	<build>
    		<plugins>
    			<plugin>
    				<groupId>org.springframework.boot</groupId>
    				<artifactId>spring-boot-maven-plugin </artifactId>
    				<configuration>
    				<!-- 如果没有该项配置,devtools不会起作用,即应用不会restart -->
    					<fork>true</fork>
    				</configuration>
    			</plugin>
    		</plugins>
    	</build>
    </project>

    (3)、新建一个controller类

    包名com.springboot.controller

    类名TestController

    package com.springboot.controller;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    //@RestController=@Controller+@ResponseBody
    @RestController
    @RequestMapping("/test")
    public class TestController {
    	
    	@RequestMapping("/hello1")
    	public String hello(){
    		return "hello1";
    	}
    	
    }

    (4)、新建一个Application类

    包名com.springboot

    类名TestController

    package com.springboot;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    
    @SpringBootApplication
    public class Application {
    	
    	public static void main(String[] args) {
    		SpringApplication.run(Application.class, args);
    		System.out.println("_____OK______");
    	}
    	
    }
    

    然后运行程序

    (5)、测试

    输入地址http://localhost:8080/test/hello1

    如果显示:hello1,则测试成功

    测试代码编写完成

    ———————————————————————————————————————

    2、局部异常处理

    对TestController类进行操作

    (1)、创造异常点

    如果设置一个变量=整数/0,则会发生ArithmeticException异常

    在TestController中加入除0异常点

    	@RequestMapping("/hello1")
    	public String hello(){
    		// 自己编写的除0异常
    		int a=1/0;
    
    		return "hello1";
    	}

    (2)、编写异常处理方法

    在TestController中加入异常处理方法

    	//局部异常处理
    	@ExceptionHandler(Exception.class)
    	public String exHandler(Exception e){
    		// 判断发生异常的类型是除0异常则做出响应
    		if(e instanceof ArithmeticException){
    			return "发生了除0异常";
    		}
    		// 未知的异常做出响应
    		return "发生了未知异常";
    	}

    (3)、测试

    输入地址http://localhost:8080/test/hello1

    如果显示:发生了除0异常,则测试成功

    ———————————————————————————————————————

    3、全局异常处理

    (1)、创建一个新的Cpntroller类

    包名package com.springboot.controller;

    类名TestGlobalController

    package com.springboot.controller;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/test")
    public class TestGlobalController {
    	
    	@RequestMapping("/hello2")
    	public String hello2(){
    		// 自己编写的异常发生点
    		int a=1/0;
    		
    		return "hello2";
    	}
    	
    }
    

    --------------------------------------------------------------------------------------

    (2)、编写全局异常类

    包名com.springboot.controller.exception

    类名GlobalDefaultExceptionHandler

    ⒈全局异常处理返回字符串

    package com.springboot.controller.exception;
    
    import org.springframework.web.bind.annotation.ControllerAdvice;
    import org.springframework.web.bind.annotation.ExceptionHandler;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    @ControllerAdvice
    public class GlobalDefaultExceptionHandler {
    	
    	// 全局异常处理返回字符串
    	@ExceptionHandler(Exception.class)
    	@ResponseBody
    	public String exception(Exception e){
    		// 判断发生异常的类型是除0异常则做出响应
    		if(e instanceof ArithmeticException){
    			return "全局:发生了除0异常";
    		}
    		// 未知的异常做出响应
    		return "全局:发生了未知异常";
    	}
    }
    

    ⒉全局异常处理返回JSON

    	// 全局异常处理返回JSON
    	@ExceptionHandler(Exception.class)
    	@ResponseBody
    	public Map<String,Object> exception(Exception e){
    		Map<String,Object> map=new HashMap<String,Object>();
    
    		// 判断发生异常的类型是除0异常则做出响应
    		if(e instanceof ArithmeticException){
    			map.put("codeNumber", "1");
    			map.put("message", e.getMessage());
    			return map;
    		}
    		// 未知的异常做出响应
    		map.put("codeNumber", "0");
    		map.put("message", e.getMessage());
    		return map;
    	} 

    ⒊全局异常处理返回JSP

    	@ExceptionHandler(Exception.class)
    	public String exception(Exception e){
    
    		// 判断发生异常的类型是除0异常则做出响应
    		if(e instanceof ArithmeticException){
    			// 跳转到test.jsp页面
    			return "test";
    		}
    		// 未知的异常做出响应
    		// 跳转到test.jsp页面
    		return "test";
    	}

    :需要配置一下才能支持jsp

    ①需要在pom添加JSP的支持

    		<!-- 对JSP的解析支持 -->
    		<dependency>
    			<groupId>org.apache.tomcat.embed</groupId>
    			<artifactId>tomcat-embed-jasper</artifactId>
    			<scope>provided</scope>
    		</dependency>
    		<!-- 对JSTL的支持 -->
    		<dependency>
    			<groupId>javax.servlet</groupId>
    			<artifactId>jstl</artifactId>
    		</dependency>

    ②需要配置application.properties

    添加application.properties文件,然后往其中写入

    # 页面默认前缀目录
    spring.mvc.view.prefix=/WEB-INF/
    # 响应页面默认后缀
    spring.mvc.view.suffix=.jsp

    ③需要添加jsp文件

    添加JSP,放置在src/main/webapp/WEB-INF目录下

    --------------------------------------------------------------------------------------

    (3)、全局异常类应用范围设置

    ⒈@ControllerAdvice简介

    在spring 3.2中,新增了@ControllerAdvice 注解可以用于定义@ExceptionHandler、@InitBinder、@ModelAttribute,并应用到所有@RequestMapping中。

    这里我们全局异常只应用到@ExceptionHandler

    ⒉设置@ControllerAdvice应用范围

    设置了@ControllerAdvice应用范围,即就设置了异常类的应用范围

    @ControllerAdvice的范围有:

    ①basePackages:应用在xx包

    ②basePackageClasses:应用在xx类

    ③assignableTypes:应用在加了@Controller的类

    ④annotations:应用在带有xx注解的类或者方法

    ————————————————————

    ≥简单用法例子:

    ————————————————————

    @ControllerAdvice(basePackages={"com.springboot.controller"})

    只捕捉com.springboot.controller包中的异常

    @ControllerAdvice(basePackageClasses={TestController.class})

    只捕捉TestController.class中的异常

    @ControllerAdvice(assignableTypes={TestController.class})

    只捕捉TestController.class中的异常

    @ControllerAdvice(annotations=TestException.class)

    只捕捉带有@TestException注解的类

    上面四个注解一个应用包,然后的两个用在类,而最后一个只应用于带有XX注解的类

    --------------------------------------------------------------------------------------

    3.讲讲应用在注解怎么写

    1、创建一个注解类

    package com.springboot.annotation;
    
    import static java.lang.annotation.ElementType.TYPE;
    import static java.lang.annotation.RetentionPolicy.RUNTIME;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.Retention;
    import java.lang.annotation.Target;
    
    // 这种类型的Annotations将被JVM保留,所以他们能在运行时被JVM或其他使用反射
    @Retention(RUNTIME)
    // 目标类型可以应用在方法
    @Target(ElementType.TYPE)
    // 对doc文档支持
    @Documented
    public @interface TestException {
    	
    }
    

    ---------------------------------------------------------------------------------

    注:关于注解类的简说请看:

    https://my.oschina.net/u/3523885/blog/1489959

    ---------------------------------------------------------------------------------

    2、将注解加到TestController类

    加入@TestException注解

    // 加入TestException注解
    @TestException
    @RestController
    @RequestMapping("/test")
    public class TestController {
    	
    	@RequestMapping("/hello1")
    	public String hello(){
    		// 自己编写的除0异常
    		int a=1/0;
    		
    		return "hello1";
    	}
    
    }

    3、TestController类不加注解

    @RestController
    @RequestMapping("/test")
    public class TestGlobalController {
    	
    	@RequestMapping("/hello2")
    	public String hello(){
    		// 自己编写的除0异常
    		int a=1/0;
    		
    		return "hello2";
    	}
    	
    }

    4、设置异常类只捕捉带有@TestException注解的类的异常

    // 设置范围应用于带有@TestException的注解的类上
    @ControllerAdvice(annotations={TestException.class})
    public class GlobalDefaultExceptionHandler {
    
    	@ExceptionHandler(Exception.class)
    	@ResponseBody
    	public String exceptionReturnString(Exception e){
    		// 判断发生异常的类型是除0异常则做出响应
    		if(e instanceof ArithmeticException){
    			return "全局:发生了除0异常";
    		}
    		// 未知的异常做出响应
    		return "全局:发生了未知异常";
    	}
    }

    5、测试

    输入地址http://localhost:8080/test/hello1

    输入地址:http://localhost:8080/test/hello2

    (4)、处理404错误

           因为404错误是不经过controller的,所以无法通过上述办法处理。但是 SpringBoot 默认提供了一个全局的 handler 来处理所有的 HTTP 错误, 并把它映射为 /error。当发生一个 HTTP 错误, 例如 404 错误时, SpringBoot 内部的机制会将页面重定向到 /error 中。

    所以我们只要实现一个 /error 映射的 Controller 即可来处理它即可

    1、创建404.jsp页面

    在WEB-IFN下创建errorpages目录,并且在此目录下创建一个404.jsp页面

    目录:

    404.jsp:

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>Test JSP</title>
    </head>
    <body>
    	<span>发生了404错误</span>
    </html>

    2、创建处理404的controller类

    包名package com.springboot.controller;

    类名HttpErrorController

    package com.springboot.controller;
    
    import org.springframework.boot.autoconfigure.web.ErrorController;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    @Controller
    public class HttpErrorController implements ErrorController {
    	
    	private static final String ERROR_PATH = "/error";  
    	   
    	@RequestMapping(value=ERROR_PATH)  
    	   public String handleError(){  
    	       return "errorpage/404";  
    	   }
    	
    	@Override
    	public String getErrorPath() {
    		return ERROR_PATH;
    	}
    
    }
    

    3、测试

    随便输入个地址测试引发404错误

    例如输入地址http://localhost:8080/-.-

    显示:

     


    展开全文
  • 缺失值的处理方法

    千次阅读 2019-08-22 13:27:34
    本文针对缺失值和特殊值这种数据质量问题,进行了初步介绍并推荐了一些处理方法。 值得注意的是,这里所说的缺失值,不仅包括数据库中的NULL值,也包括用于表示数值缺失的特殊数值(比如,在系统中用-999来表...

    对于数据挖掘和分析人员来说,数据准备(Data Preparation,包括数据的抽取、清洗、转换和集成)常常占据了70%左右的工作量。而在数据准备的过程中,数据质量差又是最常见而且令人头痛的问题。本文针对缺失值和特殊值这种数据质量问题,进行了初步介绍并推荐了一些处理方法。
    值得注意的是,这里所说的缺失值,不仅包括数据库中的NULL值,也包括用于表示数值缺失的特殊数值(比如,在系统中用-999来表示数值不存在)。如果我们仅有数据库的数据模型,而缺乏相关说明,常常需要花费更多的精力来发现这些数值的特殊含义。而如果我们漠视这些数值的特殊性,直接拿来进行挖掘,那么很可能会得到错误的结论。
    还有一种数值缺失的情况,是因为我们要求统计的时间窗口并非对所有数据都适合。例如,我们希望计算出“客户在以前六个月内的最大存款余额”,对于那些建立账户尚不满六个月的客户来说,统计出来的数值与我们想要得到的就可能存在差距。
    一般来说,对缺失值的填充方法有多种,用某个常数来填充常常不是一个好方法。最好建立一些模型,根据数据的分布来填充一个更恰当的数值。(例如根据其它变量对记录进行数据分箱,然后选择该记录所在分箱的相应变量的均值或中位数,来填充缺失值,效果会更好一些)
    造成数据缺失的原因
    在各种实用的数据库中,属性值缺失的情况经常发全甚至是不可避免的。因此,在大多数情况下,信息系统是不完备的,或者说存在某种程度的不完备。
    缺失值的产生的原因多种多样,主要分为机械原因和人为原因。机械原因是由于机械原因导致的数据收集或保存的失败造成的数据缺失,比如数据存储的失败,存储器损坏,机械故障导致某段时间数据未能收集(对于定时数据采集而言)。人为原因是由于人的主观失误、历史局限或有意隐瞒造成的数据缺失,比如,在市场调查中被访人拒绝透露相关问题的答案,或者回答的问题是无效的,数据录入人员失误漏录了数据
    造成数据缺失的原因是多方面的,主要可能有以下几种:
    1)有些信息暂时无法获取。例如在医疗数据库中,并非所有病人的所有临床检验结果都能在给定的时间内得到,就致使一部分属性值空缺出来。又如在申请表数据中,对某些问题的反映依赖于对其他问题的回答。
    2)有些信息是被遗漏的。可能是因为输入时认为不重要、忘记填写了或对数据理解错误而遗漏,也可能是由于数据采集设备的故障、存储介质的故障、传输媒体的故障、一些人为因素等原因而丢失了。
    3)有些对象的某个或某些属性是不可用的。也就是说,对于这个对象来说,该属性值是不存在的,如一个未婚者的配偶姓名、一个儿童的固定收入状况等。
    4)有些信息(被认为)是不重要的。如一个属性的取值与给定语境是无关的,或训练数据库的设计者并不在乎某个属性的取值(称为dont-care value)。
    5)获取这些信息的代价太大。
    6)系统实时性能要求较高,即要求得到这些信息前迅速做出判断或决策。

    数据缺失机制
    在对缺失数据进行处理前,了解数据缺失的机制和形式是十分必要的。将数据集中不含缺失值的变量(属性)称为完全变量,数据集中含有缺失值的变量称为不完全变量,Little 和 Rubin定义了以下三种不同的数据缺失机制:
    1)完全随机缺失(Missing Completely at Random,MCAR)。数据的缺失与不完全变量以及完全变量都是无关的。
    2)随机缺失(Missing at Random,MAR)。数据的缺失仅仅依赖于完全变量。
    3)非随机、不可忽略缺失(Not Missing at Random,NMAR,or nonignorable)。不完全变量中数据的缺失依赖于不完全变量本身,这种缺失是不可忽略的。
    从缺失值的所属属性上讲,如果所有的缺失值都是同一属性,那么这种缺失成为单值缺失,如果缺失值属于不同的属性,称为任意缺失。另外对于时间序列类的数据,可能存在随着时间的缺失,这种缺失称为单调缺失。

    空值语义
    对于某个对象的属性值未知的情况,我们称它在该属性的取值为空值(null value)。空值的来源有许多种,因此现实世界中的空值语义也比较复杂。总的说来,可以把空值分成以下三类:
    1)不存在型空值。即无法填入的值,或称对象在该属性上无法取值,如一个未婚者的配偶姓名等。
    2)存在型空值。即对象在该属性上取值是存在的,但暂时无法知道。一旦对象在该属性上的实际值被确知以后,人们就可以用相应的实际值来取代原来的空值,使信息趋于完全。存在型空值是不确定性的一种表征,该类空值的实际值在当前是未知的。但它有确定性的一面,诸如它的实际值确实存在,总是落在一个人们可以确定的区间内。一般情况下,空值是指存在型空值。
    3)占位型空值。即无法确定是不存在型空值还是存在型空值,这要随着时间的推移才能够清楚,是最不确定的一类。这种空值除填充空位外,并不代表任何其他信息。

    空值处理的重要性和复杂性
    数据缺失在许多研究领域都是一个复杂的问题。对数据挖掘来说,空值的存在,造成了以下影响:首先,系统丢失了大量的有用信息;第二,系统中所表现出的不确定性更加显著,系统中蕴涵的确定性成分更难把握;第三,包含空值的数据会使挖掘过程陷入混乱,导致不可靠的输出。

    数据挖掘算法本身更致力于避免数据过分适合所建的模型,这一特性使得它难以通过自身的算法去很好地处理不完整数据。因此,空缺的数据需要通过专门的方法进行推导、填充等,以减少数据挖掘算法与实际应用之间的差距。

    空值处理方法的分析比较
    处理不完备数据集的方法主要有以下三大类:
    (一)删除元组
    也就是将存在遗漏信息属性值的对象(元组,记录)删除,从而得到一个完备的信息表。这种方法简单易行,在对象有多个属性缺失值、被删除的含缺失值的对象与信息表中的数据量相比非常小的情况下是非常有效的,类标号(假设是分类任务)缺少时通常使用。然而,这种方法却有很大的局限性。它是以减少历史数据来换取信息的完备,会造成资源的大量浪费,丢弃了大量隐藏在这些对象中的信息。在信息表中本来包含的对象很少的情况下,删除少量对象就足以严重影响到信息表信息的客观性和结果的正确性;当每个属性空值的百分比变化很大时,它的性能非常差。因此,当遗漏数据所占比例较大,特别当遗漏数据非随机分布时,这种方法可能导致数据发生偏离,从而引出错误的结论。
    (二)数据补齐
    这类方法是用一定的值去填充空值,从而使信息表完备化。通常基于统计学原理,根据决策表中其余对象取值的分布情况来对一个空值进行填充,譬如用其余属性的平均值来进行补充等。数据挖掘中常用的有以下几种补齐方法:
    (1)人工填写(filling manually)
    由于最了解数据的还是用户自己,因此这个方法产生数据偏离最小,可能是填充效果最好的一种。然而一般来说,该方法很费时,当数据规模很大、空值很多的时候,该方法是不可行的。
    (2)特殊值填充(Treating Missing Attribute values as Special values)
    将空值作为一种特殊的属性值来处理,它不同于其他的任何属性值。如所有的空值都用“unknown”填充。这样将形成另一个有趣的概念,可能导致严重的数据偏离,一般不推荐使用。
    (3)平均值填充(Mean/Mode Completer)
    将信息表中的属性分为数值属性和非数值属性来分别进行处理。如果空值是数值型的,就根据该属性在其他所有对象的取值的平均值来填充该缺失的属性值;如果空值是非数值型的,就根据统计学中的众数原理,用该属性在其他所有对象的取值次数最多的值(即出现频率最高的值)来补齐该缺失的属性值。另外有一种与其相似的方法叫条件平均值填充法(Conditional Mean Completer)。在该方法中,缺失属性值的补齐同样是靠该属性在其他对象中的取值求平均得到,但不同的是用于求平均的值并不是从信息表所有对象中取,而是从与该对象具有相同决策属性值的对象中取得。这两种数据的补齐方法,其基本的出发点都是一样的,以最大概率可能的取值来补充缺失的属性值,只是在具体方法上有一点不同。与其他方法相比,它是用现存数据的多数信息来推测缺失值。
    (4)热卡填充(Hot deck imputation,或就近补齐)
    对于一个包含空值的对象,热卡填充法在完整数据中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。不同的问题可能会选用不同的标准来对相似进行判定。该方法概念上很简单,且利用了数据间的关系来进行空值估计。这个方法的缺点在于难以定义相似标准,主观因素较多。
    (5)K最近距离邻法(K-means clustering)
    先根据欧式距离或相关分析来确定距离具有缺失数据样本最近的K个样本,将这K个值加权平均来估计该样本的缺失数据。
    同均值插补的方法都属于单值插补,不同的是,它用层次聚类模型预测缺失变量的类型,再以该类型的均值插补。假设X=(X1,X2…Xp)为信息完全的变量,Y为存在缺失值的变量,那么首先对X或其子集行聚类,然后按缺失个案所属类来插补不同类的均值。如果在以后统计分析中还需以引入的解释变量和Y做分析,那么这种插补方法将在模型中引入自相关,给分析造成障碍。
    (6)使用所有可能的值填充(Assigning All Possible values of the Attribute)
    这种方法是用空缺属性值的所有可能的属性取值来填充,能够得到较好的补齐效果。但是,当数据量很大或者遗漏的属性值较多时,其计算的代价很大,可能的测试方案很多。另有一种方法,填补遗漏属性值的原则是一样的,不同的只是从决策相同的对象中尝试所有的属性值的可能情况,而不是根据信息表中所有对象进行尝试,这样能够在一定程度上减小原方法的代价。
    (7)组合完整化方法(Combinatorial Completer)
    这种方法是用空缺属性值的所有可能的属性取值来试,并从最终属性的约简结果中选择最好的一个作为填补的属性值。这是以约简为目的的数据补齐方法,能够得到好的约简结果;但是,当数据量很大或者遗漏的属性值较多时,其计算的代价很大。另一种称为条件组合完整化方法(Conditional Combinatorial Complete),填补遗漏属性值的原则是一样的,不同的只是从决策相同的对象中尝试所有的属性值的可能情况,而不是根据信息表中所有对象进行尝试。条件组合完整化方法能够在一定程度上减小组合完整化方法的代价。在信息表包含不完整数据较多的情况下,可能的测试方案将巨增。
    (8)回归(Regression)
    基于完整的数据集,建立回归方程(模型)。对于包含空值的对象,将已知属性值代入方程来估计未知属性值,以此估计值来进行填充。当变量不是线性相关或预测变量高度相关时会导致有偏差的估计。
    (9)期望值最大化方法(Expectation maximization,EM)
    在缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计(Little and Rubin)。这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化(Expectation Maximization,EM)。该方法比删除个案和单值插补更有吸引力,它一个重要前提:适用于大样本。有效样本的数量足够以保证ML估计值是渐近无偏的并服从正态分布。但是这种方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂。
    EM算法是一种在不完全数据情况下计算极大似然估计或者后验分布的迭代算法。在每一迭代循环过程中交替执行两个步骤:E步(Excepctaion step,期望步),在给定完全数据和前一次迭代所得到的参数估计的情况下计算完全数据对应的对数似然函数的条件期望;M步(Maximzation step,极大化步),用极大化对数似然函数以确定参数的值,并用于下步的迭代。算法在E步和M步之间不断迭代直至收敛,即两次迭代之间的参数变化小于一个预先给定的阈值时结束。该方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂。
    (10)多重填补(Multiple Imputation,MI)
    多值插补的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值。
    多重填补方法分为三个步骤:;为每个空值产生一套可能的填补值,这些值反映了无响应模型的不确定性;每个值都被用来填补数据集中的缺失值,产生若干个完整数据集合。;每个填补数据集合都用针对完整数据集的统计方法进行统计分析。;对来自各个填补数据集的结果进行综合,产生最终的统计推断,这一推断考虑到了由于数据填补而产生的不确定性。该方法将空缺值视为随机样本,这样计算出来的统计推断可能受到空缺值的不确定性的影响。该方法的计算也很复杂。
    多重插补方法分为三个步骤:①为每个空值产生一套可能的插补值,这些值反映了无响应模型的不确定性;每个值都可以被用来插补数据集中的缺失值,产生若干个完整数据集合。②每个插补数据集合都用针对完整数据集的统计方法进行统计分析。③对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值。
    假设一组数据,包括三个变量Y1,Y2,Y3,它们的联合分布为正态分布,将这组数据处理成三组,A组保持原始数据,B组仅缺失Y3,C组缺失Y1和Y2。在多值插补时,对A组将不进行任何处理,对B组产生Y3的一组估计值(作Y3关于Y1,Y2的回归),对C组作产生Y1和Y2的一组成对估计值(作Y1,Y2关于Y3的回归)。
    当用多值插补时,对A组将不进行处理,对B、C组将完整的样本随机抽取形成为m组(m为可选择的m组插补值),每组个案数只要能够有效估计参数就可以了。对存在缺失值的属性的分布作出估计,然后基于这m组观测值,对于这m组样本分别产生关于参数的m组估计值,给出相应的预测即,这时采用的估计方法为极大似然法,在计算机中具体的实现算法为期望最大化法(EM)。对B组估计出一组Y3的值,对C将利用 Y1,Y2,Y3它们的联合分布为正态分布这一前提,估计出一组(Y1,Y2)。
    上例中假定了Y1,Y2,Y3的联合分布为正态分布。这个假设是人为的,但是已经通过验证(Graham和Schafer于1999),非正态联合分布的变量,在这个假定下仍然可以估计到很接近真实值的结果。
    多重插补和贝叶斯估计的思想是一致的,但是多重插补弥补了贝叶斯估计的几个不足。
    (1)贝叶斯估计以极大似然的方法估计,极大似然的方法要求模型的形式必须准确,如果参数形式不正确,将得到错误得结论,即先验分布将影响后验分布的准确性。而多重插补所依据的是大样本渐近完整的数据的理论,在数据挖掘中的数据量都很大,先验分布将极小的影响结果,所以先验分布的对结果的影响不大。
    (2)贝叶斯估计仅要求知道未知参数的先验分布,没有利用与参数的关系。而多重插补对参数的联合分布作出了估计,利用了参数间的相互关系。
    (11)C4.5方法
    通过寻找属性间的关系来对遗失值填充。它寻找之间具有最大相关性的两个属性,其中没有遗失值的一个称为代理属性,另一个称为原始属性,用代理属性决定原始属性中的遗失值。这种基于规则归纳的方法只能处理基数较小的名词型属性。
    就几种基于统计的方法而言,删除元组法和平均值法差于hot deck、EM和MI;回归是比较好的一种方法,但仍比不上hot deck和EM;EM缺少MI包含的不确定成分[46]。值得注意的是,这些方法直接处理的是模型参数的估计而不是空缺值预测本身。它们合适于处理无监督学习的问题,而对有监督学习来说,情况就不尽相同了。譬如,你可以删除包含空值的对象用完整的数据集来进行训练,但预测时你却不能忽略包含空值的对象。另外,C4.5和使用所有可能的值填充方法也有较好的补齐效果,人工填写和特殊值填充则是一般不推荐使用的。
    补齐处理只是将未知值补以我们的主观估计值,不一定完全符合客观事实,在对不完备信息进行补齐处理的同时,我们或多或少地改变了原始的信息系统。而且,对空值不正确的填充往往将新的噪声引入数据中,使挖掘任务产生错误的结果。因此,在许多情况下,我们还是希望在保持原始信息不发生变化的前提下对信息系统进行处理。这就是第三种方法:
    (三)不处理
    直接在包含空值的数据上进行数据挖掘。这类方法包括贝叶斯网络和人工神经网络等。
    贝叶斯网络是用来表示变量间连接概率的图形模式,它提供了一种自然的表示因果信息的方法,用来发现数据间的潜在关系。在这个网络中,用节点表示变量,有向边表示变量间的依赖关系。贝叶斯网络仅适合于对领域知识具有一定了解的情况,至少对变量间的依赖关系较清楚的情况。否则直接从数据中学习贝叶斯网的结构不但复杂性较高(随着变量的增加,指数级增加),网络维护代价昂贵,而且它的估计参数较多,为系统带来了高方差,影响了它的预测精度。当在任何一个对象中的缺失值数量很大时,存在指数爆炸的危险。
    人工神经网络可以有效的对付空值,但人工神经网络在这方面的研究还有待进一步深入展开。人工神经网络方法在数据挖掘应用中的局限性

    总结:大多数数据挖掘系统都是在数据挖掘之前的数据预处理阶段采用第一、第二类方法来对空缺数据进行处理。并不存在一种处理空值的方法可以适合于任何问题。无论哪种方式填充,都无法避免主观因素对原系统的影响,并且在空值过多的情形下将系统完备化是不可行的。从理论上来说,贝叶斯考虑了一切,但是只有当数据集较小或满足某些条件(如多元正态分布)时完全贝叶斯分析才是可行的。而现阶段人工神经网络方法在数据挖掘中的应用仍很有限。值得一提的是,采用不精确信息处理数据的不完备性已得到了广泛的研究。不完备数据的表达方法所依据的理论主要有可信度理论、概率论、模糊集合论、可能性理论,D-S的证据理论等。

    展开全文
  • 机器学习中数据缺失值处理方法

    千次阅读 2018-06-17 22:48:00
    数据值缺失是数据分析中经常遇到的问题之一。当缺失比例很小时,可直接对缺失记录进行舍弃或进行手工处理。但在实际数据中,往往缺失数据...缺失值处理方法 使用可用特征的均值来填补缺失值 使用特殊值来填补缺...
  • 优化模式--数据局部

    千次阅读 2017-06-12 22:35:19
    理论要点 什么是数据局部性模式:合理组织数据,...基于这一点,我们通过保证处理的数据排列在连续内存上,以提高内存局部性,从而提高性能。 2,为了保证数据局部性,就要避免的缓存不命中。也许你需要牺牲一些宝
  • 缺失值的处理方法大总结

    千次阅读 2019-10-16 14:16:45
    缺失值的处理方法1. 删除dropna()缺点2.填补替换缺失值均值填充卡填补K均值拟合缺失值回归预测极大似然估计多重插补随即森林虚拟变量3.不处理四.总结五.参考资料 一.缺失的原因 缺失值是指粗糙数据中由于缺少信息...
  • fMRI数据分析处理原理及方法

    万次阅读 2016-12-05 16:01:19
    近年来,血氧水平依赖性磁共振脑功能成像(Blood oxygenation level-dependent functional magnetic resonance imaging, BOLD-fMRI)技术得到极快的发展,除了与扫描硬件、...图像数据的后处理技术成为fMRI中的关键环节
  • 缺失值处理方法综述

    千次阅读 2018-07-09 15:48:30
    以下来讨论缺失值的一般处理方法: 1. 删除 主要有简单删除法和权重法。简单删除法是对缺失值进行处理的最原始方法。 (1) 简单删除法 此方法将存在缺失值的数据条目(对象,元组,记录)进行删除。这种方法简单易行...
  • 数据缺失值的处理方法

    万次阅读 2018-03-03 15:24:45
    这里简单介绍一下数据缺失值处理的一般方法。 数据缺失值处理主要分成三个大类1.删除;2.补齐;3.忽略。 删除数据 将存在遗漏信息属性值的数据删除,得到一个完整的数据组。 优点:简单易行,在数据含有多个...
  • 机器学习缺失值处理方法汇总

    万次阅读 多人点赞 2017-11-26 19:44:48
    缺失值处理方法综述缺失值是指粗糙数据中由于缺少信息而造成的数据的聚类、分组、删失或截断。它指的是现有数据集中某个或某些属性的值是不完全的。缺失值的产生的原因多种多样,主要分为机械原因和人为原因。 机械...
  • Shell脚本中参数处理方法

    千次阅读 2015-05-03 10:49:45
    下面通过一个特定的情景来讲一下这三种参数处理方法。 这两天写了一个安全删除的脚本,原理就是将指定的文件移动到某个特定的目录下并保存其原始路径信息,这和在Windows下以及在Linux的桌面环境下"将文件移动到回收...
  • 局部特征

    万次阅读 2012-12-24 16:18:14
    局部特征(1)——入门篇  局部特征 (local features),是近来研究的一大热点。大家都了解全局特征(global features),就是方差、颜色直方图等等。如果用户对整个图像的整体感兴趣,而不是前景本身感兴趣的话...
  • vue 多页面更新缓慢问题解决更新慢的原因解决方法 更新慢的原因 多页面就是多入口,会生成多个html文件,之前我基本都是单页面,因为是单入口没有这个问题,当偶然间接触了一个多页面的项目发现了更新很慢的...
  • 数据局部

    2017-03-16 14:02:48
    现代CPU有缓存来加速内存读取,它可以更快的读取最近访问过的内存的眦邻内存,通过合理组织数据,提高内存局部性,保证数据以处理顺序排列在连续内存上,充分使用CPU缓存来加速内存读取。 数据局部性的第一准则...
  • 主板诊断卡代码含义及处理方法

    万次阅读 2016-08-11 09:16:20
    座下的焊点因为长时间的胀冷缩,会出现脱焊(焊点开裂),也会出现 FF 或 00 ,尤其是是用老式直立式转接卡的 CPU ,转接卡的 CPU 座焊点开裂情况比较多,一般肉 眼不容易看出来,要用放大镜。修理方法:用热风枪...
  • 1.常用功能神经影像学技术:(局部)代谢和血氧变化测量技术(fmri,pet,nirs),通过测量神经元活动次级反映(葡萄糖代谢和血流,血氧变化)研究与行为相关的神经元活动,时间和空间分辨率已能一定程度满足神经科学...
  • 但在页面静态化后,静态页面之间包含(例如所有的静态页面包含页头、页脚)以及静态页面中的局部信息的动态更新又成为新的问题。 静态页面之间的包含一般有如下一些方案: 1、Client Side Includes(CSI):通过...
  • 在经验主义的处理方法中,对于语言的识别和机器翻译的效果几乎难以和一个仅用三元模型进行处理的基于统计的方法。这很容易让人联想到是不是方法本质的差异造就了结果的不同。 基于统计的方法的特点就是把句子视为...
  • 局部特征(local feature)

    万次阅读 2015-11-17 12:00:12
    局部特征(1)——入门篇  局部特征 (local features),是近来研究的一大热点。大家都了解全局特征(global features),就是方差、颜色直方图等等。如果用户对整个图像的整体感兴趣,而不是前景本身感兴趣的话...
  • 图像增强之局部增强

    千次阅读 2017-11-12 15:49:48
    该图中未包含彩色图像增强,需要注意的是,图中列出的点运算与局部运算并不是绝对区分,如点运算中的直方图均衡操作同样可以进行局部直方图均衡。 二、局部增强 1、定义 利用图像的局部信息,如局域均值、方差...
  • 在开发过程中,经常会用到ViewPager与Fragment实现多页面切换效果,有时,我们想要局部刷新某些Fragment,而其他Fragment保持状态不变,该如何做到呢? 先上代码!/** * Created by HSH . */ public abstract ...
  • FMRI数据分析与处理

    万次阅读 多人点赞 2016-12-21 13:22:23
    近年来,血氧水平依赖性磁共振脑功能成像(Blood oxygenation level-dependent functional magnetic resonance imaging, BOLD-...图像数据的后处理技术成为fMRI中的关键环节一、功能图像数据的性质功能磁共振数据包括

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,420
精华内容 10,968
关键字:

局部热处理方法