2018-08-07 16:30:43 Kedongyu_ 阅读数 1671
  • 机器学习数学基础之矩阵视频教学

    本课程囊括了机器学习理论中所需要的和线性代数相关的所有知识。帮助想入门机器学习的朋友们快速掌握数学基础。 主要内容: 1. 矩阵的定义、性质、运算、分解以及应用。 2. 线性空间、范数、生成子空间相关知识。

    11498 人正在学习 去看看 AI100讲师

目录

引言

一、矩阵一阶偏导数

      1. X轴方向

      2. Y轴方向

二、矩阵二阶偏导数

      1. X轴方向上二阶偏导

      2. Y轴方向上二阶偏导

      3.第一次在X轴方向上求偏导,第二次在Y轴方向上求偏导

      4.第一次在Y轴方向上求偏导,第二次在X轴方向上求偏导

      5.结论

三、拉普拉斯算子(Laplace)

四、Hessian矩阵

      1.图像的Hessian矩阵

      2.Hessian矩阵的特征值(2个)

      3.验证推论A

五、代码(全部)


引言

      数学:验证矩阵对角线元素和等于特征值之和

      应用而言:给定图像,计算他的Hessian矩阵,Laplace算子 = Hessian矩阵的特征值之和。

      即:Laplace= EigenOfHessian     

 

一、矩阵一阶偏导数

      1. X轴方向

      编写代码:

def gradx(Img, sx = 1.0):          
    return sx * (Img[1: , : ] - Img[ :-1, : ]) 

      2. Y轴方向

      编写代码:

def grady(Img, sy = 1.0):
    return sy * (Img[ : , 1: ] - Img[ : , : -1])

二、矩阵二阶偏导数

      1. X轴方向上二阶偏导

      编写代码:

def gradxx(img, sx = 1.0):
    return sx ** 2 * (img[2 : ] + img[ : -2] - 2 * img[1 : -1])

 

      2. Y轴方向上二阶偏导

      编写代码:

def gradyy(img, sy = 1.0):
    return sy ** 2 * (img[ : , 2: ] + img[ : , :-2] - 2 * img[ : ,1:-1])

 

      3.第一次在X轴方向上求偏导,第二次在Y轴方向上求偏导

      编写代码:

def gradxy(img, sx = 1.0, sy = 1.0):
    return sy * sx * ((img[:-1, :-1]+img[1:,1:])-(img[:-1,1:]+img[1:,:-1]))

      4.第一次在Y轴方向上求偏导,第二次在X轴方向上求偏导

此章节自行验证,可以得出,Dxy与Dyx其结果是一致的。

      5.结论

 

三、拉普拉斯算子(Laplace)

      编写代码:

def laplace(img, sx = 1.0, sy = 1.0):
    return gradxx(img, sx) + gradyy(img, sy)

 

四、Hessian矩阵

      1.图像的Hessian矩阵

根据定义,可知:

      2.Hessian矩阵的特征值(2个)

设lambda为Hessian矩阵的特征值,则该矩阵的特征多项式为:

并且当它为0时有非零解,即:

求解lambda:

      3.验证推论A

 

五、代码(全部)

# -*- coding: utf-8 -*-
"""
Created on Mon Jul  2 15:13:18 2018

@author: Diko
"""
import numpy
from skimage import data,color
def dxx(img ,sx = 1.0):
    return sx**2*(img[2:] + img[:-2] - 2*img[1:-1])

def dyy(img ,sy = 1.0):
    return sy**2*(img[:,2:] + img[:,:-2] - 2*img[:,1:-1])

def dxy(img ,sx = 1.0, sy = 1.0):
    return sx*sy*(img[1:,1:] + img[:-1,:-1] - img[1:,:-1] - img[:-1,1:])

def laplace(img, sx =1.0, sy = 1.0):
    return (dxx(img, sx)[:,:-2] + dyy(img, sy)[:-2,:])

