数据分析 | Kmeans数据分析

一、模型介绍

1. 聚类步骤

  1. 从数据中随机挑选k个样本点作为原始的簇中心
  2. 计算剩余样本与簇中心的距离,并把各样本标记为离k个簇中心最近的类别
  3. 重新计算各簇中样本点的均值,并以均值作为新的k个簇中心
  4. 不断重复第二步和第三步,直到簇中心变化趋于稳定,形成最终的k个簇

2. 原理介绍

Kmeans聚类的目标函数:
J ( c 1 , c 2 , ⋯   , c k ) = ∑ j = 1 k ∑ i n j ( x i − c j ) 2 J(c_1,c_2,\cdots,c_k)=\sum_{j=1}^k\sum_i^{n_j}(x_i-c_j)^2 J(c1,c2,,ck)=j=1kinj(xicj)2
即k个簇内样本的离差平方和之和达到最小。对目标函数求偏导(与k无关)
∂ J ∂ c j = ∑ i = 1 n j ( x i − c j ) 2 ∂ c j = ∑ i = 1 n j − 2 ( x i − c j ) \frac{\partial J}{\partial c_j}=\sum_{i=1}^{n_j}\frac{(x_i-c_j)^2}{\partial c_j}=\sum_{i=1}^{n_j}-2(x_i-c_j) cjJ=i=1njcj(xicj)2=i=1nj2(xicj)
令导函数等于零:
c j = ∑ i = 1 n j x i n j = μ j c_j = \frac{\sum_{i=1}^{n_j}x_i}{n_j}=\mu_j cj=nji=1njxi=μj
故,我们需要求的是均值。

3. k值的选择

随着k值的增加,簇内离差平方和应该不断变小,直至趋向于0。

01 拐点法

当簇内离差平方和所构成的折线图中,斜率由大突然变小,并且之后的斜率变化缓慢,则认为突然变化的点就是寻找的目标点。

python没有专门的库函数用于计算拐点,这里引用刘顺祥老师的自定义函数方案:

def k_SSE(X, clusters):
    # 选择连续的K种不同的值
    K = range(1,clusters+1)
    # 构建空列表用于存储总的簇内离差平方和
    TSSE = []
    for k in K:
        # 用于存储各个簇内离差平方和
        SSE = []
        kmeans = KMeans(n_clusters=k)
        kmeans.fit(X)
        # 返回簇标签
        labels = kmeans.labels_
        # 返回簇中心
        centers = kmeans.cluster_centers_
        # 计算各簇样本的离差平方和,并保存到列表中
        for label in set(labels):
            SSE.append(np.sum((X.loc[labels == label,]-centers[label,:])**2))
        # 计算总的簇内离差平方和 
        TSSE.append(np.sum(SSE))

02 轮廓系数法

该方法考虑了簇的密集性与分散性两个信息,若数据集被分割为理想的k个簇,那么对应的簇内样本会很密集,而簇间样本会很分散,轮廓系数计算可表示为:
S ( i ) = b ( i ) − a ( i ) m a x ( a ( i ) , b ( i ) ) S(i)=\frac{b(i)-a(i)}{max(a(i),b(i))} S(i)=max(a(i),b(i))b(i)a(i)
a ( i ) a(i) a(i)体现簇内的密集性,代表样本i与同簇内其他样本距离的平均值; b ( i ) b(i) b(i)反应了簇间的分散性,即样本i与其他非同簇样本点的距离的平均值,然后取其中的最小值。

S ( i ) S(i) S(i)接近与-1时,说明样本i的分配不合理,需要将其分配到其他簇中;当 S ( i ) S(i) S(i)近似为0时,说明样本i落在了模糊地带,即簇的边界;当 S ( i ) S(i) S(i)近似为1时,说明样本i的分配是合理的。

# 构造自定义函数,用于绘制不同k值和对应轮廓系数的折线图
def k_silhouette(X, clusters):
    K = range(2,clusters+1)
    # 构建空列表,用于存储个中簇数下的轮廓系数
    S = []
    for k in K:
        kmeans = KMeans(n_clusters=k)
        kmeans.fit(X)
        labels = kmeans.labels_
        # 调用字模块metrics中的silhouette_score函数,计算轮廓系数
        S.append(metrics.silhouette_score(X, labels, metric='euclidean'))

    # 中文和负号的正常显示
    plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
    plt.rcParams['axes.unicode_minus'] = False
    # 设置绘图风格
    plt.style.use('ggplot')    
    # 绘制K的个数与轮廓系数的关系
    plt.plot(K, S, 'b*-')
    plt.xlabel('簇的个数')
    plt.ylabel('轮廓系数')
    # 显示图形
    plt.show()
    
