计算Fisher信息之基础矩阵(一)

import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
stepsize = 0.01
'''
这里有个问题 就是特征值的排列方式可能跟下一个的顺序不一样,所以就会导致求导时候的错位。
这里需要在求导的时候,搞一下吧。
另外,矩阵的特征值,会不会突然变异?有跃迁?需要设置一个,检测的一些。
'''
def EigVect(Matrix):
    eigs,vectors = np.linalg.eig(Matrix)
    return eigs,vectors

def test1ForContinueOfEig(eigss=[]):
    #这里的是两个或者多个特征值,我们假设前面已经将其复位好了
    plt.figure()
    eigss1 = np.array(eigss)
    for i in eigss1.shape[1]:
        plt.plot(eigss1[:,i])
    plt.title('tezhengzhi')
    plt.xlabel('x')
    plt.show()

def EigDaoshu(Eig1=1,Eig2=2,stepsize=0.01):
    if abs((Eig1-Eig2)/Eig1)>5:
      #  print('特征值变化超过10倍,出现奇异的点了')
        raise Exception('特征值变化超过原来的10倍,出现奇异的点了')
    return (Eig1-Eig2)/stepsize

def VectDaoshu(Vect1=[2,2],Vect2=[1,1],stepsize=0.01):
    result = (Vect1-Vect2)/Vect1
    for item in result:
        if abs(item)>5:
            raise Exception('向量变化超过原来的十倍啦,应该是出现奇异的点了')
    return (Vect1-Vect2)/stepsize

def isnear(eigs):
    if abs(eigs[0]-eigs[1])<stepsize:
        raise Exception('两个特征值很相近,无法得出哪个特征值是哪个,换换矩阵吧')
    return True
'''
解决的情形是[0.4,0.6] [0.61,0.39] 这里第一位和第二位的就需要换一个位置
'''
def sorteigs(eig1,eig2,eig3,vect1,vect2,vect3):
    if abs(eig1[0]-eig2[0])<abs(eig1[0]-eig2[1]):
        pass
    else:
        print('需要换位2....')
        eig2[0],eig2[1] = eig2[1],eig2[0]
        vect2[0],vect2[1] = vect2[1],vect2[0]
    if abs(eig2[0]-eig3[0])<abs(eig2[0]-eig3[1]):
        pass
    else:
        print('需要换位3....')
        eig3[0],eig3[1] = eig3[1],eig3[0]
        vect3[0],vect3[1] = vect3[1],vect3[0]
    return eig1,eig2,eig3,vect1,vect2,vect3

函数说明

函数 函数名称 备注
EigVect 求特征值和特征向量
test1ForContinueOfEig 测试特征值是否连续 还没用到
EigDaoshu 特征值导数
VectDaoshu 特征向量导数
isnear 是否相邻 为下面函数所用
sorteigs 特征值从小到大排序 使得特征值变化连续

你可能感兴趣的:(机器学习理论相关)