机器学习之聚类

KMeansu算法实现聚类(无监督式学习/X)

  1. 模型训练
from sklearn.cluster import KMeans
#创建算法实例;n_clusters=3,将聚类分为3类;random_state=0为了预测结果的重复性,给定初始状态
KM=KMeans(n_clusters=3,random_state=0)
#开始训练
KM.fit(X)
  1. 获取模型确定的中心点
centers=KM.cluster_centers_
  1. 准确率计算
from sklearn.metrics import accuracy_score
#计算准确率
accuracy=accuracy_score(y,y_predict)
  1. 预测结果矫正
#结果矫正
#新建矫正结果集
y_cal=[]
#遍历预测出来的结果集
for i in y_predict:
#如果为0
    if i==0:
    #对应结果为2
       y_cal.append(2)
    elif i==1:
       y_cal.append(1)
    else:
       y_cal.append(0)
print(y_predict,y_cal) 

KNN算法实现聚类(监督式学习/X和y)

  1. 模型训练
#基于正确标签的数据结果
from sklearn.neighbors import KNeighborsClassifier
#创建实例
KNN=KNeighborsClassifier(N_neighbors=3)
#模型训练
KNN.fit(X,y)

Mean-shift算法实现聚类(无监督式学习/X)

  • 自动计算带宽(区域半径)
from sklearn.cluster import MeanShift,estimate_bandwidth
#预测带宽,X为样本数量,n_samples为预测希望采用样本数(sklearn官网文档)
bandwidth=estimate_bandwidth(X,n_samples=500)
  • 模型建立与训练
ms=MeanShift(bandwidth=bandwidth)
ms.fit(X)

(实战)2D数据类别划分

1.采用Kmeans算法实现2D数据自动聚类,预测V1=80,V2=60数据类别;
2.计算预测准确率,完成结果矫正
3. 采用KNN、Meanshift算法,重复步骤1-2

  • 代码
#加载数据
import pandas as pd
import numpy as np
data=pd.read_csv('data.csv')
data.head()

在这里插入图片描述

#定义X和y
X=data.drop(['labels'],axis=1)
y=data.loc[:,'labels']
y.head()

在这里插入图片描述

pd.value_counts(y)

在这里插入图片描述

#展示数据
%matplotlib inline
from matplotlib import pyplot as plt
fig1=plt.figure()
plt.scatter(X.loc[:,'V1'],X.loc[:,'V2'])
plt.title("un-labled data")
plt.xlabel('V1')
plt.ylabel('v2')
plt.show()

在这里插入图片描述

#分类数据展示
fig1=plt.figure()
label0=plt.scatter(X.loc[:,'V1'][y==0],X.loc[:,'V2'][y==0])
label1=plt.scatter(X.loc[:,'V1'][y==1],X.loc[:,'V2'][y==1])
label2=plt.scatter(X.loc[:,'V1'][y==2],X.loc[:,'V2'][y==2])
plt.title("labled data")
plt.xlabel('V1')
plt.ylabel('v2')
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.show()

在这里插入图片描述

print(X.shape,y.shape)

(3000, 2) (3000,)

#建立模型
from sklearn.cluster import KMeans
KM=KMeans(n_clusters=3,random_state=0)
KM.fit(X)

KMeans(n_clusters=3, random_state=0)

KM.cluster_centers_

array([[ 40.68362784, 59.71589274],
[ 69.92418447, -10.11964119],
[ 9.4780459 , 10.686052 ]])

centers=KM.cluster_centers_
fig3=plt.figure()
plt.scatter(centers[:,0],centers[:,1])
plt.show()

在这里插入图片描述

centers=KM.cluster_centers_
fig3=plt.figure()
label0=plt.scatter(X.loc[:,'V1'][y==0],X.loc[:,'V2'][y==0])
label1=plt.scatter(X.loc[:,'V1'][y==1],X.loc[:,'V2'][y==1])
label2=plt.scatter(X.loc[:,'V1'][y==2],X.loc[:,'V2'][y==2])
plt.title("labled data")
plt.xlabel('V1')
plt.ylabel('v2')
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.scatter(centers[:,0],centers[:,1])
plt.show()