# 自定义函数的调用
k_silhouette(X, 15)

二、代码实现

KMeans(n_cluster=8, init='k-means++', n_init=10,max_iter=300, tol=0.0001)

  • n_cluster:用于 指定聚类的簇数
  • init:用于指定初始的簇中心设置方法,如果为’k-means++’,表示设置的初始簇中心之间相距较远;若为’random’,则表示从数据集中随机挑选k个样本作为初始簇中心;若为数组,则表示用户指定的具体簇中心。
  • n_init:指定Kmeans算法的运行次数,每次都会选择不同的簇中心,默认为10
# 读取球员数据
players = pd.read_csv(r'players.csv')
players.head()
# 绘制得分与命中率的散点图
sns.lmplot(x = '得分', y = '命中率', data = players, 
           fit_reg = False, scatter_kws = {'alpha':0.8, 'color': 'steelblue'})
plt.show()
from sklearn import preprocessing
# 数据标准化处理
X = preprocessing.minmax_scale(players[['得分','罚球命中率','命中率','三分命中率']])
# 将数组转换为数据框
X = pd.DataFrame(X, columns=['得分','罚球命中率','命中率','三分命中率'])
# 使用拐点法选择最佳的K值
k_SSE(X, 15)
# 使用轮廓系数选择最佳的K值
k_silhouette(X, 10)
# 将球员数据集聚为3类
kmeans = KMeans(n_clusters = 3)
kmeans.fit(X)
# 将聚类结果标签插入到数据集players中
players['cluster'] = kmeans.labels_
# 构建空列表,用于存储三个簇的簇中心
centers = []
for i in players.cluster.unique():
    centers.append(players.ix[players.cluster == i,['得分','罚球命中率','命中率','三分命中率']].mean())
# 将列表转换为数组,便于后面的索引取数
centers = np.array(centers)

# 绘制散点图
sns.lmplot(x = '得分', y = '命中率', hue = 'cluster', data = players, markers = ['^','s','o'],
           fit_reg = False, scatter_kws = {'alpha':0.8}, legend = False)
# 添加簇中心
plt.scatter(centers[:,0], centers[:,2], c='k', marker = '*', s = 180)
plt.xlabel('得分')
plt.ylabel('命中率')
# 图形显示
plt.show()
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
葡萄酒数据集是一个用于分析和研究葡萄酒的数据集,它包含了一些关于葡萄酒的物理化学指标,如酒精含量、酸度、和酚类化合物含量等。通过适当的数据预处理和特征工程,我们可以使用kmeans聚类分析方法对葡萄酒数据集进行聚类分析。 首先,我们需要对数据集进行探索性数据分析,了解各个变量的分布和关系。可以通过绘制直方图、散点图等方式,观察数据的分布情况和可能存在的异常值。然后,我们可以进行数据处理,包括数据清洗、缺失值处理和数据标准化等。 接下来,我们可以使用kmeans算法对葡萄酒数据集进行聚类分析。kmeans算法是一种常用的聚类算法,它通过计算数据点之间的欧氏距离,将数据划分为k个不同的簇。在聚类的过程中,我们需要选择合适的簇数k,可以使用肘部法则或轮廓系数等方法进行选择。 在应用kmeans算法之前,我们需要对数据集进行特征选择,选择一些具有代表性的特征作为输入。特征选择的目的是减少维度并提高聚类的效果。可以使用一些常用的特征选择方法,如卡方检验、皮尔逊相关系数等。 最后,我们可以将葡萄酒数据集应用于kmeans算法中,并进行聚类分析。通过聚类分析,我们可以将数据点划分为不同的簇,并观察不同簇之间的差异和相似性。可以通过绘制散点图或热力图的方式展示聚类结果,以便于对数据进行解读和可视化。 总之,葡萄酒数据集的kmeans聚类分析可以帮助我们了解不同葡萄酒之间的差异和相似性,对葡萄酒的分类和鉴定具有一定的指导意义。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ouroboroszzs

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值