def eigenOfHessian(img, sx = 1.0, sy = 1.0):
    lam = numpy.empty([2, img.shape[0]-2, img.shape[1]-2])
    H11, H12, H21, H22 = dxx(img, sx)[:,:-2], dxy(img,sx,sy)[:-1,:-1], dxy(img, sx,sy)[:-1,:-1], dyy(img, sy)[:-2,:]
    A, B, C = 1, -(H11 + H22), H11*H22 - H12*H21
    de = numpy.sqrt(B**2 - 4*A*C)
    lam1 = (-B + de)/(2*A)
    lam2 = (-B - de)/(2*A)
    lam = lam1, lam2
    return lam

if __name__ == "__main__":
    epsilon = 1e-10
    pictures = [color.rgb2gray(data.chelsea()),color.rgb2gray(data.astronaut()),color.rgb2gray(data.camera())]
    for pic in pictures:
        error = numpy.ones([pic.shape[0]-2,pic.shape[1]-2])*epsilon
        if((numpy.abs(laplace(pic,1.0,1.0)-numpy.sum(eigenOfHessian(pic,1.0,1.0),0))<error).all()):
            print("true")
    

 

 

2014-01-10 15:41:56 OPPOA113 阅读数 8243
  • 机器学习数学基础之矩阵视频教学

    本课程囊括了机器学习理论中所需要的和线性代数相关的所有知识。帮助想入门机器学习的朋友们快速掌握数学基础。 主要内容: 1. 矩阵的定义、性质、运算、分解以及应用。 2. 线性空间、范数、生成子空间相关知识。

    11498 人正在学习 去看看 AI100讲师

注:以下为个人学习笔记、知识整理

1.特征值

从线性变换入手,把一个矩阵当作一个线性变换在某一组基下的矩阵,而最简单的线性变换就是数乘变换。

特征值的意义就是:目的就是看看一个线性变换对一些非零向量的作用是否能够相当于一个数乘变换,特征值就是这个数乘变换的变换比。

特征值得简单理解就是:输入x到系统A中,输出得到的是输出x的landa倍。

2.特征向量

公式当中的x就是特征向量。

我们更关心的是把原先的线性空间(如A)分解成一些和特征向量相关的子空间的直和。

这样我们的研究就可以分别限定在这些子空间上来进行,这和物理中在研究运动的时候将运动分解成水平方向和垂直方向的做法是一个道理!

 特征值是针对方阵而言的。

3.特征值和特征向量在图像处理的含义

我们知道,一个变换可由一个矩阵乘法表示,那么一个空间坐标系也可视作一个矩阵,而这个坐标系就可由这个矩阵的所有特征向量表示,用图来表示的话,可以想象就是一个空间张开的各个坐标角度,这一组向量可以完全表示一个矩阵表示的空间的“特征”,而他们的特征值就表示了各个角度上的能量(可以想象成从各个角度上伸出的长短,越长的轴就越可以代表这个空间,它的“特征”就越强,或者说显性,而短轴自然就成了隐性特征),因此,通过特征向量/值可以完全描述某一几何空间这一特点,使得特征向量与特征值在几何(特别是空间几何)及其应用中得以发挥。

4.矩阵论之图像处理

矩阵论在图像中的应用比如有PCA( Principal Component Analysis)主成分析方法,选取特征值最高的k个特征向量来表示一个矩阵,从而达到降维分析+特征显示的方法。一般而言,这一方法的目的是寻找任意统计分布的数据集合之主要分量的子集。相应的基向量组满足正交性且由它定义的子空间最优地考虑了数据的相关性。将原始数据集合变换到主分量空间使单一数据样本的互相关性降低到最低点。

5.PCA例子说明

      对于一个k维的feature来说,相当于它的每一维feature与其他维都是正交的(相当于在多维坐标系中,坐标轴都是垂直的),那么我们可以变化这些维的坐标系,从而使这个feature在某些维上方差大,而在某些维上方差很小。例如,一个45度倾斜的椭圆,在第一坐标系,如果按照x,y坐标来投影,这些点的x和y的属性很难用于区分他们,因为他们在x,y轴上坐标变化的方差都差不多,我们无法根据这个点的某个x属性来判断这个点是哪个,而如果将坐标轴旋转,以椭圆长轴为x轴,则椭圆在长轴上的分布比较长,方差大,而在短轴上的分布短,方差小,所以可以考虑只保留这些点的长轴属性,来区分椭圆上的点,这样,区分性比x,y轴的方法要好!

