K-means问题小记

K-means

k-means 聚类的原理以及缺点及对应的改进;kmeans 算法的优缺点。。。。
k均值聚类算法尝试将给定的匿名数据集(一个不包含有关类标识的信息的集合)拆分为固定数量(k)的簇。

最初,选择k个所谓的质心。质心是群集中心的数据点(虚部或实部)。每个质心都是给定输入数据集中的现有数据点,是随机选取的,因此所有质心都是唯一的(即,对于所有质心ci和cj,ci≠cj)。这些质心用于训练kNN分类器。所得分类器用于对数据进行分类(使用k = 1),从而产生初始的随机聚类集。此后,将每个质心设置为其定义的群集的算术平均值。重复分类和质心调整的过程,直到质心的值稳定为止。最终的质心将用于生成输入数据的最终分类/聚类,从而有效地将一组最初的匿名数据点转换为一组数据点,每个数据点都具有类标识

https://editor.csdn.net/md/?articleId=106042978
https://blog.csdn.net/u010536377/article/details/50884416

k-均值:优点和缺点
优点
•易于实施
•对于大量变量,K均值的计算速度可能比
•k-Means可能比分层聚类产生更强的聚类
•重新计算质心时,实例可以更改群集(移至另一个群集)。
缺点
•难以预测簇数(K值)
•种子种子对最终结果有很大影响
•数据顺序会影响最终结果

em 与 kmeans 的关系;
EM和K-means在允许迭代过程的模型优化以找到最佳拥塞的意义上相似。 但是,K-means算法在计算两个数据项之间的距离时,用于计算欧几里得距离的方法有所不同。 EM使用统计方法。
K均值的过程类似于将每个观察值分配给一个聚类,而EM(期望最大化)的过程则是寻找一个观察值属于一个聚类的可能性(概率)。这是这两个过程都不​​同的地方。

例如,假设大多数观测值确实属于少数(未知)子组,并且观测值的一小部分彼此之间以及与所有其他观测值完全不同。然后,由于K-均值将每个观测值强制进入一个聚类,因此,存在不属于任何聚类的离群值,发现的聚类可能会严重失真。混合模型是解决此类异常值的一种有吸引力的方法。这些相当于K均值聚类的软版本。
k均值的其他假设是通过使用均值找到聚类的质心,这意味着它假设聚类在运动中必须是圆形的。在EM中,我们假设数据点可以是高斯分布的。

https://blog.csdn.net/u010159842/article/details/45954961?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

kmeans 代码;

print(__doc__)

from time import time
import numpy as np
import matplotlib.pyplot as plt

from sklearn import metrics
from sklearn.cluster import KMeans
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.preprocessing import scale

np.random.seed(42)

X_digits, y_digits = load_digits(return_X_y=True)
data = scale(X_digits)

n_samples, n_features = data.shape
n_digits = len(np.unique(y_digits))
labels = y_digits

sample_size = 300

print("n_digits: %d, \t n_samples %d, \t n_features %d"
      % (n_digits, n_samples, n_features))


print(82 * '_')
print('init\t\ttime\tinertia\thomo\tcompl\tv-meas\tARI\tAMI\tsilhouette')


def bench_k_means(estimator, name, data):
    t0 = time()
    estimator.fit(data)
    print('%-9s\t%.2fs\t%i\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f\t%.3f'
          % (name, (time() - t0), estimator.inertia_,
             metrics.homogeneity_score(labels, estimator.labels_),
             metrics.completeness_score(labels, estimator.labels_),
             metrics.v_measure_score(labels, estimator.labels_),
             metrics.adjusted_rand_score(labels, estimator.labels_),
             metrics.adjusted_mutual_info_score(labels,  estimator.labels_),
             metrics.silhouette_score(data, estimator.labels_,
                                      metric='euclidean',
                                      sample_size=sample_size)))

bench_k_means(KMeans(init='k-means++', n_clusters=n_digits, n_init=10),
              name="k-means++", data=data)

bench_k_means(KMeans(init='random', n_clusters=n_digits, n_init=10),
              name="random", data=data)

# in this case the seeding of the centers is deterministic, hence we run the
# kmeans algorithm only once with n_init=1
pca = PCA(n_components=n_digits).fit(data)
bench_k_means(KMeans(init=pca.components_, n_clusters=n_digits, n_init=1),
              name="PCA-based",
              data=data)
print(82 * '_')

# #############################################################################
# Visualize the results on PCA-reduced data

reduced_data = PCA(n_components=2).fit_transform(data)
kmeans = KMeans(init='k-means++', n_clusters=n_digits, n_init=10)
kmeans.fit(reduced_data)

# Step size of the mesh. Decrease to increase the quality of the VQ.
h = .02     # point in the mesh [x_min, x_max]x[y_min, y_max].

