本文从阐述Python实现客观赋权法的四种方式:

一. 熵权法

二. 因子分析权数法(FAM)

三. 主成分分析权数法(PCA)

四. 独立性权系数法

Python实现客观赋权法,在进行赋权前,先导入数据(列:各维属性;行:各样本),并自行进行去空值、归一化等操作。

import pandas as pd
import numpy as np
data=pd.DataFrame(pd.read_excel('路径'))

一. 熵权法

若某个指标的信息熵越大(即离散程度越大),表明指标提供的信息量越多,在综合评价中所能起到的作用也越大,权重也就越大。

m,n=data.shape
data=data.as_matrix(columns=None)
pij=data/data.sum(axis=0)
test=pij*np.log(pij)
test=np.nan_to_num(test)
ej=-1/np.log(m)*(test.sum(axis=0))
wi=(1-ej)/np.sum(1-ej)
print(wi)

二. 因子分析权数法(FAM)

因子分析的目的:用少数几个因子去描述许多指标和因素间的联系,因子不具备直接物理含义。

因子分析权数法:对每个指标,计算共性因子的累计贡献率来定权。

from math import *
import numpy.linalg as nlg
data_mean=data.mean()#样本均值
E = np.mat(np.zeros((12, 12)))#样本离差阵,12是因为我输入的是12维属性
for i in range(len(data)):
E += (data.iloc[i, :].values.reshape(12, 1) - data_mean.values.reshape(12, 1)) * (data.iloc[i, :].values.reshape(1, 12) - data_mean.values.reshape(1, 12))
R = np.mat(np.zeros((12, 12)))#样本相关阵R
for i in range(12):
for j in range(12):
R[i, j] = E[i, j]/sqrt(E[i, i] * E[j, j])
eig_value, eigvector = nlg.eig(R)#求矩阵R的全部特征值,构成向量E。
eig = pd.DataFrame()
eig['names'] = data.columns
eig['eig_value'] = eig_value
eig.sort_values('eig_value', ascending=False, inplace=True)
createVar = locals()
result=0
#求因子模型的因子载荷阵,寻找公共因子个数m
for m in range(1, 12):
createVar['factor_'+str(m)]=eig['eig_value'][:m].sum()/eig['eig_value'].sum()-result#这步计算每个因子的贡献率
result=eig['eig_value'][:m].sum()/eig['eig_value'].sum()
if eig['eig_value'][:m].sum()/eig['eig_value'].sum() >= 0.8:#认为贡献率之和>80%的前m个重要因子,可以描述指标
print(m)#这里我得到的是7,所以之后算因子载荷矩阵有七列
break
eig_value=eig_value.reshape(12, 1)
#因子载荷矩阵
A = np.mat(np.zeros((12, 7)))
A[:,0]=factor_1*abs((sqrt(eig_value[0])*eigvector[:,0]).reshape(12, 1)) 
A[:,1]=factor_2*abs((sqrt(eig_value[1])*eigvector[:,1]).reshape(12, 1)) 
A[:,2]=factor_3*abs((sqrt(eig_value[2])*eigvector[:,2]).reshape(12, 1))  
A[:,3]=factor_4*abs((sqrt(eig_value[3])*eigvector[:,3]).reshape(12, 1))  
A[:,4]=factor_5*abs((sqrt(eig_value[4])*eigvector[:,4]).reshape(12, 1))  
A[:,5]=factor_6*abs((sqrt(eig_value[5])*eigvector[:,5]).reshape(12, 1))  
A[:,6]=factor_7*abs((sqrt(eig_value[6])*eigvector[:,6]).reshape(12, 1))    
a=pd.DataFrame(A)  
b=a.sum(axis=1)
c=b/b.sum(axis=0)
print(c)

三. 主成分分析权数法(PCA)

与因子分析法的主要区别在于:主成分由原有特征线性加权得到,而因子分析法中,因子线性加权得到原有特征。

指标权重为主成分的方差贡献率。

from sklearn.decomposition import PCA
X=np.array(data)
pca=PCA(n_components=5)
pca.fit(X)
component=pca.components_
variance_ratio=pca.explained_variance_ratio_
component=abs(component.T)
for i in range(0,5):
component[:,i]=variance_ratio[i]*component[:,i]
a=pd.DataFrame(component)
b=a.sum(axis=1)
c=b/b.sum(axis=0)
print(c)

四. 独立性权系数法

若指标与其他指标的复相关系数越大,则与其他指标的共线性关系越强,重复信息越多,所以指标权重越小。也即独立性越强,指标权重越大。

复相关系数是其中一项和其他项的加权和的相关系数,所以这里需要用到多元线性回归,我是用excel做的回归(网上很容易查到步骤),得到了复相关系数R1—R12,之后:

createVar = locals()
sum_result=0
for i in range(1,13):
createVar['R'+str(i)]=1/createVar['R'+str(i)]
sum_result=sum_result+createVar['R'+str(i)]
for i in range(1,13):
createVar['R'+str(i)]=createVar['R'+str(i)]/sum_result
print(createVar['R'+str(i)])

参考文章:

https://blog.csdn.net/weixin_37805505/article/details/80847800

Python实现客观赋权法的更多相关文章

  1. 熵权法(the Entropy Weight Method)以及MATLAB实现

    按照信息论基本原理的解释,信息是系统有序程度的一个度量,熵是系统无序程度的一个度量:如果指标的信息熵越小,该指标提供的信息量越小,在综合评价中所起作用理当越小,权重就应该越低.因此,可利用信息熵这个工 ...

  2. 吴裕雄 python 熵权法确定特征权重

    一.熵权法介绍 熵最先由申农引入信息论,目前已经在工程技术.社会经济等领域得到了非常广泛的应用. 熵权法的基本思路是根据各个特征和它对应的值的变异性的大小来确定客观权重. 一般来说,若某个特征的信息熵 ...

  3. 基于topsis和熵权法

    % % X 数据矩阵 % % n 数据矩阵行数即评价对象数目 % % m 数据矩阵列数即经济指标数目 % % B 乘以熵权的数据矩阵 % % Dist_max D+ 与最大值的距离向量 % % Dis ...

  4. python排序之二冒泡排序法

    python排序之二冒泡排序法 如果你理解之前的插入排序法那冒泡排序法就很容易理解,冒泡排序是两个两个以向后位移的方式比较大小在互换的过程好了不多了先上代码吧如下: 首先还是一个无序列表lis,老规矩 ...

  5. 使用Python,字标注及最大熵法进行中文分词

    使用Python,字标注及最大熵法进行中文分词 在前面的博文中使用python实现了基于词典及匹配的中文分词,这里介绍另外一种方法, 这种方法基于字标注法,并且基于最大熵法,使用机器学习方法进行训练, ...

  6. grant all赋权后mysql.user表权限字段还是N,但能登录和新建表

    grant all赋权后mysql.user表权限字段还是N,但能登录和新建表 grant all privileges on linuxeye.* to linuxeye@'localhost' i ...

  7. oracle创建用户并赋权

    Oracle建立表空间和用户 [sql] view plain copy 建立表空间和用户的步骤: 用户 建立:create user 用户名 identified by "密码" ...

  8. Python的生成器进阶玩法

    Python的生成器进阶玩法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.yield的表达式形式 #!/usr/bin/env python #_*_coding:utf-8 ...

  9. oracle数据库如何创建用户和角色,并给其赋权?

    一.创建用户并赋予权限 1.创建用户 create user wangxiangyu identified by wangxiangyu; 2.赋权 grant dba to wangxiangyu; ...

随机推荐

  1. 【转载】COM 组件设计与应用(十四)——事件和通知(vc.net)

    原文:http://vckbase.com/index.php/wv/1244.html 一.前言 我的 COM 组件运行时产生一个窗口,当用户双击该窗口的时候,我需要通知调用者: 我的 COM 组件 ...

  2. 11 基于django的图书管理系统 多表

    1.需求 作业需求:1.列出图书列表.出版社列表.作者列表2.点击作者,会列出其出版的图书列表3.点击出版社,会列出旗下图书列表4.可以创建.修改.删除 图书.作者.出版社 踩分点:1.满足需求1,2 ...

  3. 浅谈ajax同步、异步的问题

    最近实习的时候看到过firefox的同步.异步的警告,想着概念不是那么清楚,于是整理了一下ajax同步异步方面的知识.我是小白,做个笔记. 首先就是概念问题,ajax根据async进行区分同步和异步过 ...

  4. Ubuntu下载磁力链接,torrent,迅雷链接

    用ubuntu下载电影:磁力链接,torrent,迅雷链接 需要软件:Ktorent, Amule 安装软件: sudo apt-get install ktorrent sudo apt-get i ...

  5. docker server gave HTTP response to HTTPS client 问题处理办法

    vi /etc/docker/daemon.json [root@localhost ~]# cat /etc/docker/daemon.json {"insecure-registrie ...

  6. .NET处理Json的几种方式

    序列化里的xml,soap,binary在上一篇文章里面已经说过了,这篇主要说json. json是目前非常流行的一种序列化数据的方式,很多api都采用的是json,结构简洁,容易理解,适用性强,逐渐 ...

  7. CHAPTER 24 History of Our Planet 第24章 我们行星的历史

    CHAPTER 24 History of Our Planet 第24章 我们行星的历史 Uncovering the bones of ancient beasts is only part of ...

  8. python编辑选课系统

    一.需求分析 1. 创建北京.上海 2 所学校 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上海开 3. 课程包含,周期,价格,通过学校创建课 ...

  9. docker入门使用教程

    Docker概念 Docker是开发人员和系统管理员 使用容器开发,部署和运行应用程序的平台.使用Linux容器部署应用程序称为容器化.容器不是新的,但它们用于轻松部署应用程序. 容器化越来越受欢迎, ...

  10. 下一个时代的发展架构竟然是它!FaaaaaaaaS到底是个啥?

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云serverless团队发表于云+社区专栏 导读:2018年7月6 - 7日,一年一度的技术圈盛会ArchSummit全球架构师 ...