所以我们的做法就是求得一个k维特征的投影矩阵,这个投影矩阵可以将feature从高维降到低维。投影矩阵也可以叫做变换矩阵。新的低维特征必须每个维都正交,特征向量都是正交的。通过求样本矩阵的协方差矩阵,然后求出协方差矩阵的特征向量,这些特征向量就可以构成这个投影矩阵了。特征向量的选择取决于协方差矩阵的特征值的大小。

举一个例子:

对于一个训练集,100个sample,特征是10维,那么它可以建立一个100*10的矩阵,作为样本。求这个样本的协方差矩阵,得到一个10*10的协方差矩阵(解释在第6),然后求出这个协方差矩阵的特征值和特征向量,应该有10个特征值和特征向量,我们根据特征值的大小,取前四个特征值所对应的特征向量,构成一个10*4的矩阵,这个矩阵就是我们要求的特征矩阵,100*10的样本矩阵乘以这个10*4的特征矩阵,就得到了一个100*4的新的降维之后的样本矩阵,每个sample的维数下降了。

当给定一个测试的特征集之后,比如1*10维的特征,乘以上面得到的10*4的特征矩阵,便可以得到一个1*4的特征,用这个特征去分类。

所以做PCA实际上是求得这个投影矩阵,用高维的特征乘以这个投影矩阵,便可以将高维特征的维数下降到指定的维数。

6.协方差矩阵

	定义是变量向量减去均值向量,然后乘以变量向量减去均值向量的转置再求均值。例如x是变量,μ是均值,协方差矩阵等于E[(x-μ)(x-μ)^t],物理意义是这样的,例如x=(x1,x2,...,xi)那么协方差矩阵的第m行n列的数为xm与xn的协方差,若m=n,则是xn的方差。如果x的元素之间是独立的,那么协方差矩阵只有对角线是有值,因为x独立的话对于m≠n的情况xm与xn的协方差为0。另外协方差矩阵是对称的。
一般多变量分布的时候(例如多元高斯分布)会用到协方差矩阵,工程上协方差矩阵也用来分析非确定性平稳信号的性质以及定义非确定性向量的距离(马哈拉诺比斯范数)。



2016-09-25 23:32:07 xiamentingtao 阅读数 4396
  • 机器学习数学基础之矩阵视频教学

    本课程囊括了机器学习理论中所需要的和线性代数相关的所有知识。帮助想入门机器学习的朋友们快速掌握数学基础。 主要内容: 1. 矩阵的定义、性质、运算、分解以及应用。 2. 线性空间、范数、生成子空间相关知识。

    11498 人正在学习 去看看 AI100讲师

问题描述:

给定一个矩阵,如下:

A=[a11a21a12a22]

其中满足a12=a21.也就是所谓的对称矩阵。那么如何求解此矩阵的特征值以及特征向量呢?这里我们要用到雅克比旋转

雅克比旋转

Jacobi方法是求对称矩阵的全部特征值以及相应的特征向量的一种方法,它是基于以下两个结论:

  1. 任何实对称矩阵A可以通过正交相似变换成对角型,即存在正交矩阵Q,使得

    QTAQ=diag(λ1,λ2,,λn)

    其中λi(i=1,2,,n)是A的特征值,Q中各列为相应的特征向量。

  2. 在正交相似变换下,矩阵元素的平方和不变. 即设A=(aij)n×n,Q为正交矩阵,记B=QTAQ=(bij)n×n , 则

    i,j=1na2i,j=i,j=1nb2i,j

    Jacobi方法的基本思想是通过一次正交变换,将A中的一对非零的非对角元素化成零并且使得非对角元素的平方和减小。反复进行上述过程,使变换后的矩阵的非对角元素的平方和趋于零,从而使该矩阵近似为对角矩阵,得到全部特征值和特征向量。

