4. 作业:
1). 扑克牌手动演练k均值聚类过程:>30张牌,3类
2). *自主编写K-means算法 ,以鸢尾花花瓣长度数据做聚类,并用散点图显示。(加分题)
3). 用sklearn.cluster.KMeans,鸢尾花花瓣长度数据做聚类,并用散点图显示.
4). 鸢尾花完整数据做聚类并用散点图显示.
5).想想k均值算法中以用来做什么
答:
(1)
第一轮:13、10、5
第二轮:13、9、4
(2)
import matplotlib.pyplot as plt from sklearn.datasets import load_iris import numpy as np #导入数据 iris = load_iris() data = iris.data # 数据值 data.shape # 可知数据的总数和属性个数 n = len(data) # 数据集样本个数 m = data.shape[1] # 数据的属性个数 # 类中心个数(1-5) k = 3 dist = np.zeros([n, k+1]) # k+1是最后一列要归类 # 选中心 center = data[:k, :] # k为3所以是前三行所有属性 centerNew = np.zeros([k, m]) # 初始化新的类中心 while True: # 求距离 for i in range(n): for j in range(k): dist[i, j] = np.sqrt(sum((data[i, :]-center[j, :])**2)) # 求欧式距离 # 归类 dist[i, k] = np.argmin(dist[i, :k]) for i in range(k): index = dist[:, k] == i centerNew[i, :] = data[index, :].mean(axis=0) # 判定结果 if np.all((center == centerNew)): break else: center = centerNew print("聚类结果:\n", dist[:, k]) # print(data[:,k]) plt.scatter(data[:,2], data[:,2], c=dist[:,2], s=50, cmap='rainbow') plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体 plt.title("K-mean-鸢尾花花瓣长度做聚类的散点图") plt.show()
(3)
# 用sklearn.cluster.KMeans,鸢尾花花瓣长度数据做聚类,并用散点图显示. import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.cluster import KMeans iris = load_iris() # 导入鸢尾花数据 # print(iris) X = iris.data[:, 2] # 第三列为花瓣长度 X = X.reshape(-1, 1) # 令新数组列为1 # print(X) y = KMeans(n_clusters=3) # 模型构建(类中心数为3) y.fit(X) # 模型训练 kc = y.cluster_centers_ # 聚类中心 y_kmeans = y.predict(X) # 预测每个样本的聚类索引 print("聚类结果:\n", y_kmeans) print("聚类中心:\n", kc) plt.scatter(X[:, 0], X[:, 0], c=y_kmeans, s=50, cmap='rainbow') # 画散点图 plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体 plt.title("sklearn.cluster.KMeans-鸢尾花花瓣长度做聚类的散点图") plt.show()
(4)
# 鸢尾花完整数据做聚类并用散点图显示. import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.cluster import KMeans iris = load_iris() # 导入鸢尾花数据 X = iris.data # 鸢尾花完整数据 # print(X) y = KMeans(n_clusters=3) # 模型构建(类中心数为3) y.fit(X) # 模型训练 kc = y.cluster_centers_ # 聚类中心 y_kmeans = y.predict(X) # 预测每个样本的聚类索引 print("聚类结果:\n", y_kmeans) print("聚类中心:\n", kc) plt.scatter(X[:, 2], X[:, 3], c=y_kmeans, s=50, cmap='rainbow') # 画散点图 plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置字体 plt.title("鸢尾花做聚类的散点图") plt.show()
(5)可以通过k均值算法进行库存分类,例如按销售活动分组库存或者按制造指标对库存进行分组,也可以用来识别不同类型的癌症特征。