补一下上次文章的坑,有关标准化和归一化的问题.
标准化:(X-E(x))/D(x)
归一化: (X-min)/(max-min)
两个的具体差别我的感受不是特别深刻,用的比较多的是归一化.
from sklearn.preprocessing import MinMaxScaler
mm = MinMaxScaler()
mm_data = mm.fit_transform(X)
origin_data = mm.inverse_transform(mm_data)
X=mm_data
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
std_data = ss.fit_transform(X)
origin_data = ss.inverse_transform(std_data)
X = std_data
用这两个方法就可以分别得到归一化和标准化的数据,网上提到这两个好像很混乱,那就根据api和公式区分叭,minmax和最小最大值相关,standard和标准差有关.
我感受到的是,归一化受到最最大值影响较大,所以或许最小值最大值太奇葩时少用?
接下来是熵权法.参考文章:知乎,熵权法
虽然我用了好几次,不过不是很了解具体原理.只有一些零碎的关键词,信息熵,信息含量.
具体的应用是给了好几个影响因子,然后直接求出权重,加权得到几个影响因子的综合结果.
代码的实现还是挺简单的,就对着公式敲就好,我给出我自己的python代码.(居然没找到相关API)
import openpyxl
import matplotlib.pyplot as plt
import numpy as np
import math
excel = openpyxl.load_workbook('./会员.xlsx')
# sheet = excel['筛选后']
sheet = excel['归一化']
jingdu=[]
weidu=[]
minx = 112.6832583
maxx = 114.4936096
miny = 22.49308313
maxy = 23.87839806
rapx = (114.4936096 - 112.6832583)/50
rapy = (23.87839806 - 22.49308313)/50
xiane=[]
xinyudu=[]
timestart=[]
jingdu = []
weidu = []
capacity = []
for i in range(2,1862):
xiane.append(sheet.cell(row=i,column=4).value)
string = sheet.cell(row=i,column=5).value
string = str(string)
string = string.split(':')
time = int(string[0])*100+int(string[1])
timestart.append(time)
xinyudu.append(sheet.cell(row=i,column=6).value)
jingdu.append(sheet.cell(row=i,column=3).value)
weidu.append(sheet.cell(row=i,column=2).value)
capacity.append(sheet.cell(row=i,column=6).value)
def zhengxiangMinMax(data):
mindata = min(data)
maxdata = max(data)
temp = data[:]
for i in range(len(data)):
data[i] = temp[i]-mindata
data[i]/= maxdata-mindata
def fuxiangMinMax(data):
mindata = min(data)
maxdata = max(data)
temp = data[:]
for i in range(len(data)):
data[i] = maxdata-temp[i]
data[i]/= maxdata-mindata
def bizhong(data):
allsum = sum(data)
for i in range(len(data)):
data[i] /= allsum
def shan(data):
for i in range(len(data)):
if(data[i]==0):
continue
data[i]=data[i]*math.log(data[i])
return 1+sum(data)*(1/math.log(len(data)))
zhengxiangMinMax(xiane)
zhengxiangMinMax(xinyudu)
fuxiangMinMax(timestart)
bizhong(xinyudu)
bizhong(xiane)
bizhong(timestart)
d=[]
d.append(shan(xiane))
d.append(shan(timestart))
d.append(shan(xinyudu))
bizhong(d)
print(d)
自己对于熵权法的感受:
今天学到的一些小技巧
用于改变excel数据的颜色,改变颜色方便直接在excel里面对数据进行修改,筛选等操作
from openpyxl.styles import PatternFill # 导入填充模块
fille = PatternFill('solid', fgColor="FF0000")
sheet.cell(row=i,column =3).fill=fille
如果excel表格里面有些值用公式算出来的,如果直接openpyxl获取值,获取到的公式的表达式而不是公式算出来的值.用data_only这个设置来解决这个问题.
excel = openpyxl.load_workbook('归一化.xlsx',data_only=1)