机器学习——聚类——商场客户聚类

2023-11-08

聚类的介绍

…………………………………………

…………………………………………

案例——商场客户聚类

目录

聚类的介绍

案例——商场客户聚类

一、读取数据

二、聚类

KMeans函数的参数讲解:

KMeans属性列表

KMeans接口列表​

三、查看数据及可视化

sort_values()方法

groupby()的常见用法

 groupby()的配合函数

 四、聚类评价指标。计算聚簇数量从2到19时的轮廓系数。


一、读取数据

import pandas as pd 
beer=pd.read_csv('beer.txt',sep=' ')
#输出文件内容
beer

pandas.read_csv

常用参数为:header, sep, name……

header(表头):

指定行数用来作为列名,数据开始行数。

如果文件中没有列名,则默认为0,否则设置为None。如果明确设定header=0 就会替换掉原来存在列名。

header参数可以是一个list例如:[0,1,3],这个list表示将文件中的这些行作为列标题(意味着

每一列有多个标题),介于中间的行将被忽略掉(例如本例中的2;本例中的数据1,2,4行将被作为多级标题出现,第3行数据将被丢弃,dataframe的数据从第5行开始)。

注意:如果skip_blank_lines=True 那么header参数忽略注释行和空行,所以header=0表示第一

行数据而不是文件的第一行。
 

sep(分隔符):

​ 指定分隔符。如果不指定参数,则会尝试使用逗号分隔。分隔符长于一个字符并且不是‘\s+’,

将使用python的语法分析器。并且忽略数据中的逗号。正则表达式例子:’\r\t’

 names(列名):

用于结果的列名列表,如果数据文件中没有列标题行,就需要执行header=None。默认列表中不

能出现重复,除非设定参数mangle_dupe_cols=True。

二、聚类。把除name之外的所有属性当作输入特征

name 为离散型,所有使用drop删除此行,剩下的为连续性数据

n_clusters:初始化一个3个的聚簇

random_state:及初始化生成的3个聚簇进行标记
确定质心初始化的随机数生成。使用int可以使随机性具有确定性。 确定质心初始化的随机数生成.使用int可以使随机性具有确定性.

fit训练过程:

1.(随机)选择K个聚类的初始中心;

2.对任意一个样本点,求其到K个聚类中心的距离,将样本点归类到距离最小的中心的聚类,如此迭代n次;

3.每次迭代过程中,利用均值等方法更新各个聚类的中心点(质心);

4.对K个聚类中心,利用2,3步迭代更新后,如果位置点变化很小(可以设置阈值),则认为达到稳定状态,迭代结束,对不同的聚类块和聚类中心可选择不同的颜色标注。
 

#准备输入特征X
X=beer.drop('name',axis=1)
from sklearn.cluster import KMeans
km=KMeans(n_clusters=3,random_state=1)
km.fit(X)

drop函数的使用:删除行、删除列:

参数名称 参数取值 参数意义
axis 0 or ‘index’, 1 or ‘columns’ , default 0 确定是删除包含缺失值的行还是列
how ‘any’ or ‘all’, default ‘any’ 表明是至少存在一个NAN值还是全为NAN值时执行删除操作
thresh int, 可选 指定存在多少个NAN值才进行删除操作
subset  array, 可选 可选子集列表
inplace bool, default False 如果为真,执行inplace操作,并返回None

KMeans函数的参数讲解:

1、n_clusters : 聚类中心数量(开始时需要产生的聚类中心数量),默认为8

2、max_iter : 算法运行的最大迭代次数,默认300

3、tol: 容忍的最小误差,当误差小于tol就会退出迭代(算法中会依赖数据本身),默认为1e-4

4、n_init : k-means算法会随机运行n_init次,最终的结果将是最好的一个聚类结果,默认10

5、init : 聚类中心的初始化方案,有三个选择{'k-means++', 'random' or an ndarray}

  5.1、 'k-means++' : 默认选项,初始化过程如下

(1)、从输入的数据点集合(要求有k个聚类)中随机选择一个点作为第一个聚类中心;

(2)、对于数据集中的每一个点x,计算它与最近聚类中心(指已选择的聚类中心)的距离D(x);

(3)、选择一个新的数据点作为新的聚类中心,选择的原则是:D(x)较大的点,被选取作为聚类中心的概率较大;(4)、重复2和3直到k个聚类中心被选出来

  5.2、'random': 随机选择k个实例作为聚类中心

  5.3、ndarray:如果传入为矩阵(ndarray),则将该矩阵中的每一行作为聚类中心

