协方差矩阵上机实验

 协方差矩阵上机实验

1.1 题目的主要研究内容

(1)介绍协方差矩阵的定义、计算过程

(2)给出协方差矩阵的具体数据,并运用Python进行上机实现

(3)对两种协方差矩阵计算的结果进行比较分析

1.2 题目研究的工作基础或实验条件

(1)硬件环境:装有操作系统的计算机

(2)软件环境:PyCharm、python解释器、numpy科学计算库

1.3 设计思想

使用numpy科学计算库对矩阵进行计算。先输入矩阵的列数m和行数n,再输入矩阵数据,将矩阵的行数和矩阵数据作为参数传给自定义的函数coMatrix,用来计算协方差矩阵。在coMatrix函数中,先按列计算原始矩阵的均值,得到一个1行m列的矩阵,然后用1初始化一个n行1列的矩阵,用这个n行1列的全1矩阵乘1行m列的均值矩阵,得到求出n行m列的均值矩阵,然后用原始矩阵和均值矩阵作差,并对作差结果进行转置,得到的转置矩阵乘作差后的矩阵,再乘1/(n-1)得到协方差矩阵。

1.4 流程图

图1 协方差矩阵计算流程图

1.5 主要程序代码

import numpy as np

def coMatrix(r, matrixData):   # 传入行数和矩阵

    rawData = np.array(matrixData).astype(np.int)   # 数据类型转换

    print("原始数据:")

    print(rawData)

    averageData = np.mean(rawData, axis=0)  # 按列求均值

    print("维度均值:")

    matrixOne = np.array([[1] * 1] * r).astype(np.int)  # 用1初始化一个r行1列的矩阵

    multiData = matrixOne * averageData  # 求均值矩阵

    print(multiData)

    differData = rawData - multiData    # 减均值

    print("均值作差:")

    print(differData)

    tData = differData.T    # 求矩阵转置

    covMatrix = np.dot(tData, differData) * (1 / (r - 1))   # 求协方差矩阵

    print("协方差矩阵:")

    print(covMatrix)

if __name__ == '__main__':

    m = int(input("输入列数:"))

    n = int(input("输入行数:"))

    matrix = [[0] * m] * n  # 用0初始化n*m矩阵

    print("输入数据:")

    for i in range(n):  # 循环输入矩阵数据,以空格为分隔符

        matrix[i] = input().split(" ")

coMatrix(n, matrix)  # 调用求协方差矩阵函数

1.6 运行结果及分析

图2 程序运行结果

本组采用了三种语言及手动推演,对相同的输入矩阵,取得了相同的计算结果。经过分析,本组均采用如下公式计算:

所得结果是样本协方差的无偏估计,如果采用如下公式:

所得结果是样本协方差的最大似然估计,结果会有所偏差。

本例中无偏估计的结果是最大似然估计的3/2倍。两个优点不可兼得,使用时要根据实际情况决定。当n足够大时,二者的差别可以忽略。

你可能感兴趣的:(矩阵,python,numpy)