因子分析(主成分法)代码

时间:2023-07-30 15:43:30 来源: 哔哩哔哩


(资料图片仅供参考)

#此代码是我手动搭建的

#除KMO和bar检验外未使用因子分析的专用工具包(factor_analyzer)

#此代码仅能解决需要输出两个潜变量的因子分析问题

#如需将此代码放在自己个人社交平台,请给个引用"B站 耿大哥讲算法"

import numpy as npimport as pltfrom sklearn import preprocessingimport matplotlib;("font",family='Microsoft YaHei')from import normalizefrom factor_analyzer import calculate_kmo,calculate_bartlett_sphericity#读取数据&校准化#               指标1 指标2 指标3 指标4指标5 指标6 指标7 指标8data=([[,,,,,,,], #样本1               [,,,,,,,], #样本2               [,,,,,,,], #样本3               [,,,,,,,], #样本4               [,,,,,,,], #样本5               [,,,,,,,], #样本6               [,,,,,,,], #样本7               [,,,,,,,], #样本8               [,,,,,,,], #样本9               [,,,,,,,], #样本10               [,,,,,,,], #样本11               [,,,,,,,], #样本13               [,,,,,,,], #样本13               [,,,,,,,]])#样本14# 对样本Z-score标准化X=(data,axis=0)#KMO和barlett检验bartlett,KMO=calculate_bartlett_sphericity(data),calculate_kmo(data)[1]print('-'*54);print('KMO和bartlett检验')print('KMO='+str('%.3f'%calculate_kmo(data)[1]),end='\t')if   KMO<=1  and KMO>=:print('非常好')elif KMO< and KMO>=:print('好')elif KMO< and KMO>=:print('一般')elif KMO< and KMO>=:print('差')elif KMO< and KMO>=:print('很差')else:print('不能接受')print('bartlett 统计量='+str('%.3f'%bartlett[0]))print('bartlett 自由度='+str(int([1]*([1]-1)/2)))print('bartlett P值='+str('%.3f'%bartlett[1]))#求Z-score标准化后的样本间的协方差矩阵CC=(,X)/([0])#求协方差矩阵C的特征值λ和特征向量V0λ,V0=(C);V0=(V0)#协方差矩阵C的特征向量施密特正交化和单位化a=[V0[:,i] for i in range([1])]def b(i):    if i==0:return a[0]    else:return a[i]-sum(float(a[i].T*b(k)/(b(k).T*b(k)))*b(k) for k in range(i))V1=b(0)for i in range(1,[1]):V1=_stack((V1,b(i)))V1=normalize((V1),axis=0,norm='l2')# 按照协方差矩阵C的特征值大小对特征向量排序tezhenggen1=[i for i in λ];(reverse=True)V=(shape=([1],[1]))for i in range([1]):    for j in range([1]):V[i,j]=V1[i,list(λ).index(tezhenggen1[j])]# 计算载荷矩阵A(两列)和得分系数矩阵S0(两列)Z=((shape=([1],[1])))for i in range([1]):Z[i,i]=1/(tezhenggen1[i]**)A,S0=(V*)[:,0:2],(V*Z)[:,0:2]# 对载荷矩阵A施以二维正交旋转#(1)定义载荷间的总方差函数ff(θ)def ff(a):    B=(A)*([[(a),-(a)],[(a),(a)]])    zongfangcha=0    for k in range([1]):        junzhi=sum(B[i,k]**2/sum(A[i,j]**2 for j in range([1]))                     for i in range([0]))/[0]        zongfangcha+=sum((B[i,k]**2/sum(A[i,j]**2                    for j in range([1]))-junzhi)**2                    for i in range([0]))    return zongfangcha#(2)计算并修正载荷矩阵的旋转解和得分系数矩阵x=(0,/2,);y=[ff(i) for i in x];θ=x[(max(y))]for i in range(4):    θ+=i*/2    Q=([[(θ),-(θ)],[(θ),(θ)]])    B=A*Q    list0=[abs(B[j,0]) for j in range([0])]    list1=[abs(B[j,1]) for j in range([0])]    a,b=B[(max(list0)),0],B[(max(list1)),1]    if a>0 and b>0:break    else:passQ=([[(θ),-(θ)],[(θ),(θ)]])B=A*Q;S=S0*Qlist2=[(*B)[j,j] for j in range([1])]if (max(list2))==0:passelse:B=B*([[0,1],[1,0]]);S=S*([[0,1],[1,0]])(reverse=True)#输出旋转角度θ和载荷间的总方差最大值max(ff)print('-'*54)print('旋转角度θ='+str('%.2f'%(θ*180/))+'°',end='\t')print('载荷间的总方差='+str('%.3f'%ff(θ)))#输出使载荷间的总方差函数达到最大的旋转矩阵Qprint('旋转矩阵Q')for i in range([0]):    for j in range([1]):print('%.3f'%Q[i,j],end='\t')    print()print('旋转方法:Kaiser 标准化最大方差法')#输出载荷矩阵的旋转解print('-'*54);print('载荷矩阵的旋转解')print('指标|组件',end='\t')for i in range([1]):print('潜变量f'+str(i+1),end='\t')print('共同度')for i in range([0]):    print('指标'+str(i+1),end='\t')    for j in range([1]):print('%.3f'%B[i,j],end='\t')    print('%.3f'%sum(B[i,k]**2 for k in range([1])),end='\t')    print()print('总贡献',end='\t')for i in list2:print('%.3f'%i,end='\t')print('%.3f'%sum(list2));print('-'*53)#输出旋转后的成分得分系数矩阵print('成分得分系数矩阵(旋转后)')print('指标|组件',end='\t')for i in range([1]):print('潜变量f'+str(i+1),end='\t')print()for i in range([0]):    print('指标'+str(i+1),end='\t')    for j in range([1]):print('%.3f'%S[i,j],end='\t')    print()#计算各样本的综合得分并排序print('-'*54)print('各样本的得分及排序');print('样本|fi',end='\t')for i in range([1]):print('潜变量f'+str(i+1),end='\t')print('综合变量f',end='\t');F=X*Sprint('按f1排序',end='\t');print('按f2排序',end='\t');print('按f排序')def xvhao(x):    list3=[i for i in x]    (reverse=True)    return [(i)+1 for i in x]list4=[i/sum(list2) for i in list2]list5=[sum(list4[j]*F[i,j] for j in range([1])) for i in range([0])]for i in range([0]):    print('样本'+str(i+1),end='\t')    for j in range([1]):print('%.3f'%F[i,j],end='\t')    print('%.3f'%list5[i],'  ',end='\t');print(xvhao(F[:,0])[i],'  ',end='\t')    print(xvhao(F[:,1])[i],'  ',end='\t');print(xvhao(list5)[i],'  ',end='\t')    print()print('-'*54)#绘制载荷图(旋转后的空间组件图)(B[:,0],B[:,1],'o');('潜变量f1');('潜变量f2')('载荷图(旋转后的空间组件图)')for i in range([0]):(B[i,0]+,B[i,1]+,'指标'+str(i+1))()

标签:

X 关闭

X 关闭