机器学习——无监督学习与聚类分析

本文介绍了无监督学习的特点与应用,重点讲解了聚类分析中的图像分割和K均值聚类算法(KMeans)。通过实例展示了KMeans在数据聚类和图像分割中的实现,包括模型建立、训练、预测、评估以及结果矫正。同时,对比了KMeans与K近邻分类(KNN)的区别。最后,提供了基于KMeans实现图像分割的步骤,并探讨了不同K值对分割效果的影响。
摘要由CSDN通过智能技术生成

一、无监督学习

1.1定义
  • 机器学习的一种方法,训练数据中不带标签,让机器自动寻找数据规律并完成任务(数据不包括正确的结果)
1.2特点
  • 数据不需要标签
  • 算法不受监督信息(偏见)约束
1.3优点
  • 降低数据采集难度,极大程度扩充样本量
  • 可能发现新的数据规律、被忽略的重要信息
1.4主要运用
  • 聚类分析
  • 关联学习
  • 维度缩减

二、聚类分析

2.1定义
  • 把数据样本按照一定的方法分成不同的组别,这样让在同一个组别中的成员对象都有相似的一些属性
2.2应用场景
  • 目标用户的群体分类
  • 图像切割
  • 基因聚类

三、图像分割

3.1定义

图像分割就是把图像分割成若干个特定的、锯有独特性质的区域的技术,是由图像处理到图像分析的关键步骤

3.2实现最简单方法——灰度阈值分割
  • 灰度阈值分割
    在这里插入图片描述
    在这里插入图片描述

四、k均值聚类算法(Kmeans)

4.1定义
  • 在样本数据空间中选取K个点作为中心,计算每个样本到各中心的距离,根据距离确定数据类别,是聚类算法中最为基础但也是最为重要的算法
  • 中心点会根据类别内样本数据分布进行更新
4.2核心流程
  • 基于要求、观察或经验确定聚类的个数K
  • 确定K个中心
  • 计算样本到各中心点距离
  • 根据距离确定各个样本点所属类别
  • 计算同类样本的中心点,并将其设定为新的中心
  • 重复步骤3-5直到收敛(中心点不再变化)
    在这里插入图片描述
4.3核心公式

在这里插入图片描述

4.4建立、训练、预测模型
from sklearn.cluster import KMeans
KM=KMeans(n_clusters=2,init='random',random_state=0)
KM.fit(X)

#n_clusters=2表示有2个聚类,init='random'随机找中心点,random_state=0随机状态等于0

y_predict=KM.predict(X)
print(pd.value_counts(y_predict),pd.value_counts(y))


4.5画出中心点
centers=KM.cluster_centers_
print(centers)

plt.scatter(centers[:,0],centers[:,1],100,marker='x',label='centers')
#marker='x'以x的方式把它画出来
4.6模型评估

y_predict=KM.predict(X)
print(pd.value_counts(y_predict),pd.value_counts(y))


from sklearn.metrics import accuracy_score
accuracy=accuracy_score(y,y_predict)
print(accuracy)
     
4.7结果矫正
y_corrected=[]
for i in y_predict:
    if i==0:
        y_corrected.append(1)
    elif i==1:
        y_corrected.append(0)
print(y_corrected)
y_correct=np.array(y_correct)

4.8KMeans处理图像步骤
  • 显示图片
  • 记录高和宽
  • 数据变形reshape(-1,3)
  • 训练模型
  • 维度转变
  • 灰度处理
  • 显示图片
4.8均值聚类(KMeans)对比K近邻分类(KNN)

在这里插入图片描述

五、任务

5.1基于数据,建立KMeans模型,实现数据聚类
  • K=2,实现数据聚类,可视化聚类结果、聚类中心
  • 已知第一个样本点X1=82.5,X2=67.9属于类别0,对聚类结果进行矫正
  • 基于数据建立KNN模型,思考其与聚类结果的差异
  • 修改KMeans迭代次数与初始化参数,查看模型迭代过程中的结果变化
# In[]
import numpy as np
import pandas as pd
data=pd.read_csv('Kmeans_data1.csv')
data_result=pd.read_csv('Kmeans_data2.csv')

# In[]
#获取唯一一个有标签的数据点
X_labeled=data.iloc[0,:]        #用坐标取第一行的数据
print(X_labeled)
print(type(X_labeled))

# In[]
y=data_result.loc[:,'y']

X=data.drop(['y'],axis=1)