6、algorithm :可选的K-means距离计算算法, 可选{"auto", "full" or "elkan",default="auto"}

       6.1"full":传统的距离计算方式.

       6.2"elkan":使用三角不等式,效率更高,但是目前不支持稀疏数据。1、计算任意两个聚类中心的距离;2当计算x点应该属于哪个聚类中心时,当发现2*S(x,K1)<S(x,K2)时,根据三角不等式,S(x,K2)>S(x,K1),

       6.3"auto":当为稀疏矩阵时,采用full,否则elkan。

7、precompute_distances : 是否将数据全部放入内存计算,可选{'auto', True, False},开启时速度更快但是更耗内存.

       7.1、'auto' : 当n_samples * n_clusters > 12million,不放入内存,否则放入内存,double精度下大概要多用100M的内存

       7.2、True : 进行预计算

       7.3、False : 不进行预计算

8、n_jobs : 同时进行计算的核数(并发数),n_jobs用于并行计算每个n_init,如果设置为-1,使用所有CPU,若果设置为1,不并行,如果设置小于-1,使用CPU个数+1+n_jobs个CPU

9、random_state : 用于随机产生中心的随机序列

10、verbose : 是否输出详细信息,默认为0,bush

11、copy_x : 是否直接在原矩阵上进行计算。默认为True,会copy一份进行计算。

KMeans属性列表

KMeans接口列表

三、查看数据及可视化

在表beer中添加一列cluster放入标签数据,km.labels_每个样本点对应的标签,并进行升序排序

beer['cluster']=km.labels_
beer.sort_values(by='cluster')

sort_values()方法

sort_values(by, axis=0, ascending=True, inplace=False, kind=‘quicksort’, na_position=‘last’)

参数 含义
axis 如果axis=0,那么by=“列名”; 如果axis=1,那么by=“行名”;
ascending True则升序,可以是[True,False],即第一字段升序,第二个降序
inplace 是否用排序后的数据框替换现有的数据框 ,True,或者False
kind 排序方法
na_position {‘first’, ‘last’}, default ‘last’,默认缺失值排在最后面

 查看每个聚类的每维特征上的平均值(即聚簇中心点)

centers=beer.groupby('cluster').mean()
centers

groupby()的常见用法

 函数  适用场景  备注
df.groupby(‘key1’)    一列聚合 分组键为列名(可以是字符串、数字或其他Python对象)
df.groupby([‘key1’,‘key2’])  多列聚合  分组键为列名,引入列表list[]
df[‘data1’].groupby(df[‘key1’]).mean() 按某一列进行一重聚合求均值   分组键为Series
A=df[‘订单编号’].groupby([ df[‘运营商’], df[‘分类’], df[‘百度圣卡’] ]).count()  按某一列进行多重聚合计数 分组键为Series,引入列表list[]
df[‘data1’].groupby([states,years]).mean() 分组键与原df无关,而是另外指定的任何长度适当的数组 分组键是数组,state和year均为数组

 groupby()的配合函数

函数 适用场景 备注
.mean() 均值
.count() 计数
.min() 最小值
.mean().unstack() 求均值,聚合表的层次索引不堆叠
.size() 计算分组大小 GroupBy的size方法,将返回一个含有分组大小的Series
.apply()
.agg()

#可视化
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
colors =np.array(['red','green','blue','yellow'])
plt.scatter(beer.calories,beer.alcohol,c=colors[beer.cluster],s=50)
plt.scatter(centers.calories,centers.alcohol,linewidths=3,marker='+',s=300,c='black')
plt.xlabel('calories')
plt.ylabel('alcohol')

 四、聚类评价指标。计算聚簇数量从2到19时的轮廓系数。

from sklearn import metrics
k_range=range(2,20)
scores=[]
for k in k_range:
    km=KMeans(n_clusters=k,random_state=1)
    km.fit(X)
    scores.append(metrics.silhouette_score(X,km.labels_))
plt.plot(k_range,scores)
plt.xlabel('Number of clusters')
plt.ylabel('Silhouette Coefficient')
plt.grid(True)

聚类性能评估-轮廓系数 - 知乎

轮廓系数(Silhouette Coefficient)

是聚类效果好坏的一种评价方式。轮廓系数取值范围为[-1,1],取值越接近1则说明聚类性能越好,相反,取值越接近-1则说明聚类性能越差。

a:某个样本与其所在簇内其他样本的平均距离
b:某个样本与其他簇样本的平均距离
针对某个样本的轮廓系数s为:

聚类总的轮廓系数SC为:

轮廓系数的优点:

