ax[i].scatter(centroids[:,0],centroids[:,1],s=120,marker="x",c="black",linewidth=3)
时间: 2023-06-15 21:04:56 浏览: 77
这段代码使用scatter函数在ax[i]上绘制聚类中心点。具体来说,centroids[:,0]和centroids[:,1]分别表示聚类中心点的x坐标和y坐标,s表示点的大小,marker表示点的形状,c表示点的颜色,linewidth表示点的边框宽度。所以这段代码的作用是在ax[i]上绘制聚类中心点,用黑色的叉号标记,并且大小为120,边框宽度为3。
相关问题
代码改进:import numpy as np import pandas as pd import matplotlib as mpl import matplotlib.pyplot as plt from sklearn.datasets import make_blobs def distEclud(arrA,arrB): #欧氏距离 d = arrA - arrB dist = np.sum(np.power(d,2),axis=1) #差的平方的和 return dist def randCent(dataSet,k): #寻找质心 n = dataSet.shape[1] #列数 data_min = dataSet.min() data_max = dataSet.max() #生成k行n列处于data_min到data_max的质心 data_cent = np.random.uniform(data_min,data_max,(k,n)) return data_cent def kMeans(dataSet,k,distMeans = distEclud, createCent = randCent): x,y = make_blobs(centers=100)#生成k质心的数据 x = pd.DataFrame(x) m,n = dataSet.shape centroids = createCent(dataSet,k) #初始化质心,k即为初始化质心的总个数 clusterAssment = np.zeros((m,3)) #初始化容器 clusterAssment[:,0] = np.inf #第一列设置为无穷大 clusterAssment[:,1:3] = -1 #第二列放本次迭代点的簇编号,第三列存放上次迭代点的簇编号 result_set = pd.concat([pd.DataFrame(dataSet), pd.DataFrame(clusterAssment)],axis = 1,ignore_index = True) #将数据进行拼接,横向拼接,即将该容器放在数据集后面 clusterChanged = True while clusterChanged: clusterChanged = False for i in range(m): dist = distMeans(dataSet.iloc[i,:n].values,centroids) #计算点到质心的距离(即每个值到质心的差的平方和) result_set.iloc[i,n] = dist.min() #放入距离的最小值 result_set.iloc[i,n+1] = np.where(dist == dist.min())[0] #放入距离最小值的质心标号 clusterChanged = not (result_set.iloc[:,-1] == result_set.iloc[:,-2]).all() if clusterChanged: cent_df = result_set.groupby(n+1).mean() #按照当前迭代的数据集的分类,进行计算每一类中各个属性的平均值 centroids = cent_df.iloc[:,:n].values #当前质心 result_set.iloc[:,-1] = result_set.iloc[:,-2] #本次质心放到最后一列里 return centroids, result_set x = np.random.randint(0,100,size=100) y = np.random.randint(0,100,size=100) randintnum=pd.concat([pd.DataFrame(x), pd.DataFrame(y)],axis = 1,ignore_index = True) #randintnum_test, randintnum_test = kMeans(randintnum,3) #plt.scatter(randintnum_test.iloc[:,0],randintnum_test.iloc[:,1],c=randintnum_test.iloc[:,-1]) #result_test,cent_test = kMeans(data, 4) cent_test,result_test = kMeans(randintnum, 3) plt.scatter(result_test.iloc[:,0],result_test.iloc[:,1],c=result_test.iloc[:,-1]) plt.scatter(cent_test[:,0],cent_test[:,1],color = 'red',marker = 'x',s=100)
这段代码实现的是k-means聚类算法,但是有一些地方可以改进:
1. 函数kMeans中的createCent参数可以通过修改为直接传入质心的方式来更加灵活。
2. 函数kMeans中的distMeans参数可以修改为scipy库中的距离函数,如scipy.spatial.distance.cdist,来提高计算效率。
3. 函数kMeans中的clusterAssment可以使用pd.DataFrame来进行初始化,这样可以避免使用np.zeros和np.inf来进行初始化。
改进后的代码如下:
```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from scipy.spatial.distance import cdist
def randCent(dataSet, k):
"""
随机生成k个质心
"""
n = dataSet.shape[1] # 列数
data_min = dataSet.min()
data_max = dataSet.max()
# 生成k行n列处于data_min到data_max的质心
data_cent = np.random.uniform(data_min, data_max, (k, n))
return data_cent
def kMeans(dataSet, k, createCent=randCent, distMeans=cdist):
"""
k-means聚类算法
"""
centroids = createCent(dataSet, k) # 初始化质心,k即为初始化质心的总个数
result_set = pd.concat([pd.DataFrame(dataSet), pd.DataFrame()], axis=1, ignore_index=True)
# 将数据进行拼接,横向拼接,即将该容器放在数据集后面
clusterChanged = True
while clusterChanged:
clusterChanged = False
dist = distMeans(dataSet, centroids, metric='euclidean')
clusterAssment = np.argmin(dist, axis=1)
result_set.iloc[:, -1] = pd.Series(clusterAssment)
for i in range(k):
cent_df = result_set[result_set.iloc[:, -1] == i].mean() # 按照当前迭代的数据集的分类,进行计算每一类中各个属性的平均值
if not cent_df.empty:
centroids[i] = cent_df.iloc[:-1].values # 当前质心
clusterChanged = True
return centroids, result_set
x = np.random.randint(0, 100, size=100)
y = np.random.randint(0, 100, size=100)
randintnum = pd.concat([pd.DataFrame(x), pd.DataFrame(y)], axis=1, ignore_index=True)
cent_test, result_test = kMeans(randintnum, 3)
plt.scatter(result_test.iloc[:, 0], result_test.iloc[:, 1], c=result_test.iloc[:, -1])
plt.scatter(cent_test[:, 0], cent_test[:, 1], color='red', marker='x', s=100)
```
逐句注释import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score import pandas as pd data = pd.read_csv('xigua.csv') # 加载数据 print(data) print(data.shape) X = data.iloc[: ,1:3].values print(X) print(X.shape) plt.scatter(X[:, 0], X[:, 1], c = "red", marker = 'o', label = 'None') plt.ylabel('Sugar content') plt.xlabel('density') plt.legend(loc = 2) plt.show() #运用数学方法计算k的取值 score = [] for i in range(10): model = KMeans(n_clusters = i + 2) model.fit(X[:, 1:3]) #计算轮廓系数,系数取值范围[-1,1],越接近1的,k的值越好 score.append(silhouette_score(X[:, 0:2], model.labels_, metric = 'euclidean')) plt.figure(figsize = (5, 4)) plt.plot(range(2, 12, 1), score) plt.show() #n_clusters表示k的取值,也就是聚成簇的数量 #fit()函数:做的就是模型训练 kmeans = KMeans(n_clusters = 3, random_state = 0, ).fit(X[:, 1:3]) label_pred = kmeans.labels_#获取聚类标签 print(label_pred) centroids = kmeans.cluster_centers_ #获取聚类簇心 print(centroids) #绘制结果 x0 = X[label_pred == 0] x1 = X[label_pred == 1] plt.scatter(x0[:, 0], x0[:, 1], c = "red", marker = 'o', label = 'label0') plt.scatter(x1[:, 0], x1[:, 1], c = "green", marker = '*', label = 'label1') plt.ylabel('Sugar content') plt.xlabel('density') plt.legend(loc = 2) plt.show()
这份代码主要是对西瓜数据集进行聚类分析,下面是逐行的注释:
```
import matplotlib.pyplot as plt # 导入绘图库
from sklearn.cluster import KMeans # 导入kmeans聚类算法
from sklearn.metrics import silhouette_score # 导入轮廓系数评价指标
import pandas as pd # 导入数据处理库
data = pd.read_csv('xigua.csv') # 加载数据
print(data) # 打印数据
print(data.shape) # 打印数据的形状
X = data.iloc[:, 1:3].values # 取第2列和第3列作为特征
print(X) # 打印特征
print(X.shape) # 打印特征的形状
plt.scatter(X[:, 0], X[:, 1], c="red", marker='o', label='None') # 绘制散点图
plt.ylabel('Sugar content') # y轴标签
plt.xlabel('density') # x轴标签
plt.legend(loc=2) # 图例位置
plt.show() # 显示图像
score = [] # 初始化轮廓系数列表
for i in range(10): # 循环计算轮廓系数
model = KMeans(n_clusters=i + 2) # 聚类模型
model.fit(X[:, 1:3]) # 训练模型
# 计算轮廓系数,系数取值范围[-1,1],越接近1的,k的值越好
score.append(silhouette_score(X[:, 0:2], model.labels_, metric='euclidean'))
plt.figure(figsize=(5, 4)) # 创建图像
plt.plot(range(2, 12, 1), score) # 绘制轮廓系数图像
plt.show() # 显示图像
kmeans = KMeans(n_clusters=3, random_state=0).fit(X[:, 1:3]) # 聚类模型
label_pred = kmeans.labels_ # 获取聚类标签
print(label_pred) # 打印聚类标签
centroids = kmeans.cluster_centers_ # 获取聚类簇心
print(centroids) # 打印聚类簇心
x0 = X[label_pred == 0] # 获取第一类样本
x1 = X[label_pred == 1] # 获取第二类样本
plt.scatter(x0[:, 0], x0[:, 1], c="red", marker='o', label='label0') # 绘制第一类样本的散点图
plt.scatter(x1[:, 0], x1[:, 1], c="green", marker='*', label='label1') # 绘制第二类样本的散点图
plt.ylabel('Sugar content') # y轴标签
plt.xlabel('density') # x轴标签
plt.legend(loc=2) # 图例位置
plt.show() # 显示图像
```
这段代码的目的是对西瓜数据集进行聚类分析,首先通过读取数据集获取特征,然后绘制散点图观察数据的分布情况,接着通过计算轮廓系数来确定最优的聚类簇数,再利用KMeans算法进行聚类分析,并绘制聚类结果的散点图。
阅读全文