import numpy as np, matplotlib.pyplot as mp from sklearn.cluster import KMeans from sklearn import datasets from sklearn import metrics np.random.seed(8) # 设定随机环境 # 创建随机样本 X, _ = datasets.make_blobs(centers=[[0, 0]]) X1 = np.dot(X, [[4, 1], [1, 1]]) X2 = np.dot(X[:50], [[1, 1], [1, -5]]) - 2 X = np.concatenate((X1, X2)) y = [0] * 100 + [1] * 50 # KMeans kmeans = KMeans(n_clusters=2) y_kmeans = kmeans.fit(X).predict(X) # 绘图 for e, labels in enumerate([y, y_kmeans], 1): mp.subplot(1, 2, e) mp.scatter(X[:, 0], X[:, 1], c=labels, s=40, alpha=0.6) mp.xticks(()) mp.yticks(()) mp.show()
时间: 2023-06-01 16:02:51 浏览: 140
这行代码是在Python中导入了一些常用的数据分析库和机器学习库,包括NumPy、Matplotlib和Scikit-learn。其中,NumPy是Python中用于科学计算的基础库;Matplotlib则是Python中用于绘制图表和数据可视化的库;Scikit-learn则是一个用于机器学习的Python库。这行代码还使用了KMeans算法和数据集。最后,使用了np.random.seed(8)函数设置了随机种子。
相关问题
对下面代码进行结果分析import numpy as np from sklearn.cluster import MiniBatchKMeans from sklearn.datasets import load_iris from sklearn import preprocessing import matplotlib.pyplot as plt np.random.seed(5) from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score from pylab import mpl # 设置显示中文字体 mpl.rcParams["font.sans-serif"] = ["SimHei"] # 设置正常显示符号 mpl.rcParams["axes.unicode_minus"] = False # 加载鸢尾花数据集 iris = load_iris() X = iris.data y = iris.target #最小最大标准化 min_max_scaler = preprocessing.MinMaxScaler() X_minmax=min_max_scaler.fit_transform(X) batch_size =15 num_cluster =3 #K均值算法拟合 clf=MiniBatchKMeans(n_clusters=num_cluster,batch_size=batch_size,init="random") clf.fit(X_minmax) #拟合中心 centers = clf.cluster_centers_ #预测标签 pre_clu=clf.labels_ print(pre_clu) vmarker={0:'^',1:'s',2:'D',} mValue=[vmarker[i] for i in pre_clu] for _marker, _x, _y in zip(mValue, X_minmax[:,1],X_minmax[:,2]): plt.scatter(_x, _y,marker=_marker,c="grey") plt.scatter(centers[:,1],centers[:,2],marker="*",s=200,c='black') plt.show() # 轮廓系统法最佳k值 def sc_k(): K = range(2, 10) score = [] for k in K: kmeans = KMeans(n_clusters=k) kmeans.fit(iris.data) score.append(silhouette_score(iris.data, kmeans.labels_, metric='euclidean')) plt.plot(K, score, 'r*-') plt.xlabel('k') plt.ylabel(u'轮廓系数') plt.title(u'轮廓系数确定最佳的K值') plt.show() sc_k()
这段代码使用MiniBatchKMeans算法对鸢尾花数据集进行了聚类,并展示了聚类结果和最佳的K值。
具体分析如下:
1. 数据预处理:使用MinMaxScaler对数据进行了最小最大标准化处理,将所有特征缩放到0到1之间。
2. 聚类过程:使用MiniBatchKMeans算法对处理后的数据进行聚类,聚为3类。拟合完成后,输出预测标签pre_clu。
3. 可视化:将聚类结果可视化,将数据点按照聚类标签的不同用不同形状的标记表示,并将聚类中心用黑色星号标记出来。
4. 最佳K值:使用轮廓系数法求解最佳的K值。在这段代码中,使用了KMeans算法对iris数据进行聚类,计算不同K值下的轮廓系数,并将结果可视化。从图中可以看出,轮廓系数达到最大值时,对应的K值为2或3。
因此,根据这段代码的聚类结果和轮廓系数法的求解结果,可以将鸢尾花数据集聚为3类,聚类质量相对较好。
import random import numpy as np import matplotlib.pyplot as plt 生成随机坐标点 def generate_points(num_points): points = [] for i in range(num_points): x = random.uniform(-10, 10) y = random.uniform(-10, 10) points.append([x, y]) return points 计算欧几里得距离 def euclidean_distance(point1, point2): return np.sqrt(np.sum(np.square(np.array(point1) - np.array(point2)))) K-means算法实现 def kmeans(points, k, num_iterations=100): num_points = len(points) # 随机选择k个点作为初始聚类中心 centroids = random.sample(points, k) # 初始化聚类标签和距离 labels = np.zeros(num_points) distances = np.zeros((num_points, k)) for i in range(num_iterations): # 计算每个点到每个聚类中心的距离 for j in range(num_points): for l in range(k): distances[j][l] = euclidean_distance(points[j], centroids[l]) # 根据距离将点分配到最近的聚类中心 for j in range(num_points): labels[j] = np.argmin(distances[j]) # 更新聚类中心 for l in range(k): centroids[l] = np.mean([points[j] for j in range(num_points) if labels[j] == l], axis=0) return labels, centroids 生成坐标点 points = generate_points(100) 对点进行K-means聚类 k_values = [2, 3, 4] for k in k_values: labels, centroids = kmeans(points, k) # 绘制聚类结果 colors = [‘r’, ‘g’, ‘b’, ‘y’, ‘c’, ‘m’] for i in range(k): plt.scatter([points[j][0] for j in range(len(points)) if labels[j] == i], [points[j][1] for j in range(len(points)) if labels[j] == i], color=colors[i]) plt.scatter([centroid[0] for centroid in centroids], [centroid[1] for centroid in centroids], marker=‘x’, color=‘k’, s=100) plt.title(‘K-means clustering with k={}’.format(k)) plt.show()import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.datasets import load_iris 载入数据集 iris = load_iris() X = iris.data y = iris.target K-means聚类 kmeans = KMeans(n_clusters=3, random_state=0).fit(X) 可视化结果 plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_) plt.xlabel(‘Sepal length’) plt.ylabel(‘Sepal width’) plt.title(‘K-means clustering on iris dataset’) plt.show()对这个算法的结果用SSE,轮廓系数,方差比率准则,DBI几个指标分析
首先,我们需要定义这些指标:
1. SSE (Sum of Squared Errors):误差平方和,表示每个点到其所属簇中心的距离的平方和,用于评估聚类效果的好坏。
2. 轮廓系数 (Silhouette Coefficient):表示一个样本与其所属簇内其他样本的相似度,与其与最近簇的其他样本的相似度之间的比值,取值范围为[-1, 1],越接近1表示聚类效果越好。
3. 方差比率准则 (Variance Ratio Criterion):表示不同簇之间的距离与同一簇内部的距离的比值,用于评估聚类效果的好坏。
4. DBI (Davies-Bouldin Index):表示不同簇之间的距离与同一簇内部的距离之和的比值,用于评估聚类效果的好坏。
接下来,我们分别用这些指标来评估上面两段代码实现的K-means算法的聚类效果。
对于第一段代码,我们可以在K-means算法的函数中添加计算SSE的代码,并在函数返回值中返回SSE的值。同时,我们可以使用sklearn库中的metrics模块来计算轮廓系数。方差比率准则的计算与SSE类似,只需要将距离平方和改为距离的平方和,即可得到方差比率准则的值。DBI的计算可以使用sklearn库中的metrics模块中的davies_bouldin_score函数来实现。
代码如下所示:
```
import random import numpy as np import matplotlib.pyplot as plt from sklearn.metrics import silhouette_score from sklearn.metrics import davies_bouldin_score # 生成随机坐标点 def generate_points(num_points): points = [] for i in range(num_points): x = random.uniform(-10, 10) y = random.uniform(-10, 10) points.append([x, y]) return points # 计算欧几里得距离 def euclidean_distance(point1, point2): return np.sqrt(np.sum(np.square(np.array(point1) - np.array(point2)))) # K-means算法实现 def kmeans(points, k, num_iterations=100): num_points = len(points) # 随机选择k个点作为初始聚类中心 centroids = random.sample(points, k) # 初始化聚类标签和距离 labels = np.zeros(num_points) distances = np.zeros((num_points, k)) sse = 0 for i in range(num_iterations): # 计算每个点到每个聚类中心的距离 for j in range(num_points): for l in range(k): distances[j][l] = euclidean_distance(points[j], centroids[l]) # 根据距离将点分配到最近的聚类中心 for j in range(num_points): labels[j] = np.argmin(distances[j]) # 更新聚类中心 for l in range(k): centroids[l] = np.mean([points[j] for j in range(num_points) if labels[j] == l], axis=0) # 计算SSE sse = np.sum(np.square(distances[np.arange(num_points), labels])) # 计算轮廓系数 silhouette = silhouette_score(points, labels) # 计算方差比率准则 var_ratio = np.sum(np.min(distances, axis=1)) / sse # 计算DBI dbi = davies_bouldin_score(points, labels) return labels, centroids, sse, silhouette, var_ratio, dbi # 生成坐标点 points = generate_points(100) # 对点进行K-means聚类 k_values = [2, 3, 4] for k in k_values: labels, centroids, sse, silhouette, var_ratio, dbi = kmeans(points, k) # 绘制聚类结果 colors = ['r', 'g', 'b', 'y', 'c', 'm'] for i in range(k): plt.scatter([points[j][0] for j in range(len(points)) if labels[j] == i], [points[j][1] for j in range(len(points)) if labels[j] == i], color=colors[i]) plt.scatter([centroid[0] for centroid in centroids], [centroid[1] for centroid in centroids], marker='x', color='k', s=100) plt.title('K-means clustering with k={}'.format(k)) plt.show() print('SSE: {:.2f}'.format(sse)) print('Silhouette: {:.2f}'.format(silhouette)) print('Variance Ratio Criterion: {:.2f}'.format(var_ratio)) print('DBI: {:.2f}'.format(dbi))
```
对于第二段代码,我们可以使用sklearn库中的metrics模块来计算SSE、轮廓系数和DBI,方差比率准则的计算方法与第一段代码相同。
代码如下所示:
```
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.cluster import KMeans from sklearn.datasets import load_iris from sklearn.metrics import silhouette_score from sklearn.metrics import davies_bouldin_score # 载入数据集 iris = load_iris() X = iris.data y = iris.target # K-means聚类 kmeans = KMeans(n_clusters=3, random_state=0).fit(X) # 计算SSE sse = np.sum(np.square(X - kmeans.cluster_centers_[kmeans.labels_])) # 计算轮廓系数 silhouette = silhouette_score(X, kmeans.labels_) # 计算方差比率准则 var_ratio = kmeans.inertia_ / sse # 计算DBI dbi = davies_bouldin_score(X, kmeans.labels_) # 可视化结果 plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_) plt.xlabel('Sepal length') plt.ylabel('Sepal width') plt.title('K-means clustering on iris dataset') plt.show() print('SSE: {:.2f}'.format(sse)) print('Silhouette: {:.2f}'.format(silhouette)) print('Variance Ratio Criterion: {:.2f}'.format(var_ratio)) print('DBI: {:.2f}'.format(dbi))
```
通过这些指标的计算,我们可以得到K-means算法的聚类效果的好坏。一般来说,SSE和轮廓系数越小,方差比率准则越大,DBI越小,则聚类效果越好。
阅读全文