格式化之前的代码:
python
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()
格式化之后的代码:
python
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()
霍普金斯统计代码
格式化之前:
python
import numpy as np#计算
from sklearn.neighbors import NearestNeighbors#最近邻搜索的算法实现,可用于在数据集中查找最接近给定样本的邻居。
from sklearn.datasets import load_iris#load_iris函数是一个用于加载鸢尾花数据集的辅助函数
import pandas as pd#数据分析
from random import sample#随机抽样和洗牌操作
from numpy.random import uniform#均匀分布的随机数
def hopkins_statistic(X):#输入参数X是一个二维数组,表示原始数据集
sample_size = int(X.shape[0]*0.05) #0.05 (5%) based on paper by Lawson and Jures #计算样本大小,占原始数据集大小的5%。这个样本将用于生成均匀随机样本。
#原始数据空间的均匀随机样本
X_uniform_random_sample = uniform(X.min(axis=0), X.max(axis=0) ,(sample_size , X.shape[1]))#X.min(axis=0)和X.max(axis=0)会计算原始数据集X每一列的最小值和最大值。这将返回一个包含每列最小值的一维数组和一个包含每列最大值的一维数组uniform函数将使用这些最小值和最大值来指定随机样本的取值范围。指定了生成的随机样本的形状,即一个元组(sample_size, X.shape[1]),其中sample_size表示样本大小,X.shape[1]表示每个样本的特征数。
#从原始数据中随机抽取一个样本
random_indices=sample(range(0, X.shape[0], 1), sample_size)#从原始数据集X中随机选择一个子集。具体而言,range(0, X.shape[0], 1)将返回一个从0到X.shape[0]的整数序列,步长为1。sample函数将从该序列中随机选择sample_size个不重复的整数,这些整数将用于从X中抽取对应的样本。
X_sample = X[random_indices]#根据随机选择的索引从原始数据集中抽取一部分样本
#初始化无监督学习器以实现NN搜索
neigh = NearestNeighbors(n_neighbors=2)#NearestNeighbors是一个用于寻找最近邻的非监督学习算法。在这里,n_neighbors=2参数指定了要查找的最近邻的数量,即每个样本要找到的最近的两个邻居。
nbrs=neigh.fit(X)
#u_distances = 均匀随机样本的最近邻距离
u_distances , u_indices = nbrs.kneighbors(X_uniform_random_sample , n_neighbors=2)#计算均匀随机样本X_uniform_random_sample在原始数据集X中的最近邻距离,并返回距离和对应的索引。这里将返回每个均匀随机样本的两个最近邻距离,其中第一个最近邻是样本本身,距离为0,因此只保留第二个最近邻的距离。
u_distances = u_distances[: , 0] #到第一个最近邻居的距离#仅保留到第一个最近邻的距离
#w_distances = 来自原始数据X的点样本的最近邻距离
w_distances , w_indices = nbrs.kneighbors(X_sample , n_neighbors=2)#计算从原始数据集中抽取的样本X_sample的最近邻距离,并返回距离和对应的索引。同样,只保留第二个最近邻的距离。
#到第二个最近邻居的距离(因为第一个邻居将是点本身,距离= 0)
w_distances = w_distances[: , 1]#仅保留到第二个最近邻的距离
u_sum = np.sum(u_distances)#计算均匀随机样本的最近邻距离之和
w_sum = np.sum(w_distances)#计算来自原始数据集的样本的最近邻距离之和
#计算并返回霍普金斯统计数据
H = u_sum/ (u_sum + w_sum)#计算霍普金斯统计数据
return H#返回计算得到的霍普金斯统计量
if __name__=="__main__":#if __name__=="__main__":是一个条件语句,它判断当前脚本是否作为主程序直接运行。只有当脚本作为主程序运行时,才会执行if语句块中的代码。
iris=load_iris().data#iris = load_iris().data加载了一个名为iris的数据集,数据集是鸢尾花数据集。.data属性返回数据集的特征部分。
h_value=hopkins_statistic(iris)#h_value = hopkins_statistic(iris)调用了名为hopkins_statistic的函数,计算了数据集的Hopkins统计量,并将结果赋值给变量h_value。
格式化之后的代码:
python
import numpy as np # 计算
from sklearn.neighbors import NearestNeighbors # 最近邻搜索的算法实现,可用于在数据集中查找最接近给定样本的邻居。
from sklearn.datasets import load_iris # load_iris函数是一个用于加载鸢尾花数据集的辅助函数
import pandas as pd # 数据分析
from random import sample # 随机抽样和洗牌操作
from numpy.random import uniform # 均匀分布的随机数
def hopkins_statistic(X): # 输入参数X是一个二维数组,表示原始数据集
sample_size = int(
X.shape[0] * 0.05) # 0.05 (5%) based on paper by Lawson and Jures #计算样本大小,占原始数据集大小的5%。这个样本将用于生成均匀随机样本。
# 原始数据空间的均匀随机样本
X_uniform_random_sample = uniform(X.min(axis=0), X.max(axis=0), (sample_size, X.shape[
1])) # X.min(axis=0)和X.max(axis=0)会计算原始数据集X每一列的最小值和最大值。这将返回一个包含每列最小值的一维数组和一个包含每列最大值的一维数组uniform函数将使用这些最小值和最大值来指定随机样本的取值范围。指定了生成的随机样本的形状,即一个元组(sample_size, X.shape[1]),其中sample_size表示样本大小,X.shape[1]表示每个样本的特征数。
# 从原始数据中随机抽取一个样本
random_indices = sample(range(0, X.shape[0], 1),
sample_size) # 从原始数据集X中随机选择一个子集。具体而言,range(0, X.shape[0], 1)将返回一个从0到X.shape[0]的整数序列,步长为1。sample函数将从该序列中随机选择sample_size个不重复的整数,这些整数将用于从X中抽取对应的样本。
X_sample = X[random_indices] # 根据随机选择的索引从原始数据集中抽取一部分样本
# 初始化无监督学习器以实现NN搜索
neigh = NearestNeighbors(
n_neighbors=2) # NearestNeighbors是一个用于寻找最近邻的非监督学习算法。在这里,n_neighbors=2参数指定了要查找的最近邻的数量,即每个样本要找到的最近的两个邻居。
nbrs = neigh.fit(X)
# u_distances = 均匀随机样本的最近邻距离
u_distances, u_indices = nbrs.kneighbors(X_uniform_random_sample,
n_neighbors=2) # 计算均匀随机样本X_uniform_random_sample在原始数据集X中的最近邻距离,并返回距离和对应的索引。这里将返回每个均匀随机样本的两个最近邻距离,其中第一个最近邻是样本本身,距离为0,因此只保留第二个最近邻的距离。
u_distances = u_distances[:, 0] # 到第一个最近邻居的距离#仅保留到第一个最近邻的距离
# w_distances = 来自原始数据X的点样本的最近邻距离
w_distances, w_indices = nbrs.kneighbors(X_sample,
n_neighbors=2) # 计算从原始数据集中抽取的样本X_sample的最近邻距离,并返回距离和对应的索引。同样,只保留第二个最近邻的距离。
# 到第二个最近邻居的距离(因为第一个邻居将是点本身,距离= 0)
w_distances = w_distances[:, 1] # 仅保留到第二个最近邻的距离
u_sum = np.sum(u_distances) # 计算均匀随机样本的最近邻距离之和
w_sum = np.sum(w_distances) # 计算来自原始数据集的样本的最近邻距离之和
# 计算并返回霍普金斯统计数据
H = u_sum / (u_sum + w_sum) # 计算霍普金斯统计数据
return H # 返回计算得到的霍普金斯统计量
if __name__ == "__main__": # if __name__=="__main__":是一个条件语句,它判断当前脚本是否作为主程序直接运行。只有当脚本作为主程序运行时,才会执行if语句块中的代码。
iris = load_iris().data # iris = load_iris().data加载了一个名为iris的数据集,数据集是鸢尾花数据集。.data属性返回数据集的特征部分。
h_value = hopkins_statistic(
iris) # h_value = hopkins_statistic(iris)调用了名为hopkins_statistic的函数,计算了数据集的Hopkins统计量,并将结果赋值给变量h_value。