数据挖掘从入门到放弃(六):K-means 聚类
算法描述之前章节讲到的算法都是有监督学习方法, 在建模之前需要训练(样本)数据集,模型根据样本数据集的结果,训练得到某些参数,形成分类器。无监督学习没有训练数据集,在数据集上根据某种规则完成模型建立;
所谓物以类聚-人以群分,“类”指的是具有相似性的集合,聚类是指将数据集划分为若干类,使得各个类之内的数据最为相似,而各个类之间的数据相似度差别尽可能的大。聚类分析就是以相似性为基础,在一个聚类中的模式之间比不在同一个聚类中的模式之间具有更多的相似性。对数据集进行聚类划分,属于无监督学习。
K-Means是最常用且简单的聚类算法,最大特点是好理解,运算速度快,时间复杂度近于线性,适合挖掘大规模数据集。但是只能应用于连续型的数据,并且一定要在聚类前需要手工指定要分成几类;
K-Means采用距离作为相似性指标,从而发现给定数据集中的K个类,且每个类的中心是根据类中所有数值的均值得到的,每个类的中心用聚类中心来描述。对于给定的一个(包含n个一维以及一维以上的数据点的)数据集X以及要得到的类别数量K,选取欧式距离作为相似度指标,聚类目标是使得类的聚类平方和最小,即最小化:
K-Means算法流程:
1、随机选取K个样本作为聚类中心;
2、计算各样本与各个聚类中心的距离;
3、将各样本回归于与之距离最近的聚类中心;
4、求各个类的样本的均值,作为新的聚类中心;
5、判定:若类中心不再发生变动或者达到迭代次数,算法结束,否则回到第二步。
from sklearn import datasets
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
URL="C:\\Users\\71781\\Desktop\\2020\\ML-20200422\\K-means\\"
data=pd.read_csv(URL+"xigua.csv")
data.head()
data.describe()
fig,(axis1,axis2) = plt.subplots(1,2,figsize=(10,3))
sns.distplot(data["density"],ax=axis1)
sns.distplot(data["sugercontent"],ax=axis2)
sns_test=sns.scatterplot(x="density",y="sugercontent",data=data)
import sklearn.cluster as sc
# n_clusters: 聚类数
model = sc.KMeans(n_clusters=4)
# 不断调整聚类中心,直到最终聚类中心稳定则聚类完成
model.fit(data)
# 获取训练结果的聚类中心
centers = model.cluster_centers_
调参n_clusters:整型,缺省值=8 ,生成的聚类数。
max_iter:整型,缺省值=300 ,执行一次k-means算法所进行的最大迭代数。
n_init:整型,缺省值=10 ,用不同的聚类中心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。
init:有三个可选值:’k-means++’, ‘random’,或者传递一个ndarray向量,此参数指定初始化方法,默认值为 ‘k-means++’。(1)‘k-means++’ 用一种特殊的方法选定初始聚类,可加速迭代过程的收敛(2)‘random’ 随机从训练数据中选取初始质心。(3)如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。
precompute_distances:三个可选值,‘auto’,True 或者 False,预计算距离,计算速度更快但占用更多内存。(1)‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。(2)True:总是预先计算距离。(3)False:永远不预先计算距离。
tol:float类型,默认值= 1e-4 与inertia结合来确定收敛条件。
n_jobs:整形数。 指定计算所用的进程数。内部原理是同时进行n_init指定次数的计算。(1)若值为 -1,则用所有的CPU进行运算。若值为1,则不进行并行运算。(2)若值小于-1,则用到的CPU数为(n_cpus + 1 + n_jobs)。因此如果 n_jobs值为-2,则用到的CPU数为总CPU数减1。
random_state:整型或 numpy.RandomState 类型,可选,用于初始化质心的生成器(generator)。如果值为一个整数,则确定一个seed。此参数默认值为numpy的随机数生成器。
copy_x:布尔型,默认值=True ,当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。
历史好文推荐