# Plot the decision boundary. For that, we will assign a color to each
x_min, x_max = reduced_data[:, 0].min() - 1, reduced_data[:, 0].max() + 1
y_min, y_max = reduced_data[:, 1].min() - 1, reduced_data[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

# Obtain labels for each point in mesh. Use last trained model.
Z = kmeans.predict(np.c_[xx.ravel(), yy.ravel()])

# Put the result into a color plot
Z = Z.reshape(xx.shape)
plt.figure(1)
plt.clf()
plt.imshow(Z, interpolation='nearest',
           extent=(xx.min(), xx.max(), yy.min(), yy.max()),
           cmap=plt.cm.Paired,
           aspect='auto', origin='lower')

plt.plot(reduced_data[:, 0], reduced_data[:, 1], 'k.', markersize=2)
# Plot the centroids as a white X
centroids = kmeans.cluster_centers_
plt.scatter(centroids[:, 0], centroids[:, 1],
            marker='x', s=169, linewidths=3,
            color='w', zorder=10)
plt.title('K-means clustering on the digits dataset (PCA-reduced data)\n'
          'Centroids are marked with white cross')
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.xticks(())
plt.yticks(())
plt.show()

说说 Kmeans 算法, Kmeans 算法 K 怎么设置、适用什么样数据集、怎么评价 Kmeans 聚类结果、 Kmeans 有什么优缺点?你的项目中使用 Kmeans 遇到哪些问题,怎么解决的 ?

K 设置的方法:Elbow Method and Silihouette Method

Elbow Method
这可能是确定最佳群集数的最著名方法。 它的方法也有点天真。
针对不同的k值计算平方误差的组内平方和(WSS),然后选择WSS首次开始减小的k。 在WSS vs-k的图中,这是一个弯头。

群集内平方误差之和听起来有点复杂。 让我们分解一下:
每个点的平方误差是该点与其表示形式(即其预测的聚类中心)之间的距离的平方。
WSS分数是所有分数的平方误差之和。
可以使用诸如欧几里得距离或曼哈顿距离的任何距离度量。

在这里插入图片描述
正如预期的那样,该图看起来像一条手臂,肘部清晰,k = 3。
不幸的是,我们并不总是拥有如此清晰的聚类数据。 这意味着肘部可能不清晰锐利。

在这里插入图片描述

对于数据集A,弯头在k = 3时清晰可见。但是,对于数据集B,此选择不明确。我们可以选择k为3或4。
在这种模棱两可的情况下,我们可以使用Silhouette方法。

Silihouette Method
轮廓值测量的是一个点与其自身的群集(内聚)相比其他群集(分隔)的相似程度。

Silhouette值的范围介于+1和-1之间。 较高的值是理想的,它指示该点位于正确的群集中。 如果许多点的Silhouette值均为负,则可能表明我们创建的簇太多或太少。
每个数据点i的轮廓值s(i)定义如下:

在这里插入图片描述
如果i是群集中的唯一点,则s(i)定义为等于零。 这是为了防止许多单点群集的群集数量显着增加。
在这里,a(i)是点i与它自己的群集的相似性的度量。 度量为i与群集中其他点的平均距离。

在这里插入图片描述

同样,b(i)是i与其他聚类中的点的相异度的量度
在这里插入图片描述
d(i,j)是点i和j之间的距离。 通常,欧几里得距离用作距离度量。
我之前提到过,高轮廓分数是可取的。 轮廓分数在最佳k处达到其全局最大值。 理想情况下,它应显示为“轮廓值-k”图中的峰值。
这是我们自己的数据集的图:

在这里插入图片描述

在k = 3处有一个清晰的峰值。因此,它是最佳的。
最后,可以将数据最佳地聚类为3个聚类,如下所示。
在这里插入图片描述

用 EM 算法推导解释 Kmeans
k-means是EM的一种变体,假设簇是球形的。

K-Means实际上只是应用于特定朴素贝叶斯模型的EM(期望最大化)算法。

为了证明这一点,我们首先考虑经典的朴素贝叶斯模型,该模型具有一个可以采用离散值(域大小为 k )和一组特征变量的类变量,每个特征变量都可以采用连续值(见图2)。
P(f_i = x | C = c)的条件概率分布将与通常情况略有不同。与其将这种条件概率存储为表格,不如将其存储为单个正态(高斯)分布,其均值和标准偏差为1。具体地说,这意味着:
P(f_i = x | C = c)\ sim \ mathcal {N}(\ mu_ {c,i},1)

在给定具有特征值的数据集而不是类变量的情况下,学习$ \ mu_ {c,i} $的值证明与在该数据集上运行k-means相同。

在这里插入图片描述
图2:K-Means算法是应用于该贝叶斯网络的EM算法。

如果我们知道这是贝叶斯网络的结构,但是我们不知道任何条件概率分布,则必须先运行参数学习,然后才能运行推理。

在给出的数据集中,观察到了所有特征变量(对于每个数据点),但是类变量被隐藏了。由于我们在无法观察到某些变量的贝叶斯网络上运行参数学习,因此应使用EM。

让我们回顾一下EM。在EM中,我们随机初始化模型参数,然后在(E)根据参数将值分配给隐藏变量和(M)根据完全观察到的数据计算参数之间进行交替。

E-Step:根据参数得出隐藏变量的值。如果您根据数据集中给定数据的特征来计算为类变量选择最佳值的数学方法,那么结果就是“对于每个数据点,选择最接近的质心,欧几里得距离,并指定该质心的标签。”

M-Step:根据完整的分配得出参数。如果您根据数据集中给定数据的特征计算出最佳参数值的数学方法,那么结果就是“取所有标为c的数据点的平均值”。

所以呢?好吧,这使您对k均值的质量有了一个概念。像EM一样,它证明会找到局部最优值。像EM一样,不一定要找到全局最优值。事实证明,那些随机初始值确实很重要。

KMeans的算法伪代码

在这里插入图片描述

如何优化kmeans算法
K-Means优化算法

为了克服K-Means算法收敛于局部最小值的问题,提出了一种二分K-均值(bisecting K-means)

二分K-Means(Bisecting KMeans)算法的主要思想是:首先将所有点作为一个簇,然后将该簇一分为二。之后选择能最大限度降低聚类代价函数(也就是误差平方和)的簇划分为两个簇。以此进行下去,直到簇的数目等于用户给定的数目k为止。以上隐含的一个原则就是:因为聚类的误差平方和能够衡量聚类性能,该值越小表示数据点越接近于他们的质心,聚类效果就越好。所以我们就需要对误差平方和最大的簇进行再一次划分,因为误差平方和越大,表示该簇聚类效果越不好,越有可能是多个簇被当成了一个簇,所以我们首先需要对这个簇进行划分。

比如要分成5个组,第一次分裂产生2个组,然后从这2个组中选一个目标函数产生的误差比较大的,分裂这个组产生2个,这样加上开始那1个就有3个组了,然后再从这3个组里选一个分裂,产生4个组,重复此过程,产生5个组。这算是一中基本求精的思想。二分k均值不太受初始化的困扰,因为它执行了多次二分试验并选取具有最小误差的试验结果,还因为每步只有两个质心。

https://blog.csdn.net/xiedelong/article/details/79696514

手写k-means的伪代码(就6行)
bagging和boosting是怎么做的和他们的比较
Bagging和Boosting如何获得N个学习者?

Bagging和Boosting在培训阶段通过生成其他数据来吸引N名学习者。通过随机抽样生成N个新的训练数据集,并从原始数据集中进行替换。通过替换采样,可以在每个新的训练数据集中重复一些观察。

对于Bagging,任何元素都有相同的可能性出现在新数据集中。但是,对于Boosting,将对观察值进行加权,因此其中一些观察值会更频繁地参与新集合:单次装袋和Boosting训练集多个集合带有替换的随机抽样过加权数据算法比较与这些多个集合用于训练同一学习者算法,因此产生了不同的分类器。

为什么要对数据元素加权?

至此,我们开始处理两种方法之间的主要区别。 虽然Bagging的训练阶段是并行的(即,每个模型都是独立构建的),但Boosting会以一种顺序的方式构建新的学习者:

Single Bagging和Boosting并行顺序算法比较VersusIn在Boosting算法中,每个分类器都根据数据进行训练, 并且和之前的合并计算。 在每个训练步骤之后,权重将重新分配。 错误分类的数据会增加其权重,以强调最困难的情况。 这样,后续的学习者将在培训过程中专注于他们。

分类阶段如何工作?

为了预测新数据的类别,我们只需要将N个学习者应用于新观察值即可。在袋装中,通过平均N个学习者的回答(或多数投票)来获得结果。但是,Boosting这次为N个分类器分配了第二组权重,以便对其估计进行加权平均。单次装袋和Boosting单估计简单平均加权平均算法比较与结果在Boosting训练阶段,算法将权重分配给每个结果模型。在训练数据上具有良好分类结果的学习者将被分配给较差的学习者更高的权重。因此,在评估新学习者时,Boosting还需要跟踪学习者的错误。让我们看看程序上的差异:单次装袋和强化训练阶段训练和保持训练和评估更新样本权重更新学习者权重算法比较与

一些Boosting技术包括保留或丢弃单个学习者的额外条件。例如,在最著名的AdaBoost中,维护模型所需的误差小于50%。否则,重复该迭代,直到获得比随机猜测更好的学习能力为止。

上一张图片显示了Boosting方法的一般过程,但是存在几种选择方法,它们具有不同的方法来确定在下一训练步骤和分类阶段中使用的权重。如果您想详细了解,请单击此处:AdaBoost,LPBoost,XGBoost,GradientBoost,BrownBoost。

Bagging和Boosting

没有一个彻底的赢家。它取决于数据,仿真和环境。
Bagging和Boosting组合了来自不同模型的多个估计,从而减少了单个估计的方差。因此结果可能是具有更高稳定性的模型。

如果问题在于单个模型的性能非常低,那么Bagging几乎不会获得更好的偏差。但是,Boosting可以生成误差较小的组合模型,因为它可以优化优势并减少单个模型的陷阱。

相反,如果单个模型的难度过大,那么Bagging是最佳选择。提升本身并不能避免过度拟合;实际上,这种技术本身就面临着这个问题。因此,Bagging比Boosting更有效。

区别:
Bagging技术可以是减少模型差异,防止过度拟合并提高不稳定模型准确性的有效方法。
另一方面,Boosting使我们可以通过将多个弱模型组合在一起来实现强模型。
与Bagging相比,从训练数据集中抽取的样本不会在强化练习中重新放回到训练集中。
如果分析与决策树进行比较时由Adaptive Boosting算法计算的决策边界(称为树桩),您将注意到AdaBoost计算的决策边界可能非常复杂。
尽管这可以帮助我们实现强大的预测模型,但是与单个分类器相比,集成学习增加了计算复杂性。

详细讨论了样本采样和bagging的问题
请参考我下面一个单独的文章

聊的比较多的是如何知道一个特征的重要性,如何做ensemble哪些方法比较好。聊了聊计算广告方面FM,embedding。

可以使用模型的特征重要性属性来获取数据集中每个特征的特征重要性。 特征重要性为您提供数据中每个特征的得分,得分越高,该特征对您的输出变量的重要性或相关性就越高。
具体同样参考另一篇文章

常见融合框架原理,优缺点,bagging,stacking,boosting,为什么融合能提升效果
Bagging

Bootstrap 是一种集成生成方法,该方法使用用于训练基本分类器的样本变体。对于要生成的每个分类器,Bagging从大小为N的训练集中选择(重复)N个样本,并训练一个基本分类器。重复此过程,直到达到所需的合奏大小。

bagging应与不稳定的分类器(即对训练集的变化敏感的分类器)一起使用,例如决策树和感知器。

随机子空间是一种有趣的类似方法,它使用特征的变化而不是样本的变化,通常在具有多个维度和稀疏特征空间的数据集上指出。

Boosting
Boosting通过添加正确分类“困难样本”的分类器来生成整体。对于每次迭代,boosting会更新样本的权重,这样,由于整体错误分类的样本可能具有较高的权重,因此有较高的被选择用于训练新分类器的可能性。

增强是一种有趣的方法,但是对噪声非常敏感,并且仅在使用弱分类器时才有效。 Boosting技术有多种变体,AdaBoost,BrownBoost(…),每一种都有自己的权重更新规则,以避免某些特定的问题(噪音,类不平衡……)。

stacking

stacking的思想是学习几个不同的弱学习者,并通过训练一个元模型以基于这些弱模型返回的多个预测来输出预测来组合它们。因此,我们需要定义两件事以构建我们的堆栈模型:我们要适合的L个学习者和将它们组合在一起的元模型。
例如,对于分类问题,我们可以选择KNN分类器,逻辑回归和SVM作为弱学习者,并决定学习神经网络作为元模型。然后,神经网络将以我们三个弱学习者的输出为输入,并将学习基于此返回最终预测。
因此,假设我们要适合由L个弱学习者组成的堆叠合奏。然后,我们必须遵循以下步骤:
将训练数据分为两部分
选择L个学习能力较弱的人,并使他们适合第一阶段的数据
对L个弱学习者中的每个学习者,进行第二次观察的预测
使用弱学习者的预测作为输入,在第二折上拟合元模型

在前面的步骤中,我们将数据集分为两部分,因为对用于训练弱学习者的数据的预测与对元模型的训练无关。因此,将数据集分为两部分的一个明显缺点是,我们只有一半的数据用于训练基本模型,一半的数据用于训练元模型。为了克服这一局限性,我们可以采用某种“ k折交叉训练”方法(类似于k折交叉验证中的方法),以便可以将所有观察值用于训练元数据。模型:对于任何观察,对弱学习者的预测都是通过在不包含考虑的观察值的k-1倍上训练的这些弱学习者的实例完成的。换句话说,它包括对k-1折进行训练,以便对其余折进行预测,并进行迭代,以便获得任何折的观察预测。这样做,我们可以为数据集的每次观察产生相关的预测,然后在所有这些预测上训练我们的元模型。

K-means起始点http://www.cnki.com.cn/Article/CJFDTotal-DNZS200832067.htm

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值