轮廓系数为-1时表示聚类结果不好,为+1时表示簇内实例之间紧凑,为0时表示有簇重叠。
轮廓系数越大,表示簇内实例之间紧凑,簇间距离大,这正是聚类的标准概念。

轮廓系数的缺点:

对于簇结构为凸的数据轮廓系数值高,而对于簇结构非凸需要使用DBSCAN进行聚类的数据,轮廓系数值低,因此,轮廓系数不应该用来评估不同聚类算法之间的优劣,比如Kmeans聚类结果与DBSCAN聚类结果之间的比较。
根据折线图可直观的找到系数变化幅度最大的点,认为发生畸变幅度最大的点就是最好的聚类数目。
 

完整代码:

import pandas as pd 
beer=pd.read_csv('beer.txt',sep=' ')
beer

#准备输入特征X
X=beer.drop('name',axis=1)
from sklearn.cluster import KMeans
km=KMeans(n_clusters=3,random_state=1)
km.fit_predict(X)

beer['cluster']=km.labels_
beer.sort_values(by='cluster')

centers=beer.groupby('cluster').mean()
centers

#可视化
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
colors =np.array(['red','green','blue','yellow'])
plt.scatter(beer.calories,beer.alcohol,c=colors[beer.cluster],s=50)
plt.scatter(centers.calories,centers.alcohol,linewidths=3,marker='+',s=300,c='black')
plt.xlabel('calories')
plt.ylabel('alcohol')

from sklearn import metrics
k_range=range(2,20)
scores=[]
for k in k_range:
    km=KMeans(n_clusters=k,random_state=1)
    km.fit(X)
    scores.append(metrics.silhouette_score(X,km.labels_))
plt.plot(k_range,scores)
plt.xlabel('Number of clusters')
plt.ylabel('Silhouette Coefficient')
plt.grid(True)


今天看到了一句话:

当你已经差到谷底的时候,已经不能再差了,那无论你做什么,都是在走上坡路。

努力奋斗,你行滴!

点个小♥

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

机器学习——聚类——商场客户聚类 的相关文章

  • ValueError: column index (256) not an int in range(256)

    pandas 保存为xls时最大列为256 改为保存csv格式可避免该限制 解决方法 pd DataFrame in shp pre to csv 各区站点 file 14 17 csv
  • 软件开发管理参考网站

    BDD http en wikipedia org wiki Behavior Driven Development Scrum http zh wikipedia org zh Scrum UserCase http www hudong
  • Kubernetes 资源管理:最大化集群性能

    今天是 DevOps云学堂 与你共同进步的第 54天 Kubernetes 资源管理是部署和管理容器化应用程序的一个关键方面 它允许管理员控制系统不同部分之间计算资源的分配 例如CPU 内存和存储 有效的资源管理可确保应用程序获得正确运行所
  • Latex 字体的设置

    一 字体族的设置 1 说明 1 字体命令 textrm Roman Family 在花括号内的字体都是Roman Family 字体 2 字体声明 rmfamily Roman Family 该命令下面的字体都是是Roman Family字
  • Vim几种跳转方式

    Vim几种跳转方式 ps 以下时我常用的一些跳转指令 用于参考和复习记忆 还有一些后续会更新 文件内跳转 移动光标 普通模式下左h 右l 上k 下j 可以使用数字 hlkj 实现跳跃式移动 字符间跳转 跳转到当前字符的前面 普通模式下i 跳

