模糊集运算规则合集之一,intuitionistic fuzzy set。
将直觉模糊集的运算封装到了一个py文件中,方便自己在其他文件中调用。包含的运算有交,并,和,积,数乘,乘方,q=1,2,inf情况下的距离测度和相似性测度,得分函数和精确函数,其他还在持续更新中。
可以满足计算中的基本需求,在这里分享给大家方便使用。
ps,未来计划将之前写过的直觉模糊文章全部都用该文件进行修正,还想将犹豫模糊,q阶模糊等其他模糊环境的基本运算都封装出来,写的不好,欢迎大家修改。
下面举个简单的使用例子,数据来自论文《Pythagorean Fuzzy Hamy Mean Operators in
Multiple Attribute Group Decision Making and Their
Application to Supplier Selection》实现群决策的方案选优。
使用简单的加权平均算子进行信息融合,代码只需要三行,对每个矩阵调用数乘运算加权,再调用和运算集结。
df1=IFS.plus(IFS.ltimes(w[0],data.df1),IFS.ltimes(w[1],data.df2))
df2=IFS.plus(IFS.ltimes(w[2],data.df1),IFS.ltimes(w[3],data.df2))
print(IFS.plus(df1,df2))
之后随便选一个决策方法选优,获得排名和论文结果一致,说明计算无误。
代码如下,py文件放在了GitHub仓库https://github.com/rivendelltom/decision-making-study
import pandas as pd#AHP方法实现
from matplotlib.cbook import flatten
import numpy as np
import scipy as sp
inf=9999999 #代表n
def ifs_jiao(coords1, coords2): # 交运算
t = list(zip(coords1, coords2))
t1 = min(t[0])
t2 = max(t[1])
return [t1, t2]
def ifs_bing(coords1, coords2): # 并运算
t = list(zip(coords1, coords2))
print(t)
t1 = max(t[0])
t2 = min(t[1])
return [t1, t2]
def plus(coords1, coords2): # 和运算,支持一对一(就算一个元素也要写成二维数组的形式),多对多
d1=[]
d2=[]
d=[]
for (x, y) in zip(coords1, coords2):
d1.append(x[0]+y[0]-x[0]*y[0])
d2.append(x[1]*y[1])
t=list(zip(*[d1,d2]))
for i in t:
d.append(list(i))
return d
def times(coords1, coords2): # 机运算
d1=[]
d2=[]
d=[]
for (x, y) in zip(coords1, coords2):
d1.append(x[0]*y[0])
d2.append(x[1]+y[1]-x[1]*y[1])
t=list(zip(*[d1,d2]))
for i in t:
d.append(list(i))
return d
def ltimes(lamda, coords2): # 数乘运算
d1=[]
d2=[]
d=[]
for x,y in coords2:
d1.append((1-(1-x)**lamda))
d2.append(y**lamda)
t=list(zip(*[d1,d2]))
for i in t:
d.append(list(i))
return d
def lpower(lamda, coords2): # 乘方运算
d1=[]
d2=[]
d=[]
for x,y in coords2:
# print(x)
d1.append(x**lamda)
# print(d1)
d2.append((1-(1-y)**lamda))
t=list(zip(*[d1,d2]))
for i in t:
d.append(list(i))
return d
def distance(coords1, coords2,q): # 计算距离的函数,q可以实现汉明,欧几里得,闵可夫斯基,切比雪夫距离
n=len(coords1)
# print(n)
pai=[]
d3=[]
dis=0
for (x, y) in zip(coords1, coords2):
pai.append(np.array(1 -x[0]-x[1])-np.array(1- y[0]-y[1]))
d3.append(np.ndarray.tolist(np.array(x)-np.array(y)))
t1 ,t2= list(zip(*d3))
if q==1:
dis =1- (0.5*(1/n)*(sum(np.abs(t1)+np.abs(t2)+np.abs(pai))))**(1/q)
if q>=2:
dis =1-(0.5*(1/n)*(sum(np.power(t1,q)+np.power(t2,q)+np.power(pai,q))))**(1/q)
if q == inf:
t = zip(np.abs(t1) , np.abs(t2) , np.abs(pai))
dis = 1-max(list(map(lambda x: (x[1] + x[0]+x[2])/(2*n), list(t))))
return dis
def weight_distance(coords1, coords2,q,w): # 计算加权的距离的函数
n=len(coords1)
pai=[]
d3=[]
dis=0
for (x, y) in zip(coords1, coords2):
pai.append(np.array(1 -x[0]-x[1])-np.array(1- y[0]-y[1]))
d3.append(np.ndarray.tolist(np.array(x)-np.array(y)))
t1 ,t2= list(zip(*d3))
if q==1:
dis =1- 0.5*(sum(w*(np.abs(t1)+np.abs(t2)+np.abs(pai))))
if q>=2:
dis =1- (0.5*np.sum(w * (np.power(t1, q) + np.power(t2, q) + np.power(pai, q))))**(1/q)
# if q == inf:
#懒得写了,切比雪夫距离一般用不到
return dis
def score(coords1): # 计算得分函数
d=[]
for x,y in coords1:
d.append(0.5*(1+x**2-y**2))
return d
def accuary(coords1): # 计算精确函数
d=[]
for x,y in coords1:
d.append(x**2+y**2)
return d
'''一些简单的求证'''
# df1 = [[0.3, 0.5],[0.4,0.5],[0.6,0.3]]
# df2 = [[0.2,0.4],[0.5,0.4],[0.5,0.1]]
# df3=[[0.3,0.5]]
# df4=[[0.2,0.4]]
# print(ifs_plus(df1,df2))
# print(ifs_times(df1,df2))
# print(ifs_lamdatimes(2,df1))
# print(ifs_lamdapower(2,df1))
# print(distance(df1,df2,2))
# print(distance(df1,df2,1))
# print(distance(df1,df2,inf))
# w=np.array([0.5,0.2,0.3])
# print(weight_distance(df1,df2,1,w))
# print(weight_distance(df1,df2,2,w))