算法原理
k-means算法是一种聚类算法,所谓聚类,即根据相似性原则,将具有较高相似度的数据对象划分至同一类簇,将具有较高相异度的数据对象划分至不同类簇。聚类与分类最大的区别在于,聚类过程为无监督过程,即待处理数据对象没有任何先验知识,而分类过程为有监督过程,即存在有先验知识的训练数据集。
k-means算法中的k代表类簇个数,means代表类簇内数据对象的均值(这种均值是一种对类簇中心的描述),因此,k-means算法又称为k-均值算法。k-means算法是一种基于划分的聚类算法,以距离作为数据对象间相似性度量的标准,即数据对象间的距离越小,则它们的相似性越高,则它们越有可能在同一个类簇。数据对象间距离的计算有很多种,k-means算法通常采用欧氏距离来计算数据对象间的距离。
实验内容
1、随机生成100个数,并对这100个数进行k-mean聚类(k=3,4,5,6)(并用matplot画图)
import numpy as np
import matplotlib
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
matplotlib.rcParams['font.family'] = 'SimHei' # 中文显示
dataSet = np.random.rand(100, 3) # 生成一个随机数据,样本大小为100, 特征数为3
for k in range(3, 7):
clf = KMeans(n_clusters=k) # 设定k
s = clf.fit(dataSet) # 加载数据集合
numSamples = len(dataSet)
centroids = clf.labels_
print(centroids, type(centroids)) # 显示中心点
print(clf.inertia_) # 显示聚类效果
mark = ['or', 'ob', 'og', 'ok', '^r', '+r', 'sr', 'dr', '<r', 'pr']
# 画出所有样例点 属于同一分类的绘制同样的颜色
for i in range(numSamples):
# markIndex = int(clusterAssment[i, 0])
plt.plot(dataSet[i][0], dataSet[i][1], mark[clf.labels_[i]]) # mark[markIndex])
mark = ['Dr', 'Db', 'Dg', 'Dk', '^b', '+b', 'sb', 'db', '<b', 'pb']
# 画出质点,用特殊图型
centroids = clf.cluster_centers_
for i in range(k):
plt.plot(centroids[i][0], centroids[i][1], mark[i], markersize=12)
# print centroids[i, 0], centroids[i, 1]
plt.title(str(k)+"-mean聚类")
plt.show()
实验结果分析
由实验结果可以直观看出选择类簇个数不同,分类效果不同,当分为三类时每个点到其簇的质心距离之和最大,随簇数增加,每个点到其簇的质心距离之和减小,但有图可以看出当簇增大时分类较杂乱
2、对鸢尾花数据进行K-means算法聚类(并用matplot画图)
import matplotlib
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
matplotlib.rcParams['font.family'] = 'SimHei' # 中文显示
# 鸢尾花K-means聚类散点图
iris = load_iris().data
K_means = KMeans(n_clusters=3) # 三个聚类中心
result = K_means.fit(iris) # means 自动分类
kc = result.cluster_centers_ # 自动分类后的聚类中心
y_means = K_means.predict(iris) # 预测y值
plt.title("鸢尾花数据集的K-means聚类散点图", fontsize=16)
plt.scatter(iris[:,0],iris[:,2],c=y_means, marker='.',label='see')
plt.show()
实验结果分析
通过数据集iris的属性值将鸢尾花分为3类,即K值为3,可视化图形后可直观明了的看出3类鸢尾花的散点图,进而基于K均值模型可进一步预测鸢尾花类型。