import numpy as np
np.set_printoptions(precision=2) # 设置矩阵输出精度,保留两位小数
def jmax(a):
"""
数据标准化
最大值规格化法
"""
a=np.array(a)
c=np.zeros_like(a,dtype=float)
for j in range(c.shape[1]): # 遍历c的列
for i in range(c.shape[0]): # 遍历c的列
c[i,j]=a[i,j]/np.max(a[:,j])
return c
def alike(a):
"""
模糊相似矩阵
最大最小法
"""
a=jmax(a) # 用标准化后的数据
c=np.zeros((a.shape[0],a.shape[0]),dtype=float)
mmax=[]
mmin=[]
for i in range(c.shape[0]): # 遍历c的行
for j in range(c.shape[0]): # 遍历c的行
mmax.extend([np.fmax(a[i,:],a[j,:])]) # 取i和和j行的最大值,即求i行和j行的并
mmin.extend([np.fmin(a[i,:],a[j,:])]) # 取i和和j行的最大值,即求i行和j行的交
for i in range(len(mmax)):
mmax[i]=np.sum(mmax[i]) # 求并的和
mmin[i]=np.sum(mmin[i]) # 求交的和
mmax=np.array(mmax).reshape(c.shape[0],c.shape[1]) # 变换为与c同型的矩阵
mmin=np.array(mmin).reshape(c.shape[0],c.shape[1]) # 变换为与c同型的矩阵
for i in range(c.shape[0]): # 遍历c的行
for j in range(c.shape[1]): # 遍历c的列
c[i,j]=mmin[i,j]/mmax[i,j] # 赋值相似度
return c
def hecheng(a,b):
"""
求模糊是矩阵a和模糊矩阵b的合成
"""
a,b = np.array(a),np.array(b)
c=np.zeros_like(a.dot(b))
for i in range(a.shape[0]): # 遍历a的行元素
for j in range(b.shape[1]): # 遍历b的列元素
empty=[]
for k in range(a.shape[1]):
empty.append(min(a[i,k],b[k,j])) # 行列元素比小
c[i,j]=max(empty) # 比小结果取大
return c
def bibao(a):
"""
求模糊矩阵a的闭包
"""
a = alike(a) # 用模糊相似矩阵
c=a
while True:
m=c
c=hecheng(hecheng(a,c),hecheng(a,c))
if (c==m).all(): # 闭包条件
return np.around(c,decimals=2) # 返回传递闭包,四舍五入,保留两位小数
break
else:
continue
def julei(a,g):
a=bibao(a) # 用传递闭包
c=np.zeros_like(a,dtype=int)
for i in range(c.shape[0]):
for j in range(c.shape[1]):
if a[i,j]>=g:
c[i,j]=1
else:
c[i,j]=0
return c
def result(a,g):
"""
模糊聚类分析结果展示
"""
a = julei(a,g)
c=[] # 同类聚合
for i in range(len(a)):
x=[]
for j in range(i,len(a)):
if a[i][j]==1:
x.append(j)
else:
continue
c.append(x)
d=[] # 删除重复1
for i in range(len(c)):
for j in range(i+1,len(c)):
for k in range(len(c[j])):
if c[j][k] in c[i]:
d.append(c[j])
break
else:
continue
dd=[] # 删除重复2
for i in range(len(d)):
for j in range(i+1,len(d)):
if d[i]==d[j]:
dd.append(d[j])
for i in range(len(dd)): # 删除重复3
try:
d.pop(d.index(dd[i]))
except ValueError:
continue
for i in range(len(d)): # 删除重复4
try:
c.pop(c.index(d[i]))
except ValueError:
continue
for i in range(len(dd)): # 删除重复5
try:
c.pop(c.index(dd[i]))
except ValueError:
continue
for i in range(len(c)):
for j in range(len(c[i])):
c[i][j]+=1
return c
def main():
"""
测试代码
"""
x=[[80,10,6,2],
[50,1,6,4],
[90,6,4,6],
[40,5,7,3],
[10,1,2,4]]
g=0.63
print("原始数据\n",np.array(x))
print("\n数据标准化(最大值规格化法)\n",jmax(x))
print("\n模糊相似矩阵(最大最小法)\n",alike(x))
print("\n传递闭包\n",bibao(x))
print("\n模糊聚类分析矩阵(lambda=%0.2f)\n"%g,julei(x,g))
print("\n模糊聚类结果(lambda=%0.2f)\n"%g,result(x,g))
if __name__ == "__main__":
main()