Machine Learning A-Z学习笔记13-Kmeans

Machine Learning A-Z学习笔记13-Kmeans

1.简单原理

在这里插入图片描述

K-means算法,也称为K-平均或者K-均值,一般作为掌握聚类算法的第一个算法。

简单来说就是,先假定要分K个类别,然后基于欧氏距离,将左图灰色数据点分成K个类别。所以会有下面两个核心问题:

  • 如何确定类别个数,即K应该等于多少?
  • 不靠人体标签的情形下,如何确定每一灰色数据点应该要被分到哪一类?

在这里插入图片描述

1.指定想要的类别个数K

2.随机在数据空间中选择K个位置(不一定要从数据集中挑选),将其作为每个初始类别的中心

3.这步称作初始化根据每个数据点与各群中心的距离判断各数据点的相应类别,这步称作分配

4.移动群中心,这步称作更新

5.重新分配,若分配结果与步骤3结果相同,则代表聚类完成;若分配结果与步骤3结果不同,则回到步骤4,这步称作循环

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

初始点选择陷阱

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

K-Means++算法
解决K-Means算法对初始簇心比较敏感的问题,K-Means++算法和K-Means算法的区别主要在于初始的K个中心点的选择方面,K-Means算法使用随机给定的方式,K-Means++算法采用下列步骤给定K个初始质点:
从数据集中任选一个节点作为第一个聚类中心;
对数据集中的每个点x,计算x到所有已有聚类中心点的距离和D(X),基于D(X)采用线性概率选择出下一个聚类中心点(距离较远的一个点成为新增的一个聚类中心点而不是最远的一个点是由于最远点可能为异常点,这里的选取规则是计算出M个距离团较远的点,然后随机选择出一点);
重复步骤2直到找到k个聚类中心点。
缺点:
由于聚类中心点选择过程中的内在有序性,在扩展方面存在着性能方面的问题(第k个聚类中心点的选择依赖前k-1个聚类中心点的值)。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

K-means还有一个问题在,如何正确的选择类别个数K。从第二张图的指标公式(Within Cluster Sum of Squares, WCSS, 组内平方和)可以直接知道,理想上,如果3个子项都为0,代表每个数据点都被正确的分配(因为每个数据点都完全重叠于群中心),但我们目标并不是最小化,因为如果真的要让WCSS为0,则K必须等于总数据点个数,这样的分类跟没有是一样的。理想上最佳的K值应该是最大转折处(Elbow method, 手肘法),也就是K=3,再大个K值其实已经无意义了。但手肘法不是绝对的,它只是帮助你客观判断,实际上K应该等于多少是取决于你的研究所需。

2.相关代码


# K-Means Clustering
"""
透过客户消费能力指数以及年龄进行分群
"""

# Importing the libraries

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# Importing the dataset

dataset = pd.read_csv('Mall_Customers.csv')
X = dataset.iloc[:, [3, 4]].values
# y = dataset.iloc[:, 3].values

# Splitting the dataset into the Training set and Test set

"""from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)"""

# Feature Scaling
透过客户消费能力指数以及年龄进行分群
"""from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)
sc_y = StandardScaler()
y_train = sc_y.fit_transform(y_train)"""

# Using the elbow method to find the optimal number of clusters
"""
建立K-means并且计算组内平方和,以确定要分几群
-range(1, 11):假设要分1~10群
-wcss:组内平方和
max_iter = 300:迭代次数
n_init = 10:每次计算时要对几个群中心进行计算
init = 'k-means++':群中心的初始化方法
"""
from sklearn.cluster import KMeans
wcss = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters = i, max_iter = 300, n_init = 10, init = 'k-means++', random_state = 42)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)
plt.plot(range(1, 11), wcss)
plt.title('The Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

# Fitting K-Means to the dataset
"""
模型训练
-n_clusters = 5:根据前面的结果,我们知道分5组较适合
"""
kmeans = KMeans(n_clusters = 5, init = 'k-means++', random_state = 42)
y_kmeans = kmeans.fit_predict(X)

# Visualising the clusters
"""
结果可视化
-s = 100:数据点尺寸
-X[y_kmeans == 0, 0]:X[被归类于0组的X轴第1轴]
-X[y_kmeans == 0, 1]:X[被归类于0组的X轴第2轴]
"""
plt.scatter(X[y_kmeans == 0, 0], X[y_kmeans == 0, 1], s = 100, c = 'red', label = 'Cluster 1')
plt.scatter(X[y_kmeans == 1, 0], X[y_kmeans == 1, 1], s = 100, c = 'blue', label = 'Cluster 2')
plt.scatter(X[y_kmeans == 2, 0], X[y_kmeans == 2, 1], s = 100, c = 'green', label = 'Cluster 3')
plt.scatter(X[y_kmeans == 3, 0], X[y_kmeans == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4')
plt.scatter(X[y_kmeans == 4, 0], X[y_kmeans == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5')
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s = 300, c = 'yellow', label = 'Centroids')
plt.title('Clusters of customers')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.legend()
plt.show()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值