基于Python的k均值聚类不同规格的商品名

基于Python的k均值聚类不同规格的商品名

前言

聚类的目标是使得同一簇内的点之间的距离较短,而不同簇中点之间的距离较大。以此来区分不同的群体。

本篇讲述使用k均值算法对超市购物记录集中的商品名称进行聚类,实现同一类商品,不同规格汇聚成一个大类的要求。

原理分析及流程

聚类介绍

聚类的目标是使得同一簇内的点之间的距离较短,而不同簇中点之间的距离较大。以此来区分不同的群体。
两种主要的聚类方法是:层次法和点分配法。
1.层次法
将每个点都看成簇,簇与簇之间按照接近度(closeness)来组合,当达到预先给定的簇数目,或者簇的紧密度达到预定值时停止聚簇。
2.点分配法
先设置初始化簇心,然后按照某个顺序依次将每个点分配到最适合的簇中。可以进行簇合并或分裂,或者当点为离群点时可以不将该点分配到任何簇中。

距离测度

欧式空间下的点集采用距离测度来进行聚类,常见的距离测度有
假定有一些点组成的集合,我们称这个集合为空间。该空间下的距离测度是一个函数d(x,y),以空间中的两个点作为参数,输出是一个实数值。该函数必须满足下列准则:
(1)d(x,y)≥0(距离非负);
(2)当且仅当x=y时,d(x,y)=0(只有点到自身的距离为0,其他距离都大于0);
(3)d(x,y)=d(y,x)(距离具有对称性);
(4)d(x,y)≤d(x,z)+d(z,y)(三角不等式。
三角不等式是上述条件中最复杂的条件。它的直观意义是:如果从x点进行到y点,那么经过某个特定的第三点z不会有任何好处。三角不等式准则使得所有的距离测度表现得如同描述的是从一个点到另一个点的最短路径的长度。
常见的距离测度有:欧氏距离、jaccard距离、余弦距离、编辑距离、海明距离、马氏距离等。

k-均值算法

k-均值算法的步骤是先选择明显不在相同簇里的k个点为簇心,再对剩余的点,计算它与每个簇心的距离,加入距离最近的那个簇,并根据新数据调整簇心,如此反复,直到簇心基本收敛。
若要更加详细了解请查看这一篇:KMeans详细介绍

k值选择

一个该解决的问题就是k值应该选择多少?即应该聚为几个簇较为合理。如果簇数选择太多的话,我们可能把原本应该是同一个簇的样本给拆分了,反之,我们可能把原本不该是同一个簇的两个样本聚集到了同一个簇中。
为了解决这个问题,通常我们会使用探索法,即在给定不同k值下,对比某些评估指标的变动情况,进而选择一个比较合理的k值。三种常用的评估方法是:簇内离差平方和拐点法、轮廓系数法以及间隔量统计法。

实现流程

所给数据集basket_row.csv的每一行是一次购物中的商品,目标是对超市购物记录集中的商品名称进行聚类,实现同一类商品,不同规格汇聚成一个大类。
首先我们按行读取数据并拆分成单独的商品名(去重)。此处我们的商品名为不可直接计算距离的字符串,所以我们采用编辑距离作为距离测度,具体做法是将每一个商品与所有计算编辑距离,形成一个向量,如果商品名称接近,形成的向量可想而知应该是比较接近的,然后我们对所有向量进行聚类,即是对商品进行聚类。具体步骤如下:

在这里插入图片描述

具体实现

导入所需要的包

# 导入所需要的包
import pandas as pd
import Levenshtein
from sklearn.cluster import KMeans

商品名去重后保存起来,查看其前5行如下:

In [4]: data_F.head()
Out[4]:
            shopname
0             苦瓜(一级)
1             南瓜(一级)
2  蒙牛益生菌酸牛奶(原味)1.2kg
3     光明酸牛奶(红枣味)180g
4                鲜鸡蛋

定义一个与其他所有商品计算编辑距离的函数calculate_compile_distance,并对所有商品使用,求出向量矩阵,查看其前5行如下:

在这里插入图片描述

然后提取出向量矩阵,并设置合理的簇数进行聚类。

In [12]: # 提取向量矩阵
    ...: X = data_F.drop('shopname', axis = 1)
    ...:
    ...: # 设置合理的簇数进行聚类
    ...: kmeans = KMeans(n_clusters=1900)
    ...: kmeans.fit(X)
Out[12]:
KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=300,
       n_clusters=1900, n_init=10, n_jobs=None, precompute_distances='auto',
       random_state=None, tol=0.0001, verbose=0)

聚类完成后,将商品名与其类别标签整合,按照类别标签为key进行分桶,分到所属的簇中,保存那些商品数量大于2的簇(即有不同的规格),查看其中部分数据如下:

['海天特级味极鲜酱油500ml', '海天特级一品鲜酱油500ml']
['上好佳芝士条40g', '上好佳鲜虾片40g']
['喜之郎果冻爽苹果味150克', '喜之郎果冻爽荔枝味150克', '喜之郎果冻爽菠萝味150克', '喜之郎果冻爽柠檬味150克', '喜之郎果冻爽香橙味150克']
['味聚特烧烤藕片80克', '味聚特山椒藕片80克']
['二级哈密瓜', '一级哈密瓜']

如上结果所示,我们将相同商品不同规格聚为了一类。
注:此处的聚类结果可能由于簇数的设置不合理而使得部分结果不合理,我们可以多次试探寻找更加合理的簇数

