python实现模糊识别K均值算法

模糊K均值算法

思路说明

在这里插入图片描述

python代码实现

def Fuzzy_K_means_clustering(x1,x2,x3,x4,U,pointvalue):
    w=[]
    w.append(x1)
    w.append(x2)
    w.append(x3)
    w.append(x4)
    z1=multiple(w,U)
    while 1:
        U1 = [[] for i in range(0, len(U))]
        for i in range(0, len(w)):
            listd = []
            for k in range(0, len(z1)):
                d = 0.0
                for j in range(0, len(w[i])):
                    d = d + (w[i][j] - z1[k][j]) ** 2
                listd.append(d)
            count = 0
            for m in range(0, len(listd)):
                sum = 0.0
                for n in range(0, len(listd)):
                    sum = sum + (listd[m] / listd[n])
                if sum != 0:
                    u1 = 1 / sum
                    U1[count].append(u1)
                    count = count + 1
                else:
                    U1[count].append(float(1.0))
                    count = count + 1
        for i in range(0, len(U1)):
            for j in range(0, len(U1[i])):
                if U1[i][j] == 1.0:
                    zero(U1, i, j)
        judgenum = judge(U1, U, pointvalue)
        if judgenum == 1:
            result = Union(U1, w)
            print(result)
            break
        else:
            U = U1
def zero(U1,index1,index2):
    for i in range(0,len(U1)):
        if index1!=i:
            U[i][index2]=0.0
def Union(U1,w):
    result=[[]for i in range(0,len(U1))]
    for i in range(0,len(U1[0])):
        min=U[0][i]
        index=0
        for j in range(0,len(U1)):
            if min<U1[j][i]:
                min=U1[j][i]
                index=j
        result[index].append(w[i])
    return result
def multiple(w,U):
    sumz=[]
    for i in range(0,len(U)):
        z=[0.0 for k in range(0,len(w[0]))]
        sum=0.0
        for j in range(0,len(U[i])):
            sum=sum+U[i][j]*U[i][j]
            zan=multiple1(U[i][j],w[j])
            z=addtion(zan,z)
        for m in range(0,len(z)):
            z[m]=z[m]/sum
        sumz.append(z)
    return sumz
def multiple1(c,list1):
    zan=[]
    for i in range(0,len(list1)):
        zan.append(c**2*list1[i])
    return zan
def addtion(list1,list2):
    z=[]
    for i in range(0,len(list1)):
        z.append(float(list1[i]+list2[i]))
    return z
def judge(U1,U2,pointvalue):
    for i in range(0,len(U1)):
        for j in range(0,len(U[i])):
            if(abs(U1[i][j])-U2[i][j])>pointvalue:
                return 0
    return 1
if __name__ == '__main__':
    x1 = [0, 0]
    x2 = [0, 1]
    x3 = [3, 1]
    x4 = [3, 2]
    # U = [[0.2, 0.7, 0.7, 0.1], [0.1, 0.1, 0.1, 0.8],[0.7,0.2,0.2,0.1]]
    key=int(input("请输入K的值:"))
    U=[[]for i in range(key)]
    for i in range(0,key):
        print("请输入第"+str(i+1)+"行的4个隶属度:")
        for j in range(0,4):
            num=float(input())
            U[i].append(num)
    Fuzzy_K_means_clustering(x1, x2, x3, x4, U, 1.0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值