K means算法sklearn

k均值聚类算法(k-means clustering algorithm) 是一种迭代求解的聚类分析算法,将数据集中某些方面相似的数据进行分组组织的过程,聚类通过发现这种内在结构的技术,而k均值是聚类算法中最著名的算法,无监督学习,
步骤为:预将数据集分为k组(k有用户指定),随机选择k个对象作为初始的聚类中心,然后计算每个对象与各个 种子类聚中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复知道满足某个终止条件。聚类条件可以分两种:1.没有或者设置的最小数目的对象被重新分配给不同的聚类;2.没有或者设置的最小数目的聚类中心再发生变化。

在K-Means基础之上,有一些优化变体方法:初始化优化K-Means++,距离计算优化elkan K-Means,大数据情况下的优化Mini Batch K-Means

对于给定的数据集,按照数据集之间的距离大小,将数据集划分为k个族。让族内的点尽量的紧密的连在一起,而让族间的距离尽量的大。

初始化方法

通常使用的初始化方法有Forgy和随机划分(Random Partition)方法 [9] 。Forgy方法随机地从数据集中选择k个观测作为初始的均值点;而随机划分方法则随机地为每一观测指定聚类,然后运行“更新(Update)”步骤,即计算随机分配的各聚类的图心,作为初始的均值点。Forgy方法易于使得初始均值点散开,随机划分方法则把均值点都放到靠近数据集中心的地方。参考Hamerly et al的文章 [9] ,可知随机划分方法一般更适用于k-调和均值和模糊k-均值算法。对于期望-最大化(EM)算法和标准k-均值算法,Forgy方法作为初始化方法的表现会更好一些。

这是一个启发式算法,无法保证收敛到全局最优解,并且聚类的结果会依赖于初始的聚类。又因为算法的运行速度通常很快,所以一般都以不同的起始状态运行多次来得到更好的结果。不过,在最差的情况下,k-均值算法会收敛地特别慢:尤其是已经证明了存在这一的点集(甚至在2维空间中),使得k-均值算法收敛的时间达到指数级。好在在现实中,这样的点集几乎不会出现:因为k-均值算法的平滑运行时间是多项式时间的。

  • 优缺点各是什么

缺点:

  1. 聚类数目k是一个输入参数。选择不恰当的k值可能会导致糟糕的聚类结构。解决办法:进行特征检查(通过交叉验证)来决定数据集的聚类数目

2. 收敛到局部最优解,可能导致“反直观”的错误结果。

3. 不能和任意的距离函数一起使用,不能处理非数值数据

4. 不是凸的数据集比较难收敛

5. 对迭代方法,得到的结果只是局部最优

6. 对噪音和异常点比较的敏感

7. 如果隐含的数据类别不平衡,则聚类效果不佳

优点:

原理比较简单;实现也很容易,收敛速度快;聚类效果较优;算法的可解释度比较强;主要需要调参仅仅是族数k

为什么出现(为什么需要这个技术)

  • 解决什么问题

应用:

在巨大的数据集上,也非常容易部署实施

在市场划分,机器视觉,地质统计学,天文学和农业得到成功应用

经常作为其他算法的预处理步骤。

K-Means初始化优化K-Means++

K-Means++的对于初始化质心的优化策略也很简单,如下:

a) 从输入的数据点集合中随机选择一个点作为第一个聚类中心μ1μ1
b) 对于数据集中的每一个点xixi,计算它与已选择的聚类中心中最近聚类中心的距离D(xi)=argmin||xi−μr||22r=1,2,...kselectedD(xi)=argmin||xi−μr||22r=1,2,...kselected

c) 选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)D(x)较大的点,被选取作为聚类中心的概率较大
d) 重复b和c直到选择出k个聚类质心
e) 利用这k个质心来作为初始化质心去运行标准的K-Means算法

K-Means距离计算优化elkan K-Means

在传统的k算法中,每轮迭代时,需要计算所有的样本点到所有的质心的距离,因此存在优化的空间,减少不必要的计算。

elkan K-Means利用了两边之和大于等于第三边,以及两边之差小于第三边的三角形性质,来减少距离的计算。

大样本优化Mini Batch K-Means

在具有数据量非常大情况下,使用该算法,该算法只使用数据集中的一部分做传统的k算法,避免数据集过大导致的计算难题,速度大大加快,待久就是精确度是会有一些降低的。一般来说,这个降低的幅度在可接受的范围之内。

