Kmeans模型之间的比较

https://blog.csdn.net/yiyue21/article/details/90240473
上面是参考文献


使用库:
matplotlib、sklearn、mpl_toolkits、pandas、numpy

实现功能:
对Kmeans的模型差异三维化比较,差异性数据加载到Excel,任选3个维度投射到三维空间

数据集:
【test4.xlsx】:数据集中的TRUE VALUE一列为实际类别信息

参数调节:
clusters:即我们的k值,和KMeans类的n_clusters意义一样。
model1:模型,具体调参参照Kmeans的调参
model2:同上
newphoto:
True 降维之后的三维显示
False 抽维度显示(可以使用W1_,W2_,W3_)

draw3D函数调参:
X1:数据集(不含实际分类标签)
layout:布局,223,代表划分成2*2,子图3
title:主题,图片名
c:色彩或颜色序列
s:点的大小
alpha:阿尔法通道(默认None)
cmap:Colormap(默认None)
core:
默认(None)画原始图
core == True 绘制聚类中心点
core == False 绘制差异点
core_cluster_centers:默认(None),聚类中心点
W1_:默认0 抽维度的时候可以修改
W2_:默认1,抽维度的时候可以修改
W3_:默认2,抽维度的时候可以修改

需要做的进一步工作:
对其他聚类方法进行补充和融合

注意:
本文件在.py运行后,可以详细使用三维图,在Jupyter Notebook中使用,反而失去了三维性
cm是聚类点的颜色,较为浅色,默认只有6种颜色,可以根据自己的需要加
cm2是聚类中心点的颜色,较重,默认只有6种颜色,可以根据自己的需要加
newphoto:决定显示降维之后的三维图还是抽维度单位图,我目前没办法统一两个实现,否则同时出现会让第二张图出问题
#Excel中True代表两个模型预测的是相同的,False代表不相同


导入库

import matplotlib.pyplot as plt
import matplotlib as mpl
from sklearn.cluster import KMeans
from sklearn.metrics.pairwise import pairwise_distances_argmin
from mpl_toolkits.mplot3d import Axes3D
from sklearn.decomposition import PCA
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

设置属性防止中文乱码

mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False

读取数据集和分开标签和特征

#读取数据集
df = pd.read_excel('E:/A/工作/聚类/聚类算法包ver3.0/聚类算法包/DBSCAN/test4.xlsx')
# 将真实的分类标签与特征分开
X = df.drop(['TRUE VALUE'], axis=1)
Y = df['TRUE VALUE']
labels = list(X.columns.values)
NX = np.array(X)

降维处理

#降维处理
pca3 = PCA(n_components = 3)
X = pca3.fit_transform(X)

构建两个模型

clusters = 3
###################################################################################
#构建model1算法
model1 = "Kmeans(kmeans++) K="+str(clusters)+" "
k_means1 = KMeans(init='k-means++', n_clusters=clusters, random_state=28)
k_means1.fit(X)  #训练模型
#构建model2算法
###################################################################################
model2 = "Kmeans(random) K="+str(clusters)+" "
k_means2 = KMeans(init='random', n_clusters=clusters, random_state=28)
k_means2.fit(X)
###################################################################################

预测和聚类中心绑定(借鉴大佬的)

#预测结果
km1_y_hat = k_means1.predict(X)
km2_y_hat = k_means2.predict(X)

print("###################################################################################")
##获取聚类中心点并聚类中心点进行排序
k_means_cluster_centers1 = k_means1.cluster_centers_
k_means_cluster_centers2 = k_means2.cluster_centers_
print (model1+"算法聚类中心点:\ncenter=", k_means_cluster_centers1)
print("###################################################################################")
print (model2+"算法聚类中心点:\ncenter=", k_means_cluster_centers2)
#使用欧几里得距离,返回的是X距离Y最近点的index,所以形状与X的形状一致。过程:挨个查找X列表中的点,返回该点距离最近Y点的index
#这样避免给同一种结果在两种模型是不同的标签
order = pairwise_distances_argmin(X=k_means_cluster_centers1,Y=k_means_cluster_centers2)
print("###################################################################################")

画图函数的构建

## 画图

fig = plt.figure(figsize=(14, 8), facecolor='w')
plt.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.9)
#点数多的时候,可以增加多种颜色,上面浅一点,下面重一点的颜色
cm = mpl.colors.ListedColormap(['#FFC2CC', '#C2FFCC', '#CCC2FF','#B0E0E6','#7FFFAA','#FFD700','#F0D700'])
cm2 = mpl.colors.ListedColormap(['#FF0000', '#00FF00', '#0000FF','#5F9EA0','#00FF7F','#DAA520','#FDD700'])