如下我们仅仅考虑二维矩阵。对于高维的以此类推。
考虑如下的旋转矩阵,

P=[cos(θ)sin(θ)sin(θ)cos(θ)]

显然我们知道P是正交矩阵,即PT=P1orPPT=E
对矩阵A实施正交变换,即如下:
A=PTAP
.
则有:
a11=cos2(θ)a11+sin2(θ)a222cos(θ)sin(θ)a12                     (1)

a22=sin2(θ)a11+cos2(θ)a22+2cos(θ)sin(θ)a12                     (2)

a12=(cos2(θ)sin2(θ))a12+cos(θ)sin(θ)(a11a22)                     (3)

a12=0,则可得出θ的表达式:
ϕ=cot(2θ)=cos2(θ)sin2(θ)2sin(θ)cos(θ)=a22a112a12            (4)

如果令t=sin(θ)/cos(θ),则
t2+2tϕ1=0

这一方程较小的根对应着一个数量上小于π/4的旋转角,利用二次求根公式并对分母进行区分,可以写出这一较小的根为:
t=sgn(ϕ)|ϕ|+ϕ2+1            (5)

如果θ很大,以至于θ2在计算机上溢出,则令t=1/(2ϕ).于是就有:
cos(θ)=1t2+1            (6)

sin(θ)=tcos(θ)                (7)

将(6、7)代入(1-3)则,显然有:
(3)有a12=0.剩下等式的指导思想是想将它们的新值写成旧值加一个小的修正。于是利用a12=0,将(1-2)的a22消去,则有:
a11=a11ta12

a22=a22+ta12
.
至此通过一次旋转变换,即可将原矩阵非对称部分消零。整个矩阵变成一个对角矩阵。且相应的特征向量也可以得出。
APAA(P1,P2)=PTAP=AP=(P1,P2)[a11a22]

也就是A的特征值为a11a22,相应的特征向量为P1,P2.
其中,
P1=[cos(θ)sin(θ)]

P2=[sin(θ)cos(θ)]

至于代码,就不写了,很简单哦!

参考文献

  1. 第四章第三节 Jacobi 方法
  2. Numerical Recipes(数值分析方法库) C/C++:见第11章特征系统,对称矩阵的雅可比变换。


打赏

2018-10-22 21:29:22 u010420283 阅读数 452
  • 机器学习数学基础之矩阵视频教学

    本课程囊括了机器学习理论中所需要的和线性代数相关的所有知识。帮助想入门机器学习的朋友们快速掌握数学基础。 主要内容: 1. 矩阵的定义、性质、运算、分解以及应用。 2. 线性空间、范数、生成子空间相关知识。

    11498 人正在学习 去看看 AI100讲师

0. 前言

MATLAB或者OpenCV里有很多封装好的函数,我们可以使用一行代码直接调用并得到处理结果。然而当问到具体是怎么实现的时候,却总是一脸懵逼,答不上来。前两天参加一个算法工程师的笔试题,其中就考到了这几点,感到非常汗颜!赶紧补习!

1. 双线性插值

在图像处理中,我们有时需要改变图像的尺寸,放大或者缩小。线性插值则是这类操作的关键算法。不管是放大还是缩小操作,其实都是一个像素映射的处理。如下图从小图到大图的映射,以及从大图到小图的映射。

图像来源:https://www.cnblogs.com/sdxk/p/4056223.html

然而,这两种操作都有一定的缺点。对于把小图放大的操作,因为小图中的像素点到大图中的像素点不是满射,因此大图中的点不能完全有像素值;对于将大图缩小的操作,大图中的点逆映射为小图中的点时,得到的像素坐标值可能不是整数。一种解决办法是采用最近邻方法,即将得到的坐标值与相邻的原图像中的像素坐标值比较,取离得最近的坐标值对应的像素值作为缩放后的图像对应的坐标值的像素值,但是这种办法可能导致图像失真,因此可以采用双线性差值的办法来进行计算相应的像素值。

 

