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
'''
网友评论