美赛python学习d13——K_means聚类算法

K-Means算法的作用

基于数据间距离的远近,将若干离散的数据分成多个类

聚类遇到的问题

  1. 分成多少个类?
    手肘法则:美赛python学习d13——K_means聚类算法_第1张图片
    畸变程度之和:通俗地说就是每个类内的数据与类耳朵中心点的距离平方和,再将所有的组内平方和相加
    聚合系数折线图:随着类的个数增加,聚合系数(畸变程度之和)减少,总折线图像人的手肘一样,找到最像肘部的点,确定为最终的分类个数
  2. 每一类包括哪些元素

算法的步骤

  1. 选择类的个数K
  2. 选择K个随机点作为中心点(不一定要在原数据集中)
  3. 对于数据集中的每一个点,找到与其最近的中心点,作为这个中心点的类
  4. 找到每个类的新中心点
  5. 重新聚类,如聚类结果不变,则算法停止
    美赛python学习d13——K_means聚类算法_第2张图片

实例

将商场客户分类,为商场确定销售策略和目标客户

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

dataset = pd.read_csv("Mall_Customers.csv")

x = dataset.iloc[:, 3:5].values
# 运用手肘法确定需要的分类数
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=0)
    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()
# 确定分类数后进行聚类分析
kmeans=KMeans(n_clusters=5,max_iter=300,n_init=10,init='k-means++',random_state=0)
y_kmeans=kmeans.fit_predict(x)
#将分类结果可视化
plt.scatter(x[y_kmeans==0,0],x[y_kmeans==0,1],s=100,c='red',label='Cluster 0')
plt.scatter(x[y_kmeans==1,0],x[y_kmeans==1,1],s=100,c='blue',label='Cluster 1')
plt.scatter(x[y_kmeans==2,0],x[y_kmeans==2,1],s=100,c='green',label='Cluster 2')
plt.scatter(x[y_kmeans==3,0],x[y_kmeans==3,1],s=100,c='cyan',label='Cluster 3')
plt.scatter(x[y_kmeans==4,0],x[y_kmeans==4,1],s=100,c='magenta',label='Cluster 4')
plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],s=300,c='yellow')
plt.legend()
plt.show()



K–Means算法的初值陷阱及K–Means++算法

K–Means算法选取的初值不同,分类结果也可能不同,需要决出最优的分类结果
K–Means++算法选择初始聚类中心的基本原则是:初始的聚类中心的距离要尽可能地远
K–Means++算法的步骤如下
美赛python学习d13——K_means聚类算法_第3张图片

你可能感兴趣的:(数模美赛,聚类,python,算法)