美文网首页
FCM模糊C均值(模式识别5(补充3))

FCM模糊C均值(模式识别5(补充3))

作者: 小火伴 | 来源:发表于2018-01-17 17:27 被阅读42次
    FCM-1.png FCM-2.png FCM-3.png FCM-4.png FCM-5.png FCM-6.png FCM-7.png
    # coding: utf-8
    
    # # 第五次模式识别作业
    
    # In[1]:
    
    # get_ipython().magic('matplotlib inline')/
    
    
    # In[2]:
    
    from sklearn.datasets import load_iris
    import matplotlib.pyplot as plt
    import numpy as np
    import copy
    import random
    
    
    # In[3]:
    
    c=3
    b=2
    iris = load_iris()
    X = iris.data
    Y = iris.target
    # 归十化
    for i in range(X.shape[1]):
        max_x=max(X[:,i])
        min_x=min(X[:,i])
        X[:,i]=(X[:,i]-min_x)/(max_x-min_x)*10
    N=X.shape[0]#样本数量
    # print(X)
    
    
    # # 每次随机一样
    
    # In[4]:
    
    np.random.seed(98046)
    
    
    # # 随机洗牌数据
    
    # In[5]:
    
    shuffle_para=np.arange(Y.shape[0])
    np.random.shuffle(shuffle_para)
    X,Y=X[shuffle_para],Y[shuffle_para]
    
    
    # # 分类
    
    # In[6]:
    
    cla=[]
    for i in range(c):
        cla.append(np.where(Y==i))
    
    
    # # 初始点
    
    # In[7]:
    
    randp=np.random.randint(0,N,(3,))
    print(randp)
    
    
    # In[8]:
    
    # 避免分母为0
    initial_point=np.array(X[randp])+np.random.rand(3,4)
    print(initial_point)
    
    
    # In[9]:
    
    print(X.shape)
    
    
    # # 开始迭代
    
    # In[10]:
    
    last_point=0
    mean_point=copy.deepcopy(initial_point)
    u=np.ones((c,N))
    accu=[]
    J_list=[]
    n=0
    while True:
        
        # 更新隶属度函数
        u_denominator=0
        for t in range(c):
            u_denominator+=np.sum(1/np.linalg.norm(X-mean_point[t],axis=1)**2)
        for i in range(len(X)):
            for j in range(c):
                u_numerator=N*1/pow(np.linalg.norm(X[i]-mean_point[j]),2)
                u[j,i]=u_numerator/u_denominator
        # u=np.fmax(u, np.finfo(np.float32).eps)
        # 保存上次点
        last_point=copy.deepcopy(mean_point)
        # 更新聚类中心
        for j in range(c):
            mean_point[j]=np.dot(pow(u[j],b),X)/sum(pow(u[j],b))
            
        
        # 损失函数
        J=0
        for j in range(c):
            J+=np.dot(u[j],np.linalg.norm(X-mean_point[j],axis=1,keepdims=True)**2)
        J_list.append(J)
        
        # 看把原始数据的每一类还保留多少个为一类
        # 最大隶属度类
        y=np.argmax(u,axis=0)
        corr=0
        for cl in cla:
            corr+=(max(np.bincount(y[cl])))
        accu.append(corr/Y.shape[0])
        if(n%1==0):
            print('interation:',n,'J:',J,'accu:',accu[-1])
        n += 1
        # 评价函数收敛法
        if (J<1e-3):
            print('评价准则收敛')
            break
        # 均值点相近收敛法
        delta=np.linalg.norm(last_point-mean_point,axis=1)
        # 每一个都是<0.01
        if False not in list(delta<0.001):
            break
            pass
        # 次退出
        if(n==100):
            print('到达最大迭代次数')
            break
        pass
    
    
    # # 画图
    
    # In[11]:
    
    # 准确率
    plt.ylim([0.6,1])
    plt.xticks(list(range(n)), rotation=20)
    plt.xlabel('Interations')
    plt.ylabel('Accuracy')
    plt.plot(np.arange(n),accu)
    plt.show()
    
    # In[16]:
    
    # 损失函数
    plt.xticks(list(range(n)), rotation=20)
    plt.xlabel('Interations')
    plt.ylabel('Judge')
    plt.plot(np.arange(n),J_list)
    plt.show()
    
    # In[12]:
    
    mean_point
    
    
    # In[76]:
    
    label=(('Sepal length','Sepal width'),('Petal length','Petal width'))
    def scat(i):
        plt.scatter(X[:, i*2], X[:,2*(i+1)-1], c=y,marker='+')
        plt.scatter(mean_point[:,i*2],mean_point[:,(i+1)*2-1],c=np.arange(c),marker='o')
        plt.xlabel(label[i][0])
        plt.ylabel(label[i][1])
    
    scat(0)
    plt.show()
    
    # In[77]:
    
    scat(1)
    plt.show()
    
    # In[ ]:
    
    '''
    # 改进的
        # 更新隶属度函数
        u_denominator=0
        for t in range(c):
            u_denominator+=np.sum(1/np.linalg.norm(X-mean_point[t],axis=1)**2)
        for i in range(len(X)):
            for j in range(c):
                u_numerator=N*1/pow(np.linalg.norm(X[i]-mean_point[j]),2)
    #             print(N*1/pow(np.linalg.norm(X[i]-mean_point[j]),2))
                u[j,i]=u_numerator/u_denominator
    '''
    
    
    # In[ ]:
    
    '''
    
    # 普通的
        # 更新隶属度函数
        for i in range(len(X)):
            u_denominator=np.sum(1/np.linalg.norm(X[i]-mean_point[t],axis=1)**2)
            for j in range(c):
                u_numerator=1/pow(np.linalg.norm(X[i]-mean_point[j]),2)
    #             print(N*1/pow(np.linalg.norm(X[i]-mean_point[j]),2))
                u[j,i]=u_numerator/u_denominator
    '''
    
    

    相关文章

      网友评论

          本文标题:FCM模糊C均值(模式识别5(补充3))

          本文链接:https://www.haomeiwen.com/subject/ytmuoxtx.html