使用k-means聚类算法对矩阵元素进行分类
使用k-means聚类算法对矩阵元素进行分类
实验目的
- 了解k-means聚类算法的原理
- 了解k-means聚类算法中各参数的含义以及对聚类结果的影响
- 熟练安装python扩展库sklearn。
- 了解使用sklearn 库中k-means聚类算法解决问题的基本思路。
实验内容
-
编写程序,使用k-means聚类方法对已知数据进行聚类,然后对未知样本进行分类。数据自己进行模拟生成,要求为整数,样本个数至少为 100个,类别作为输入参数。
-
k-means 算法的基本思想:以空间k个点为中心进行聚类,对靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。最终的k各聚类具有以下特点:各聚类本身尽可能紧凑,而各聚类之间尽可能分开。
假设把样本集分为k个类别,算法描述如下:
- 适当选择k个类的初始中心。
- 在k次迭代中,对任意一个样本,求其到k个中心的聚类,将该样本归到距离最近的中心所在的类。
- 利用均值或其他算法更新该类的中心值。
- 对于所有的k个聚类中心,如果利用步骤2,3迭代更新后,值保持不变,则迭代结束,否则继续迭代。
- 该算法的最大优势在于简洁和快速,算法的关键在于预期分类数量的确定以及初始中心和距离公式的选择。
import sklearn
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
- 导入数据,数据使用randomdata.py文件生成
# randomdata.py
A = np.random.randint(0, 30, (100, 2))
data = pd.DataFrame(A)
writer = pd.ExcelWriter('A.xlsx')
data.to_excel(writer, 'page_1', float_format='%.5f')
writer.save()
writer.close()
data = pd.read_csv("D:\Python_FILE\PyCharm\BigWorkofClass\exp03\k_means\A.csv")
data.dropna(inplace=True)
data.head()
Unnamed: 0 | 0 | 1 | |
---|---|---|---|
0 | 0 | 26 | 16 |
1 | 1 | 21 | 0 |
2 | 2 | 27 | 14 |
3 | 3 | 6 | 3 |
4 | 4 | 18 | 5 |
- 引入Kmeans
from sklearn.cluster import KMeans
- 绘制畸变曲线图,目测肘部为4,即k=4时,聚类效果最好
see = []
for k in range(1,20):
kmeans = KMeans(n_clusters=k)
kmeans.fit(data[['0','1']])
see.append(kmeans.inertia_)
fig = plt.figure(figsize=(20, 6))
plt.xlabel("Number of clusters")
plt.ylabel("Distortion")
plt.plot(range(1,20),see)
plt.show()
- 开始进行聚类迭代
kmeans = KMeans(n_clusters = 4)
kmeans.fit(data[['0','1']])
data['label'] = kmeans.labels_
data.groupby('label').size()
from sklearn.preprocessing import StandardScaler
while True:
odd = kmeans.labels_
data_scaled = StandardScaler().fit_transform(data[['0','1']])
kmeans.fit(data_scaled)
if(odd.all() == kmeans.labels_.all()):
break
data['label_standarer'] = kmeans.labels_
print(data)