# In[]
from matplotlib import pyplot as plt
import matplotlib as mplt
font2={'family':'SimHei','weight':'normal'}
fig1=plt.figure()
plt.scatter(X.loc[:,'x1'],X.loc[:,'x2'],label='unlabeled')
plt.scatter(X_labeled['x1'],X_labeled['x2'],label='labeled')
plt.title("原始数据分布",font2)
plt.xlabel('x1',font2)
plt.ylabel('x2',font2)
plt.legend(loc='upper left')
plt.show()




# In[]

fig2=plt.figure()
label0=plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])
label1=plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])
plt.title('实际数据分布',font2)

plt.xlabel('x1')
plt.ylabel('x2')
plt.legend((label0,label1),('label0','label1'),loc='upper left')
plt.show()


# In[]
from sklearn.cluster import KMeans
KM=KMeans(n_clusters=2,init='random',random_state=0)
KM.fit(X)

#n_clusters=2表示有2个聚类,init='random'随机找中心点,random_state=0随机状态等于


# In[]
centers=KM.cluster_centers_
print(centers)


fig3=plt.figure()
plt.scatter(X.loc[:,'x1'],X.loc[:,'x2'],label='unlabeled')
plt.scatter(X_labeled['x1'],X_labeled['x2'],label='labeled')
plt.title("原始数据分布",font2)
plt.xlabel('x1',font2)
plt.ylabel('x2',font2)
plt.legend(loc='upper left')


plt.scatter(centers[:,0],centers[:,1],100,marker='x',label='centers')
#marker='x'以x的方式把它画出来

plt.show()
# In[]
y_predict=KM.predict(X)
print(pd.value_counts(y_predict),pd.value_counts(y))


# In[]
from sklearn.metrics import accuracy_score
accuracy=accuracy_score(y,y_predict)
print(accuracy)
                        

# In[]
fig4=plt.figure()
fig5=plt.subplot(121)
label0=plt.scatter(X.loc[:,'x1'][y_predict==0],X.loc[:,'x2'][y_predict==0],label='label0')
label1=plt.scatter(X.loc[:,'x1'][y_predict==1],X.loc[:,'x2'][y_predict==1],label='lable1')
plt.scatter(X_labeled['x1'],X_labeled['x2'],label='labeled')
plt.legend(loc='upper left')
plt.title("预测数据分布",font2)



plt6=plt.subplot(122)
label0=plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])
label1=plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])
plt.scatter(X_labeled['x1'],X_labeled['x2'],label='labeled')
plt.title("实际数据分布",font2)
plt.xlabel('x1')
plt.ylabel('x2')
plt.legend((label0,label1),('label0','label1'),loc='upper left')
plt.show()



# In[]
print(X_labeled)
print(y_predict[0])



# In[]
#结果矫正
y_corrected=[]
for i in y_predict:
    if i==0:
        y_corrected.append(1)
    elif i==1:
        y_corrected.append(0)
print(y_corrected)






# In[]
#KNN建模
from sklearn.neighbors import KNeighborsClassifier
KNN=KNeighborsClassifier(n_neighbors=3)
KNN.fit(X,y)

# In[]
y_predict_knn=KNN.predict(X)
accuracy=accuracy_score(y,y_predict_knn)
print(accuracy)


# In[]
print(pd.value_counts(y))
print(pd.value_counts(y_predict_knn))





# In[]
fig7=plt.figure(figsize=(16,8))
fig8=plt.subplot(121)
label0=plt.scatter(X.loc[:,'x1'][y_predict_knn==0],X.loc[:,'x2'][y_predict_knn==0],label='label0')
label1=plt.scatter(X.loc[:,'x1'][y_predict_knn==1],X.loc[:,'x2'][y_predict_knn==1],label='lable1')
plt.scatter(X_labeled['x1'],X_labeled['x2'],label='labeled')
plt.legend(loc='upper left')
plt.title("KNN预测数据分布",font2)



plt9=plt.subplot(122)
label0=plt.scatter(X.loc[:,'x1'][y==0],X.loc[:,'x2'][y==0])
label1=plt.scatter(X.loc[:,'x1'][y==1],X.loc[:,'x2'][y==1])
plt.scatter(X_labeled['x1'],X_labeled['x2'],label='labeled')
plt.title("实际数据分布",font2)
plt.xlabel('x1')
plt.ylabel('x2')
plt.legend((label0,label1),('label0','label1'),loc='upper left')
plt.show()

