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

FCM模糊C均值(模式识别5(补充3))_第1张图片
FCM-1.png
FCM模糊C均值(模式识别5(补充3))_第2张图片
FCM-2.png
FCM模糊C均值(模式识别5(补充3))_第3张图片
FCM-3.png
FCM模糊C均值(模式识别5(补充3))_第4张图片
FCM-4.png
FCM模糊C均值(模式识别5(补充3))_第5张图片
FCM-5.png
FCM模糊C均值(模式识别5(补充3))_第6张图片
FCM-6.png
FCM模糊C均值(模式识别5(补充3))_第7张图片
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)))