模糊数学Python(二)模糊聚类分析

代码

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()
		


  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值