对于图中红色的四个点(Q11,Q12,Q21,Q22)为源图像中存在的点,需要求在目标图像的插值(绿色点P)的坐标对应的像素值。

首先在X轴进行插值,R1,R2是两个插值过程中过渡的点.

然后在 y 方向进行线性插值,得到:

 

这样就得到所要的结果 f \left( x, y \right),

讲一个具体的例子:

比如源图像是尺寸是(100,150),现在要缩小尺寸0.6倍,即目标图像的尺寸是(60,90),则求目标图像在坐标为P[10,4]的点的像素值怎么求呢?

假设源图像是ori_im,目标图像是tar_im,tra_im[10,4]表示在行列分别是10和4时候图像的像素值。

此时,x=10/0.6=16.67,  y=4/0.6=6.67,而x1=16,x2=17,y1=6,y2=7, (x1,y1), (x1,y2), (x2,y1), (x2,y2)是在源图像中最接近tra_im[10,4]的4个点。

tra_im[10,4]=ori_im[x1,y1]*(17-16.67)*(7-6.67)+ori_im[x2,y1]*(16.67-16)*(6.67-6)+ori_im[x2,y1]*(17-16.67)*(6.67-6)+ori_im[x2,y2]*(16.67-16)*(6.67-6)

带入4个点在源图像中对应的像素值即可得到缩小后图像的像素值。

下面我用python实现了这个双线性插值,并和python中自带的skimage函数里封装的resize进行了效果对比,感觉效果差不多。(代码可能有点冗余)

我的代码:

# -*- coding: utf-8 -*-
# Author: lmh
# Time: 2018.10.22
from skimage import transform
import matplotlib.pyplot as plt
import matplotlib.image as mping
import numpy as np
def chazhi(x,y,im):
#x,y分别是缩放或者放大后对应源图像的浮点坐标位置,im是源图像,返回目标图像根据插值计算得到的像素值
    x1,y1=int(x),int(y) #x1,x2,x3,x4分别是插值坐标对应在源图像上下左右最近的点的坐标
    x2,y2=x1+1,y1+1
    pixel11,pixel21,pixel12,pixel22=im[x1-1,y1-1],im[x2-1,y1-1],im[x2-1,y1-1],im[x2-1,y2-1]
	#以下是根据双线性插值的公式求得的目标图像的该位置的像素值
    new_pixel=(x2-x)*(y2-y)*pixel11+(x-x1)*(y2-y)*pixel21+(x2-x)*(y-y1)*pixel12+(x-x1)*(y-y1)*pixel22
    return new_pixel


im=mping.imread('C:\\Users\\shou\\Desktop\\photo.png')
im11=im
scale=0.4 #缩小程度
row,col=int(im.shape[0]*scale),int(im.shape[1]*scale)
im_sml=np.zeros([row,col,3])
for k in range(3):
    im1 = im[:, :, k]
    for i in range(row):
        for j in range(col):
            value=chazhi(i/scale,j/scale,im1)#3通道图像逐像素计算缩小或者放大后的新像素值
            im_sml[i][j][k]=value

im_narrow=im_sml

scale=1.7  #扩大程度
row, col = int(im.shape[0] * scale), int(im.shape[1] * scale)
im_sml = np.zeros([row, col, 3])
for k in range(3):
    im1 = im[:, :, k]
    for i in range(row):
        for j in range(col):
            value = chazhi(i / scale, j / scale, im1)
            im_sml[i][j][k] = value

im_enlarge=im_sml
python_narrow=transform.resize(im, (175, 145)) #使用skimage自带函数resize图像,也可以直接写像上面一样写比例(0.4,1.7)
python_enlarge=transform.resize(im, (746, 617))#为了对比,两种方法特意放大和缩小一样大小