随机推荐

  • CesiumJS三维案例

    WebGL近几年越来越被人们所关注 但是二三维开发难度也比普通web要高出许多 不管我们是在在开发或者是学习过程中 往往需要耗费大量的时间去查阅资料和研究官方案例 让本来就非常紧张的而宝贵的精力卷到了不关紧要的地方 而大多二三维的包 ope
  • apk文件结构解析一

    Apk文件用WINRAR压缩软件解压缩后 如下图所示 主要是三个文件 lib META INF res 和三个文件夹 AndroidManifest xml classes dex resources arsc 用工具展开可以看到如下所示的
  • Protobuf在java中的简单使用实例

    TTprotobuf是一种跨语言的数据转换协议 由google开源的 已支持大部份语言 在一般的数据交互过程中都是使用json xml等来做数据的转换 这其中涉及复杂的解析与序列化反序列化问题 如果在大量数据并发请求时 也会导致性能问题 p
  • Vue-过滤器

    Vue 过滤器 过滤器 过滤器 Filters 是vue 为开发者提供的功能 常用于文本的格式化 过滤器可以用在两个地方 插值表达式 和 v bind 属性绑定 过滤器应该被添加在JavaScript 表达式的尾部 由 管道符 进行调用 p
  • 图像增强之同态滤波python实现——20221204工作总结

    目录 参考 同态滤波python实现 代码 效果 参考 1 https wenku baidu com view 4eb598180a12a21614791711cc7931b765ce7ba9 html wkts 167005422236
  • IDEA 调试前端代码JS 及安装JetBrains IDE Support

    收藏从未间断 学习从未开始 不需要F12窗口 不需要JS代码写debugger断点 不需要写console log 输出 一 JetBrains IDE Support 1 必须使用谷歌浏览器 安装JetBrains IDE Support
  • go 进阶 sync相关: 一. sync.atomic​ 原子操作

    sync atomic 原子操作 一 sync atomic 基础 sync atomic Value 二 sync atomic 源码分析 1 ifaceWords 2 Store 添加 3 Load 获取 一 sync atomic 基
  • c#Replace用法

    string txt 333 333 txt Replace Console WriteLine 赋值前 txt txt txt Replace Console WriteLine 赋值后 txt
  • Grape 依赖管理器

    本文参考自Groovy文档 The Grape dependency manager 本文代码大部分来自Groovy官方文档 Groovy自带了一个嵌入式的jar依赖管理器 这个管理器的主要作用应该是配合Groovy脚本使用 让我们不需要任
  • Struts2 几种校验

    1 Struts2手动校验 1 重写actionsupport类的validate方法 action需要继承ActionSupport类 public class StrutshAction extends ActionSupport 在v
  • 三种基于感知哈希算法的相似图像检索技术

    大家都用google或baidu的识图功能 上面就是我搜索一幅图片的结果 该引擎实现相似图片搜素的关键技术叫做 感知哈希算法 Perceptual hash algorithm 它的作用是对每张图片生成一个 指纹 fingerprint 字
  • Unity插件-NGUI

    1 基本使用 NGUI gt 选项 gt Reset Perfab Toolbar 显示预制体UI组件 可以直接拖拽到场景中 使用NGUI 必须要有一个UIRoot作为父组件 在场景中的UIRoot中右键单击 然后点Create来创建组件
  • 中文垃圾邮件分类。2种特征提取,词袋特征,IFIDF分布特征,贝叶斯NB,LR,SVM各自表现的实战示例代码

    结论 数据 ham data txt spam data txt stop words utf8 数据处理 author liushuchun import re import string import jieba 加载停用词 with
  • 【TensorFlow】远程使用jupyter和TensorBoard

    1 远程jupyter notebook 在服务器端以如下方式启动jupyter jupyter notebook ip 0 0 0 0 结果如下 本地输入上述网址 将括号中的内容替换为服务器IP 即可启动 2 远程TensorBoard
  • Excel Vba范例

    第1部分 单元格选择技巧与选区统计 第1章 单元格与区域选择技巧 实例1选择A列最后一个非空单元格 Sub 选择A列最后一个非空单元格 Range a1048576 End xlUp Select End Sub 讲解 1 Range 返回
  • Promise初步详解(resolve,reject,catch)

    Duang 最近搭建了一个自己的博客小破站 欢迎各位小伙伴来访吖 ares coder blog portalhttps www ares stack cn blog service game 一 何为Promise 为了直观一点 首先我们
  • 利用nginx搭建简单图片服务器实现负载均衡

    在我们搭建一个网站的时候 往往有时候会加载更多的图片 如果都从tomcat服务器来获取静态资源 这样会增加我们服务器的负载 使得服务器运行 速度非常慢 这时我们可以使用nginx服务器来加载这些静态资源 这样就可以实现负载均衡 为我们的To
  • 【高危】企业微信私有化2.5-2.6.93版本后台API未授权访问漏洞

    漏洞描述 企业微信私有化2 5 x版本及2 6 930000版本以下后台中存在接口未授权访问漏洞 攻击者通过访问 cgi bin gateway agentinfo接口可获得Secret 从而利用开放API获取企业通讯录等敏感信息及企业微信
  • 【硬件学习之路】

    硬件学习之路 一个22年毕业的飞行器控制专业转电子的硬件小白 这篇文章将记录我实习以及工作经历 也就是自己的学习笔记啦 硬件本来就是一个需要积累的东西 学海无涯 希望自己能不断丰富自己 而我的工作岗位是助理工程师 主要是学习绘制原理图 板上
  • 机器学习——聚类——商场客户聚类

    聚类的介绍 案例 商场客户聚类 目录 聚类的介绍 案例 商场客户聚类 一 读取数据 二 聚类 KMeans函数的参数讲解 KMeans属性列表 KMeans接口列表 三 查看数据及可视化 sort values 方法 groupby 的常见