在这里插入图片描述

#测试数据V1=80,V2=60
y_predict_test=KM.predict([[80,60]])
print(y_predict_test)

[0]

#基于训练模型的预测
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)

在这里插入图片描述

#可视化数据和结果
#一行两列在第一行画
fig4=plt.subplot(121)
label0=plt.scatter(X.loc[:,'V1'][y_predict==0],X.loc[:,'V2'][y_predict==0])
label1=plt.scatter(X.loc[:,'V1'][y_predict==1],X.loc[:,'V2'][y_predict==1])
label2=plt.scatter(X.loc[:,'V1'][y_predict==2],X.loc[:,'V2'][y_predict==2])
plt.title("predicted data")
plt.xlabel('V1')
plt.ylabel('v2')
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.scatter(centers[:,0],centers[:,1])

fig5=plt.subplot(122)
label0=plt.scatter(X.loc[:,'V1'][y==0],X.loc[:,'V2'][y==0])
label1=plt.scatter(X.loc[:,'V1'][y==1],X.loc[:,'V2'][y==1])
label2=plt.scatter(X.loc[:,'V1'][y==2],X.loc[:,'V2'][y==2])
plt.title("labled data")
plt.xlabel('V1')
plt.ylabel('v2')
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.scatter(centers[:,0],centers[:,1])

plt.show()

在这里插入图片描述

#结果矫正
y_corrected=[]
#遍历预测出来的结果集
for i in y_predict:
#如果为0
    if i==0:
        y_corrected.append(2)
    elif i==1:
        y_corrected.append(1)
    else:
        y_corrected.append(0)
print(pd.value_counts(y_corrected),pd.value_counts(y))

在这里插入图片描述

y_corrected=np.array(y_corrected)
print(type(y_corrected))

在这里插入图片描述

#转换格式
y_corrected=np.array(y_corrected)
fig6=plt.subplot(121)
label0=plt.scatter(X.loc[:,'V1'][y_corrected==0],X.loc[:,'V2'][y_corrected==0])
label1=plt.scatter(X.loc[:,'V1'][y_corrected==1],X.loc[:,'V2'][y_corrected==1])
label2=plt.scatter(X.loc[:,'V1'][y_corrected==2],X.loc[:,'V2'][y_corrected==2])
plt.title("corrected data")
plt.xlabel('V1')
plt.ylabel('v2')
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.scatter(centers[:,0],centers[:,1])

fig7=plt.subplot(122)
label0=plt.scatter(X.loc[:,'V1'][y==0],X.loc[:,'V2'][y==0])
label1=plt.scatter(X.loc[:,'V1'][y==1],X.loc[:,'V2'][y==1])
label2=plt.scatter(X.loc[:,'V1'][y==2],X.loc[:,'V2'][y==2])
plt.title("labled data")
plt.xlabel('V1')
plt.ylabel('v2')
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.scatter(centers[:,0],centers[:,1])

plt.show()

在这里插入图片描述

#建立KNN模型
from sklearn.neighbors import KNeighborsClassifier
KNN=KNeighborsClassifier(n_neighbors=3)
KNN.fit(X,y)

在这里插入图片描述

#预测V1=80,V2=60
y_predict_knn_test=KNN.predict([[80,60]])
y_predict_knn=KNN.predict(X)
print(y_predict_knn_test)
print('knn accuracy:',accuracy_score(y,y_predict_knn))
```![在这里插入图片描述](https://img-blog.csdnimg.cn/20200830164630650.jpg#pic_center)

```python
print(pd.value_counts(y_predict_knn),pd.value_counts(y))

在这里插入图片描述

fig6=plt.subplot(121)
label0=plt.scatter(X.loc[:,'V1'][y_predict_knn==0],X.loc[:,'V2'][y_predict_knn==0])
label1=plt.scatter(X.loc[:,'V1'][y_predict_knn==1],X.loc[:,'V2'][y_predict_knn==1])
label2=plt.scatter(X.loc[:,'V1'][y_predict_knn==2],X.loc[:,'V2'][y_predict_knn==2])
plt.title("knn results")
plt.xlabel('V1')
plt.ylabel('v2')
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.scatter(centers[:,0],centers[:,1])

