数据挖掘 聚类度量

格式化之前的代码:

import numpy as np#计算
import pandas as pd#处理结构化表格
import matplotlib.pyplot as plt#绘制图表和可视化数据的函数,通常与numpy和pandas一起使用。
from sklearn import metrics#聚类算法的评估指标。
from sklearn.cluster import KMeans#K均值聚类算法
from hopkins_test import hopkins_statistic
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号


data = pd.read_csv('city.txt')#读数据

########################检测是否有类结构#####################

# h_value = hopkins_statistic(data.values)  评估数据集的聚类倾向性,越接近于 0.5 表示数据集具有良好的聚类倾向性,越接近于 1 表示数据集的聚类倾向性较差。


########################判定是否有最优簇数目#####################

SSE = []
for i in range(1, 11):  # k取1-10,计算簇内误差平方和
    model = KMeans(n_clusters=i)#创建一个 KMeans 对象 model,使用当前的簇数量 i 初始化该对象
    model.fit(data)#对数据集 data 进行拟合和聚类。
    SSE.append(model.inertia_)#获取当前模型的簇内误差平方和,并将其添加到 SSE 列表中。
plt.plot(range(1, 11), SSE, marker='.')#plt.plot() 函数绘制折线图,横坐标为簇数量(1-10),纵坐标为簇内误差平方和(SSE)。
plt.xticks(ticks= range(1, 11))#设置横坐标刻度为 1-10
plt.xlabel('k值',)
plt.ylabel('簇内误差平方和SSE')
plt.show()

########################确定最优簇数目#####################
opt = 0
for k in [5,6]:#遍历簇数量列表 [5, 6]
    kmeans_model = KMeans(n_clusters=k, random_state=1).fit(data)#创建一个 KMeans 对象 kmeans_model,使用当前的簇数量 k 和随机种子 random_state=1 初始化该对象,对数据集 data 进行拟合和聚类
    labels = kmeans_model.labels_#获取每个样本所属的簇标签
    value = metrics.silhouette_score(data, labels, metric='euclidean')#计算当前聚类结果的轮廓系数,其中指定使用欧氏距离作为度量方式。
    print(value)#打印输出当前轮廓系数的值
    if value >= opt:#如果当前轮廓系数大于等于 opt 变量的值,则更新 opt、opt_k 和 opt_labels 分别为当前轮廓系数、簇数量 k 和对应的簇标签。
        opt = value#opt 存储了最佳轮廓系数的值,opt_k 存储了具有最佳轮廓系数的簇数量,opt_labels 存储了对应的簇标签。
        opt_k = k
        opt_labels = labels



########################聚类结果显示#####################

colors = ['r', 'c', 'b', 'y', 'g']#创建一个颜色列表 colors,用于指定每个簇的颜色。
plt.figure()#创建一个新的图形窗口
for j in range(5):#遍历簇标签的取值范围(0-4)
    index_set = np.where(opt_labels == j)#获取属于当前簇标签的样本的索引集合。
    cluster = data.iloc[index_set]#使用这些索引从数据集 data 中提取属于当前簇的样本,并赋值给变量 cluster
    plt.scatter(cluster.iloc[:, 0], cluster.iloc[:, 1], c=colors[j], marker='.')#绘制当前簇的样本点,横坐标为 cluster 的第一列,纵坐标为 cluster 的第二列,颜色为 colors[j],标记为小圆点 '.'。

plt.show()

格式化之后的代码:

import numpy as np  # 计算
import pandas as pd  # 处理结构化表格
import matplotlib.pyplot as plt  # 绘制图表和可视化数据的函数,通常与numpy和pandas一起使用。
from sklearn import metrics  # 聚类算法的评估指标。
from sklearn.cluster import KMeans  # K均值聚类算法
from hopkins_test import hopkins_statistic

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

data = pd.read_csv('city.txt')  # 读数据

########################检测是否有类结构#####################

# h_value = hopkins_statistic(data.values)  评估数据集的聚类倾向性,越接近于 0.5 表示数据集具有良好的聚类倾向性,越接近于 1 表示数据集的聚类倾向性较差。


########################判定是否有最优簇数目#####################

SSE = []
for i in range(1, 11):  # k取1-10,计算簇内误差平方和
    model = KMeans(n_clusters=i)  # 创建一个 KMeans 对象 model,使用当前的簇数量 i 初始化该对象
    model.fit(data)  # 对数据集 data 进行拟合和聚类。
    SSE.append(model.inertia_)  # 获取当前模型的簇内误差平方和,并将其添加到 SSE 列表中。
plt.plot(range(1, 11), SSE, marker='.')  # plt.plot() 函数绘制折线图,横坐标为簇数量(1-10),纵坐标为簇内误差平方和(SSE)。
plt.xticks(ticks=range(1, 11))  # 设置横坐标刻度为 1-10
plt.xlabel('k值', )
plt.ylabel('簇内误差平方和SSE')
plt.show()

########################确定最优簇数目#####################
opt = 0
for k in [5, 6]:  # 遍历簇数量列表 [5, 6]
    kmeans_model = KMeans(n_clusters=k, random_state=1).fit(
        data)  # 创建一个 KMeans 对象 kmeans_model,使用当前的簇数量 k 和随机种子 random_state=1 初始化该对象,对数据集 data 进行拟合和聚类
    labels = kmeans_model.labels_  # 获取每个样本所属的簇标签
    value = metrics.silhouette_score(data, labels, metric='euclidean')  # 计算当前聚类结果的轮廓系数,其中指定使用欧氏距离作为度量方式。
    print(value)  # 打印输出当前轮廓系数的值
    if value >= opt:  # 如果当前轮廓系数大于等于 opt 变量的值,则更新 opt、opt_k 和 opt_labels 分别为当前轮廓系数、簇数量 k 和对应的簇标签。
        opt = value  # opt 存储了最佳轮廓系数的值,opt_k 存储了具有最佳轮廓系数的簇数量,opt_labels 存储了对应的簇标签。
        opt_k = k
        opt_labels = labels

########################聚类结果显示#####################

colors = ['r', 'c', 'b', 'y', 'g']  # 创建一个颜色列表 colors,用于指定每个簇的颜色。
plt.figure()  # 创建一个新的图形窗口
for j in range(5):  # 遍历簇标签的取值范围(0-4)
    index_set = np.where(opt_labels == j)  # 获取属于当前簇标签的样本的索引集合。
    cluster = data.iloc[index_set]  # 使用这些索引从数据集 data 中提取属于当前簇的样本,并赋值给变量 cluster
    plt.scatter(cluster.iloc[:, 0], cluster.iloc[:, 1], c=colors[j],
                marker='.')  # 绘制当前簇的样本点,横坐标为 cluster 的第一列,纵坐标为 cluster 的第二列,颜色为 colors[j],标记为小圆点 '.'。

plt.show()

霍普金斯统计代码
格式化之前:

你可能感兴趣的:(数据挖掘,聚类,人工智能)