总结

聚类的目标是使得同一簇内的点之间的距离较短,而不同簇中点之间的距离较大。以此来区分不同的群体。

聚类在实际中有许多应用,如:划分不同的消费人群、商品热度等等,聚类的算法有许多,各自有不同的适用场景,聚类在实际中可以给我们提供多方面的参考。

附录

数据集:basket_row.csv 及完整代码已放置于:Github

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. 项目背景 基于项目提供的汽车相关数据,通过聚类分析的方法实现汽车产品聚类,以构建汽车产品画像、分析产品定位、完成汽车竞品分析等要求。 2. 项目数据 项目提供的汽车数据包括26个字段共205条数据,数据文件为“car_price.csv” 26个字段可以划分为类别型变量和数值型变量两种,包括汽车的长/宽/高、汽车净重、燃油系统、燃油类型、驱动类型、峰值转速、里程数、汽车价格等。 3. 项目要求 通过聚类的方法构建汽车产品画像、分析不同类别汽车的产品定位,寻找Volkswagen大众汽车的竞品品牌。 4. 项目思路 第一步:数据字段理解 根据项目所提供的数据,对数据中26个字段进行理解。结合汽车行业的相关知识,26个字段可以大致归为两类:第一类是车辆自身属性(如燃油系统、燃油类型、汽缸数、峰值转速、汽车长宽高等);第二类是车辆的市场属性(如车辆称、车辆价格、风险评估等级)。 26个字段主要分为数值型变量和类别型变量两类。 第二步:原始数据描述性统计及变量分布可视化 对原始数据进行描述性统计并对数据中的字段分布进行可视化(详情见主文档)。通过对原始数据的观察,数据不存在缺失值、不存在重复值,“CarName”字段存在部分车辆品牌称错误的情况。 第三步:确定聚类方法,明确聚类要求 通过对原始数据的变量观察,该数据变量主要为数值型变量和类别型变量两类,且类别型变量数量较多,常用的K-means聚类只能分析数值型变量,无法考虑类别型变量所包含的信息。二阶段聚类法适用于包含数值型和类别型变量的混合数据,因此考虑使用二阶段聚类法分析数据。 二阶段聚类法的要求是:类别型变量符合多项式分布(即变量的值分属几个类别);数值型变量间要相互独立,且数值型变量近似服从正态分布。项目所给出的数据中,类别型变量符合多项式分布,因此仅需进一步观察并处理数值型变量。 第四步:特征工程 数据清洗与新变量生成。原始数据指给出了车辆的称,没有给出车辆所属品牌,结合最终聚类分析的需要,根据“CarName”字段提取出车辆所属品牌信息,命为“brand”。同时对品牌称中的错误拼写进行清洗。 变量相关性分析与可视化。由于二阶段聚类要求数值型变量间相互独立,所以需要对数值型变量间的相关性进行查看与处理。相关性分析结果表示14个数值型变量之间存在高相关性情况,需要结合汽车知识背景与变量特征进行进一步处理。 高相关变量的处理——“highwaympg”和“citympg”呈高度正相关。其实不管是高速mpg还是城市mpg,其本质都是mpg指标,而且通过观察数据,二者之间的差异较小(极值、均值),因此考虑将二者合并为一个指标'mpg',计算方式为取二者均值:mpg=(highwaympg+citympg)/2; 高相关性变量的处理——“price”变量与其余变量产生高相关性的频数最多,可能是因为车辆自身属性和配置的变动会直接影响着车辆的市场价格。此外,与其他变量相比,price属性属于车辆的市场销售属性(而非车辆自身属性),在聚类中更适合作为类别型变量,对车辆的价位进行划分,因此,考虑将price变量转换为类别型变量,按照其价格分布划分为Low price(20000)三类; 高相关性变量的处理——对于其余数值型变量,变量数目较多且多个变量之间存在相关性,因此考虑使用因子分析对数值型变量进行降维,以减少数值型变量的数目并使变量间相互独立。 第五步:数值型变量因子分析结果(基于SPSS实现) 利用SPSS对数值型变量进行因子分析,KMO值>0.8,巴特利球形检验p值=0,说明参与因子分析的变量间存在相关性,可以进行因子分析。最终得到两个因子。 第一个因子包括:车长、车宽、车净重、引擎尺寸、车轴距、mpg、马力、车内径比。简单将该因子归纳为车辆截面与马力因子; 第二个因子包括:车高、峰值转速、车压缩比。简单将该因子归纳为车辆垂面与转速因子; 第六步:两阶段聚类及结果(基于SPSS实现) 对处理后的数据进行两阶段聚类,最终将205辆车聚为两类。 根据SPSS聚类结果,第一类中包含120条车辆数据,占总数据的58.5%;第二类中包含85条车辆数据,占总数据的41.5%。两类簇数据规模近似,没有过大或过小的类簇。 根据SPSS聚类结果,聚类质量属于“良好”范围,仍有进一步改进和优化的空间。 根据SPSS聚类结果,显著区分两类类簇的变量(重要性>0.6)按重要性大小排序依次是驱动类型、燃油系统、车辆截面与马力因子、价格范围。 汽车产品画像与产品定位 根据区分类簇的四个重要标签来对数据中的汽车产品进行产品画像与产品定位。 第一类画像:驱动类型多为fwd(前轮驱动),燃油系统多

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值