fig7=plt.subplot(122)
label0=plt.scatter(X.loc[:,'V1'][y==0],X.loc[:,'V2'][y==0])
label1=plt.scatter(X.loc[:,'V1'][y==1],X.loc[:,'V2'][y==1])
label2=plt.scatter(X.loc[:,'V1'][y==2],X.loc[:,'V2'][y==2])
plt.title("labled data")
plt.xlabel('V1')
plt.ylabel('v2')
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.scatter(centers[:,0],centers[:,1])

plt.show()

在这里插入图片描述

#meanshift模型
from sklearn.cluster import MeanShift,estimate_bandwidth
#得到半径
bw=estimate_bandwidth(X,n_samples=500)
print(bw)

在这里插入图片描述

#建立模型
ms=MeanShift(bandwidth=bw)
ms.fit(X)

在这里插入图片描述

y_predict_ms=ms.predict(X)
print(pd.value_counts(y_predict_ms),pd.value_counts(y))

在这里插入图片描述

fig6=plt.subplot(121)
label0=plt.scatter(X.loc[:,'V1'][y_predict_ms==0],X.loc[:,'V2'][y_predict_ms==0])
label1=plt.scatter(X.loc[:,'V1'][y_predict_ms==1],X.loc[:,'V2'][y_predict_ms==1])
label2=plt.scatter(X.loc[:,'V1'][y_predict_ms==2],X.loc[:,'V2'][y_predict_ms==2])
plt.title("ms results")
plt.xlabel('V1')
plt.ylabel('v2')
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.scatter(centers[:,0],centers[:,1])

fig7=plt.subplot(122)
label0=plt.scatter(X.loc[:,'V1'][y==0],X.loc[:,'V2'][y==0])
label1=plt.scatter(X.loc[:,'V1'][y==1],X.loc[:,'V2'][y==1])
label2=plt.scatter(X.loc[:,'V1'][y==2],X.loc[:,'V2'][y==2])
plt.title("labled data")
plt.xlabel('V1')
plt.ylabel('v2')
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.scatter(centers[:,0],centers[:,1])

plt.show()

在这里插入图片描述

#结果矫正
y_corrected_ms=[]
#遍历预测出来的结果集
for i in y_predict:
#如果为0
    if i==0:
        y_corrected_ms.append(2)
    elif i==1:
        y_corrected_ms.append(1)
    else:
        y_corrected_ms.append(0)
print(pd.value_counts(y_corrected_ms),pd.value_counts(y))

在这里插入图片描述

#数据格式转换为numpy数组
y_corrected_ms=np.array(y_corrected_ms)
print(type(y_corrected_ms))

在这里插入图片描述

fig6=plt.subplot(121)
label0=plt.scatter(X.loc[:,'V1'][y_corrected_ms==0],X.loc[:,'V2'][y_corrected_ms==0])
label1=plt.scatter(X.loc[:,'V1'][y_corrected_ms==1],X.loc[:,'V2'][y_corrected_ms==1])
label2=plt.scatter(X.loc[:,'V1'][y_corrected_ms==2],X.loc[:,'V2'][y_corrected_ms==2])
plt.title("ms corrected results")
plt.xlabel('V1')
plt.ylabel('v2')
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.scatter(centers[:,0],centers[:,1])

fig7=plt.subplot(122)
label0=plt.scatter(X.loc[:,'V1'][y==0],X.loc[:,'V2'][y==0])
label1=plt.scatter(X.loc[:,'V1'][y==1],X.loc[:,'V2'][y==1])
label2=plt.scatter(X.loc[:,'V1'][y==2],X.loc[:,'V2'][y==2])
plt.title("labled data")
plt.xlabel('V1')
plt.ylabel('v2')
plt.legend((label0,label1,label2),('label0','label1','label2'))
plt.scatter(centers[:,0],centers[:,1])

plt.show()

在这里插入图片描述

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值