目录
一、无监督学习
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)