#plt.subplots_adjust(left=0.05, right=0.95, bottom=0.05, top=0.9)
def draw3D(X1,layout,title,c,s,W1=0,W2=1,W3=2,alpha=None,cmap=None,core=None,core_cluster_centers=None):
    ax = fig.add_subplot(layout, projection='3d')
    ax.scatter(X1[:, W1], X1[:, W2], X1[:, W3], alpha=alpha, c=c,s=s,cmap=cmap)  # 生成散点.利用c控制颜色序列,s控制大小
    if core == True:
        ax.scatter(core_cluster_centers[:, W1], core_cluster_centers[:, W2], core_cluster_centers[:, W3], c=range(clusters), s=60, cmap=cm2, edgecolors='none')
    if core == False:
        ax.scatter(X1[different, W1], X1[different, W2], X1[different, W3], c="#FF0000", s=15,edgecolors='none',marker="*")
    plt.title(title)
    ax.set_xlabel('X')
    ax.set_ylabel('Y')
    ax.set_zlabel('Z')
    plt.grid(True)

后续代码

print("#####################################################")
# 获取两种算法预测不一致的样本数目
different = list(map(lambda x:  x==-1,km2_y_hat))
print(len(different))
print("#####################################################")
for k in range(clusters):
    different += ((km1_y_hat == k) != (km2_y_hat == order[k]))
print(len(different))
identic = np.logical_not(different)
different_nodes = len(list(filter(lambda x:x, different)))
notdifferent = (1-different).astype(np.bool)
print("#####################################################")
###################################################################################
newphoto = True

#降维之后的显示
if newphoto==True:
    draw3D(X, 221, u'原始数据分布图', c=Y, s=6, cmap=cm)
    draw3D(X, 222, u'' + model1+ str(clusters), c=km1_y_hat, s=6, cmap=cm, core=True,
           core_cluster_centers=k_means_cluster_centers1)
    draw3D(X, 223, u'' + model2 + str(clusters), c=km2_y_hat, s=6, cmap=cm, core=True,
           core_cluster_centers=k_means_cluster_centers2)
    draw3D(X, 224,  u'' + model1 + model2 + '预测不一致的点数:' + str(different_nodes), c="#000000", alpha=0.1, s=6,
           cmap=cm, core=False)
    plt.show()
###################################################################################
else:
# 抽维度之后的显示
    W1_ = 4
    W2_ = 5
    W3_ = 7

    if(W1_==W2_ or W2_==W3_ or W1_==W3_):
        raise Exception(print(u'维度存在相同的'))
    if(W1_ >= len(labels) or W2_ >= len(labels) or W3_ >= len(labels)):
        raise Exception(print(u'超出范围'+" 最大是: "+len(labels)))

    draw3D(NX, 221, u'原始数据分布图抽维度' + "维度1:" + labels[W1_] + "维度2:" + labels[W2_] + "维度3:" + labels[W3_], c=Y, s=6,
           cmap=cm, W1=W1_, W2=W2_, W3=W3_)
    draw3D(NX, 222, u'' + model1 + "维度1:" + labels[W1_] + "维度2:" + labels[W2_] + "维度3:" + labels[W3_], c=km1_y_hat, s=6,
           cmap=cm, W1=W1_, W2=W2_, W3=W3_)
    draw3D(NX, 223, u'' + model2 + "维度1:" + labels[W1_] + "维度2:" + labels[W2_] + "维度3:" + labels[W3_], c=km2_y_hat, s=6,
           cmap=cm, W1=W1_, W2=W2_, W3=W3_)
    draw3D(NX, 224, u'' + model1 + model2 + labels[W1_] + " " + labels[W2_] + " " + labels[W3_] + '预测不一致的点数:' + str(
        different_nodes), c="#000000", alpha=0.1, s=6, cmap=cm, core=False, W1=W1_, W2=W2_, W3=W3_)
    plt.show()
###################################################################################

#将聚类的结果写入原始表格中
#True代表两个模型预测的是相同的,False代表不相同
def to_excel(title):
    df['model1'] = km1_y_hat
    df['model2'] = km2_y_hat
    df['is_different'] = notdifferent
    df.to_excel(title)
to_excel('result.xlsx')

结果
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码地址

调参是指为了得到更好的聚类结果,调整算法中的参数。对于K-means聚类算法的调参,有几个重要的参数需要我们关注。 1. 聚类中心的个数k:我们需要确定要将样本划分成多少个簇,即确定聚类中心的个数。选择一个合适的k值对于聚类结果的好坏非常重要,通常需要通过实验和经验来确定。 2. 初始化聚类中心的方法:K-means聚类算法需要随机初始化k个数据点作为聚类中心。不同的初始化方法会导致不同的最终聚类结果。通过多次随机初始化,选择代价函数最小的作为最终的聚类中心。 3. 距离度量方法:k均值算法中采用的是最小化同一个簇里面样本到簇中心的距离。常用的距离度量方法有欧氏距离、曼哈顿距离等。根据不同的问题选择合适的距离度量方法。 4. 停止条件:K-means聚类算法的停止条件是聚类中心不再变化或者变化很小。可以设置一个阈值来判断聚类中心是否变化足够小。 5. 迭代次数:确定算法迭代的次数。可以设置一个最大迭代次数,避免算法无限循环。 调参的目标是找到一组参数,使得聚类结果更加准确和稳定。根据实际问题和数据集的特点,可以通过实验和经验来选择最佳的参数组合。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [K-means聚类算法-----------机器学习](https://blog.csdn.net/kidchildcsdn/article/details/104873391)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值