这个用来训练的量,占比原始数据多少,一般通过无放回的随机采样得到的。通过采用不同的随机采样集来得到聚类族,选择其中最优的聚类族。

K-Means与KNN

k是无监督学习的聚类算法,没有样本输出,有明显的训练过程

knn是监督学习的分类算法,有对应样本输出,基本不需要训练

两个算法都包含一个过程,找出和某一个最近的点,两者都利用了最近邻的思想

聚类与分类的区别

分类:类别是已知的,通过对已知分类的数据进行训练和学习,找到这些不同类的特征,再对未分类的数据进行分类。属于监督学习。

聚类:事先不知道数据会分为几类,通过聚类分析将数据聚合成几个群体。聚类不需要对数据进行训练和学习。属于无监督学习。

关于监督学习和无监督学习,这里给一个简单的介绍:是否有监督,就看输入数据是否有标签,输入数据有标签,则为有监督学习,否则为无监督学习。

sklearn k-Means

导包:

from sklearn.cluster import KMeans

传参详解

max_iter: 最大的迭代次数,如果是凸数据集可以不管这个值,如果不是凸的,可能很难收敛,此时需要指定最大的迭代次数让算法可以及时退出循环.

新建完对象以后,常用方法包括:

fit(X): 该函数对数据x进行聚类

predict :使用该函数对新数据类别的预测

cluster_centers_:使用该函数获取聚类中心

lables_:获取训练数据所属的类别

inertia_:获取每个点到聚类中心的距离和。

kmeans.fit_predict(data)

X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])#此处要进行np的import import numpy as np kmeans = KMeans(n_clusters=2, random_state=0)#新建KMeans对象,并传入参数 kmeans.fit(X)#进行训练 print(kmeans.labels_) print(kmeans.predict([[0, 0], [4, 4]])) # 预测 print(kmeans.cluster_centers_)

标准化

# sklearn.preprocessing import StandardScaler 使用 # Standardization 标准化:将特征数据的分布调整为标准正太分布,也叫高斯分布,也就是使得数据的均值为0(所有数据之和除以数据点的个数),方差为1(表示数据集中数据点的离散程度). # 标准化的原因在于如果有些特征的方差过大,则会主导目标函数从而使参数估计其无法正确地区学习其他特征. # 标准化的过程分为两步:去均值的中心化(均值变为0),方差的规模化(方差变为1) std = StandardScaler() data = std.fit_transform(data[["field1", "field2", "field3", "field4", "field5", "field6", 'field7']]) # 将标准化后的数据转换为原始数据。 std.inverse_transform()

k-means 寻找最佳k值.

import pandas as pd from sklearn.cluster import KMeans import matplotlib.pyplot as plt df_features = pd.read_csv(r'C:\预处理后数据.csv',encoding='gbk') # 读入数据 '利用SSE选择k' SSE = [] # 存放每次结果的误差平方和 for k in range(1,9): estimator = KMeans(n_clusters=k) # 构造聚类器 estimator.fit(df_features[['R','F','M']]) SSE.append(estimator.inertia_) X = range(1,9) plt.xlabel('k') plt.ylabel('SSE') plt.plot(X,SSE,'o-') plt.show()

相关理论:K-means聚类最优k值的选取_qq_15738501的博客-CSDN博客

手肘法?的核心指标是sse(sum of the squared errors 误差平方和)

核心思想是:随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和sse自然会逐渐变小.

or

data from sklearn.model_selection import train_test_split, GridSearchCV param_test1 = {'n_clusters': np.arange(2, 25, 1)} gsearch2 = GridSearchCV(estimator=KMeans(init='k-means++', random_state=42), param_grid=param_test1, cv=5) gsearch2.fit(data) score_list = -pd.DataFrame(gsearch2.cv_results_)['mean_test_score'] print('n_clusters 值------------ k值') print(gsearch2.best_params_, gsearch2.best_score_)

其他方法:

1)fit_predict(X):先对X进行训练并预测X中每个实例的类,等于先调用fit(X)后调用predict(X),返回X的每个类; 2)transform(X):将X进行转换,转换为K列的矩阵,其中每行为一个实例,每个实例包含K个数值(K为传入的类数量),第i列为这个实例到第K个聚类中心的距离; 3)fit_transform(X):类似(1),先进行fit之后进行transform; 4)score(X):输入样本(这里的样本不是训练样本,而是其他传入的测试样本)到他们的类中心距离和,然后取负数(取负数是因为距离越大 值越小)。

参考:

Toplist

最新的帖子

標籤