fig7.savefig('test3.png')




# In[]
#KMeans迭代一次结果
KM2=KMeans(n_clusters=2,init='random',random_state=1,n_init=1,max_iter=1)
KM2.fit(X)
centers2=KM2.cluster_centers_
y_predict2=KM2.predict(X)


#n_clusters=2表示有2个聚类,init='random'表示随机取中心点,n_init=1表示只找一次中心点,max_iter=1表示只迭代一次

# In[]
fig8=plt.figure()
label0=plt.scatter(X.loc[:,'x1'][y_predict2==0],X.loc[:,'x2'][y_predict2==0],label='label0')
label1=plt.scatter(X.loc[:,'x1'][y_predict2==1],X.loc[:,'x2'][y_predict2==1],label='lable1')
plt.scatter(centers2[:,0],centers2[:,1],100,marker='x',label='center')
plt.legend(loc='upper left')
plt.show()



# In[]
#逐步迭代查看KMeans模型训练效果
centers=np.array([[0,0,0,0]])
for i in range(1,10):
    KM=KMeans(n_clusters=2,random_state=1,init='random',n_init=1,max_iter=i)
    KM.fit(X)
    
    centers_i=KM.cluster_centers_
    centers_i_temp=centers_i.reshape(1,-1)
    centers=np.concatenate((centers,centers_i_temp),axis=0)
    
    y_predict=KM.predict(X)
    
    fig_i=plt.figure()
    label0=plt.scatter(X.loc[:,'x1'][y_predict==0],X.loc[:,'x2'][y_predict==0],label='label0')
    label1=plt.scatter(X.loc[:,'x1'][y_predict==1],X.loc[:,'x2'][y_predict==1],label='label1')
    plt.scatter(centers_i[:,0],centers_i[:,1],100,marker='X',label='centers')

    plt.title("预测数据",font2)
    plt.legend(loc='upper left')
    
    fig_i.savefig('{}.png'.format(i),dpi=500,bbox_inches='tight')





5.2加载本地图像,建立KMeans模型实现图像分割
  • 实现图像加载、可视化、维度转化,完成数据的预处理
  • K=3建立KMeans模型,实现图像数据聚类;
  • 对聚类结果进行数据处理,展示分割后的图像
  • 尝试其他K值(k=4,8),对比分割效果,并思考导致结果不同的原因
  • 尝试使用新的图片,对其实现图像分割
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

from skimage import io as io

img=io.imread('1.jpg')
plt.imshow(img)


# In[]
#查看数据结构与维度
print(type(img))
print(img.shape)
print(img)


# In[]
#维度存储
img_width=img.shape[1]
img_height=img.shape[0]
print(img_width,img_height)

# In[]
#数据维度转化
img_data=img.reshape(-1,3)
X = img_data




# In[]
#模型建立与训练

from  sklearn.cluster import KMeans
KM=KMeans(n_clusters=3,init='random',random_state=0)
KM.fit(X)

y_predict=KM.predict(X)
print(y_predict)

print(pd.value_counts(y_predict))
# In[]
#结果数据的维度转化
y_predict=y_predict.reshape(img_height,img_width)
print(y_predict)

# In[]
#后续的灰度处理
y_predict=1/(y_predict+1)
print(y_predict)


# In[]
#结果的可视化
plt.imshow(y_predict)

io.imsave('result_k3.png',y_predict)




# In[]
#k=4
from  sklearn.cluster import KMeans
KM=KMeans(n_clusters=4,init='random',random_state=0)
KM.fit(X)

y_predict3=KM.predict(X)
print(y_predict3)

print(pd.value_counts(y_predict3))

y_predict3=y_predict3.reshape(img_height,img_width)
print(y_predict3)


y_predict3=1/(y_predict3+1)
print(y_predict3)

plt.imshow(y_predict3)

io.imsave('result_k8.png',y_predict3)







# In[]
#k=8
from  sklearn.cluster import KMeans
KM=KMeans(n_clusters=8,init='random',random_state=0)
KM.fit(X)

y_predict3=KM.predict(X)
print(y_predict3)

print(pd.value_counts(y_predict3))

y_predict3=y_predict3.reshape(img_height,img_width)
print(y_predict3)


y_predict3=1/(y_predict3+1)
print(y_predict3)

plt.imshow(y_predict3)

io.imsave('result_k4.png',y_predict3)



  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值