|
我当时也遇到了这个问题,采取的解决办法是利用shrink相关系数矩阵来使得协方差矩阵变为半正定,以下是代码实现:
def xiefangcha(cov,corr):#给定相关系数矩阵和协方差矩阵,求出相应的协方差矩阵
a=np.eye(100)#先生产一个100*100的单位阵,再一个个把协方差的对角线输进去
for i in range(100):
a[i][i]=cov.iloc[i,i]**0.5
cov_new=a@corr@a
return cov_new
def shrinkxishu(data,w):#shrink相关系数矩阵
for i in range(100):
for j in range(100):
if i!=j:
data.iloc[i,j]=data.iloc[i,j]*(1-w)
return data
def main(data,w,cov):
# data_corr1=pd.DataFrame()
# data_cov1=pd.DataFrame()
corr1=shrinkxishu(data,w)#求出shrink后的相关系数矩阵
cov1=xiefangcha(cov,corr1)#对应shrink后的协方差矩阵
return cov1
在选取w时,令w=0.0000001这种特别小的(0,1)之间的数就可以啦,相当于对原来的矩阵几乎没有做改变
|