Python3:Excel数据转成矩阵并计算该矩阵的特征值和特征向量

第一种实现方法(适用于已知协方差矩阵的情况):

#Python实现将Excel的数值型数据转成矩阵,并计算其特征值和特征向量的计算方法
import numpy as np
import pandas as pd
import xlrd
from sklearn import preprocessing
def excel_to_matrix(path):
    table = xlrd.open_workbook(path).sheets()[0]#获取第一个sheet表
    row = table.nrows  # 行数
    col = table.ncols  # 列数
    datamatrix = np.zeros((row, col))#生成一个nrows行ncols列,且元素均为0的初始矩阵
    for x in range(col):
        cols = np.matrix(table.col_values(x))  # 把list转换为矩阵进行矩阵操作
        datamatrix[:, x] = cols # 按列把数据存进矩阵中
    #特征值和特征向量的计算  
    print ('求矩阵的特征值与特征向量:')
    print  (eig(datamatrix))#特征值是按照列放的,结果中的一列代表一个特征向量
    return datamatrix#返回的是Excel中的数据转成矩阵的结果
datafile = u'D:\\Users\\DUANPT\\Desktop\\3.xlsx'#数据文件所在路径
excel_to_matrix(datafile)#执行定义的函数

'''
输出的结果如下所示:
求矩阵的特征值与特征向量:
(array([51.06975432,  8.16965705, 13.74947752]), 该列是特征值
array([[-0.5070749 , -0.69860555, -0.50480227],这是特征向量,按列排放的
       [-0.61727541,  0.70311139, -0.35299496],
       [-0.60153646, -0.13260714,  0.78776217]]))
Out[34]: 
下面是Excel中的数据转成矩阵的结果:
array([[20.62222222, 14.42222222, 10.86666667],
       [14.42222222, 25.21111111, 14.37777778],
       [10.86666667, 14.37777778, 27.15555556]])
'''

第二种实现方法(适用于只有原始数据的情况):

#将Excel中的数据读成dataframe形式,然后通过.cov()计算出该数据的协方差,将该数据转换成矩阵形式,即可计算出其特征值和特征向量
import pandas as pd
import numpy as np
df = pd.read_excel(r'D:\Users\DUANPT\Desktop\4.xlsx')  #读入Excel数据,填写数据文件存放的路径
data = df[['x','y','z']]  #x,y,z是数据文件的表头,数据是按列排放的,即,x,y,z三列数据,视为三个特征词
print(data.cov())  #计算该数据的协方差
matrix = np.array(data.cov())  #将协方差转为矩阵形式
print ('求矩阵的特征值与特征向量:')
print (eig(matrix))  #计算其特征值和特征向量,特征向量按列排放,一列是一个特征向量。如果得到的特征是复数形式,则可以将代码这么写,a,b = eig(matrix)#a存放的是特征值,b存放的是特征向量a1 = np.real(a)#.real()是取特征值复数的实部,b1 = np.real(b)#是取特征向量复数的实部
'''
输出的结果如下:
           x          y          z
x  20.622222  14.422222  10.866667
y  14.422222  25.211111  14.377778
z  10.866667  14.377778  27.155556
求矩阵的特征值与特征向量:
(array([51.06975432,  8.16965705, 13.74947752]), #该列是特征值
array([[-0.5070749 , -0.69860555, -0.50480227],
       [-0.61727541,  0.70311139, -0.35299496],
       [-0.60153646, -0.13260714,  0.78776217]]))
'''
  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值