plt.figure()
plt.subplot(151)
plt.imshow(im11,plt.cm.gray)
plt.title('Original')
# plt.axis('off')

plt.subplot(152)
plt.imshow(im_narrow,plt.cm.gray)
plt.title('my_narrow')
# plt.axis('off')

plt.subplot(153)
plt.imshow(python_narrow,plt.cm.gray)
plt.title('skimage_narrow')
# plt.axis('off')

plt.subplot(154)
plt.imshow(im_enlarge,plt.cm.gray)
plt.title('my_enlarge')
# plt.axis('off')

plt.subplot(1,5,5)
plt.imshow(python_enlarge,plt.cm.gray)
plt.title('skimage_enlarge')
# plt.axis('off')
plt.savefig('image_comp.png')

skimage的源码:

 

 效果图对比(原图[439,363,3];缩小0.4倍后为[175,145,3];放大1.7倍后为[746,617,3])

在博客:https://www.cnblogs.com/sdxk/p/4056223.html中,博主讲根据双线性插值的定义,我们自己写的函数图像处理的结果会因为坐标系的原因,而和MATLAB,OpenCV结果的完全不同。最好的解决方法就是,两个图像的几何中心重合,并且目标图像的每个像素之间都是等间隔的,并且都和两边有一定的边距,这也是matlab和openCV的做法。并给出了以下解决方法,其中m,n 是源图像尺寸;a,b是目标函数尺寸。然而我没有这些修改,与python封装的方法也没发现太大区别。

int x=(i+0.5)*m/a-0.5

int y=(j+0.5)*n/b-0.5

代替

int x=i*m/a

int y=j*n/b

补:经过查看Skimge的resize源码,发现确实里面添加了上面所说的策略(下面的代码),那么为什么我写的双线性代码没有这样做,图像的结果确和这样做的几乎一样?更加疑惑了

# take into account that 0th pixel is at position (0.5, 0.5)
dst_corners[:, 0] = col_scale * (src_corners[:, 0] + 0.5) - 0.5
dst_corners[:, 1] = row_scale * (src_corners[:, 1] + 0.5) - 0.5

2. 协方差矩阵

 

 

 

3. 求矩阵的特征值,特征向量,以及主成分

 

 

 

2015-09-23 16:00:47 z397164725 阅读数 2329
  • 机器学习数学基础之矩阵视频教学

    本课程囊括了机器学习理论中所需要的和线性代数相关的所有知识。帮助想入门机器学习的朋友们快速掌握数学基础。 主要内容: 1. 矩阵的定义、性质、运算、分解以及应用。 2. 线性空间、范数、生成子空间相关知识。

    11498 人正在学习 去看看 AI100讲师

将N阶对称矩阵A分解,用N个特征向量Q和特征值 Σ 来表示,不同特征值对应的特征向量是相互正交的。


特征向量和特征值可以很好的描述原始矩阵,方便实际应用。将矩阵投影在特征向量上,特征值即投影长度。特征值越大,表示矩阵在对应特征向量上信息量越大,导数越大。反之,特征值越小,表示信息量较少,也可删除对应特征向量上的数据,降维减少数据量。可应用于最优化求解,图像处理(如特征点描述和特征提取等),数据挖掘(如数据降维等)。

详见链接:知乎上很多大牛,会把很多貌似很深奥的东西解释的很容易理解。http://www.zhihu.com/question/21874816

另该链接上降维协方差矩阵计算写的比较模糊,可以参考PCA主成份分析http://www.360doc.com/content/14/0526/06/15831056_380900310.shtml

其中3个维度协方差计算公式

 

Matlab代码(其中A为样品矩阵)

C = cov(A)


简化求法

先让样本矩阵中心化,即每一维度减去该维度的均值,然后直接用新的到的样本矩阵乘上它的转置,然后除以(N-1)即可。计算结果与上述相同。

Matlab代码(其中A为样品矩阵,n为样品数)

B= A-repmat(mean(A),n,1);
C = B'*B/(n-1)






没有更多推荐了,返回首页