KMmeans聚类学习的使用介绍:

KMmeans聚类学习的使用介绍:,第1张

KMmeans聚类学习的使用介绍: 一、KMeans算法介绍:

KMeans算法名称中的K代表类别数量,Means代表每个类别内样本的均值,所以KMeans算法又称为K-均值算法。KMeans算法以距离作为样本间相似度的度量标准,将距离相近的样本分配至同一个类别。样本间距离的计算方式可以是欧氏距离、曼哈顿距离、余弦相似度等,KMeans算法通常采用欧氏距离来度量各样本间的距离。

KMeans算法的核心思想是对每个样本点计算到各个中心点的距离,并将该样本点分配给距离最近的中心点代表的类别,一次迭代完成后,根据聚类结果更新每个类别的中心点,然后重复之前 *** 作再次迭代,直到前后两次分类结果没有差别。如下图所示的简单案例解释了KMeans算法的原理,该案例的目的是将8个样本点聚成3个类别(K=3)。

二、KMeans聚类接口:

导入模块:

#导入聚类模块
from sklearn.cluster import KMeans  
#导入文件
from sklearn.datasets import load_iris,make_blobs 
from matplotlib import pyplot as plt
import numpy as np

获取数据:

iris = load_iris()
data = iris.data[:,:2] #特征
target = iris.target  #验证标签
plt.scatter(data[:,0],data[:,1],c=target)


建立训练模型:

#建立模型并训练
km_model = KMeans(n_clusters=3).fit(data)

获取聚类结果:

#最终的聚类中心
cc = km_model.cluster_centers_
#获取聚类的标签
km_model.labels_

参数的介绍:

n_clusters:整形,缺省值=8 【生成的聚类数,即产生的质心(centroids)数。】
max_iter:整形,缺省值=300
执行一次k-means算法所进行的最大迭代数。
n_init:整形,缺省值=10
用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。
init:有三个可选值:’k-means++’, ‘random’,或者传递一个ndarray向量。
此参数指定初始化方法,默认值为 ‘k-means++’。
(1)‘k-means++’ 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛(即上文中的k-means++介绍)
(2)‘random’ 随机从训练数据中选取初始质心。
(3)如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。
precompute_distances:三个可选值,‘auto’,True 或者 False。
预计算距离,计算速度更快但占用更多内存。
(1)‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。This corresponds to about 100MB overhead per job using double precision.
(2)True:总是预先计算距离。
(3)False:永远不预先计算距离。
tol:float形,默认值= 1e-4 与inertia结合来确定收敛条件。
n_jobs:整形数。 指定计算所用的进程数。内部原理是同时进行n_init指定次数的计算。
(1)若值为 -1,则用所有的CPU进行运算。若值为1,则不进行并行运算,这样的话方便调试。
(2)若值小于-1,则用到的CPU数为(n_cpus + 1 + n_jobs)。因此如果 n_jobs值为-2,则用到的CPU数为总CPU数减1。
random_state:整形或 numpy.RandomState 类型,可选
用于初始化质心的生成器(generator)。如果值为一个整数,则确定一个seed。此参数默认值为numpy的随机数生成器。
copy_x:布尔型,默认值=True
当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据
上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。

三、RFM数据分析模型(主动):
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans,DBSCAN
from matplotlib import pyplot as plt
import glob
import os
读取数据
os.chdir("./data")
filnames = glob.glob("*.xlsx")

dfs = []
for f in filnames:
    dfs.append(pd.read_excel(f))
    
data = pd.concat(dfs)
数据的整理
data.info()
#去除空缺时间的数据
data = data.dropna(subset=["订单付款时间"])

计算RFM指标:
#买家会员名 可以重复购买
#最短的时间间隔 当前时间 - 最近付款时间
当前时间 = pd.to_datetime("2020-1-1")
最近付款时间 = data.groupby("买家会员名").订单付款时间.max() 
#pandas中的分组与SQL中的分组一样,在分组后还可以对其包含项进行处理
#最后一次消费时间
R = (当前时间 - 最近付款时间) / np.timedelta64(1,"D")
#F 消费频数
F = data.groupby("买家会员名").买家会员名.count()
#M  消费金额 (平均金额 或 累计金额)
M = data.groupby("买家会员名").买家实际支付金额.sum()
#数据合并
RFM = pd.concat([R,F,M],axis=1).rename(columns={"订单付款时间":"最近消费间隔","买家会员名":"消费频数","买家实际支付金额":"累计消费金额"})
均值计算:
#用最后消费一次的平均值与当前的时间进行比较,得到布尔值再进行替换,布尔值为TRUE代表离最后一次消费时间很长,所以打标签{False:"高",True:"低"}
new_R = (RFM["最近消费间隔"] >= RFM["最近消费间隔"].mean()).replace({False:"高",True:"低"})
#打标签{False:"高",True:"低"}
new_FM = (RFM.loc[:,["消费频数","累计消费金额"]] >= RFM.loc[:,["消费频数","累计消费金额"]].mean()).replace({False:"低",True:"高"})
new_RFM = pd.concat([new_R,new_FM],axis=1)
#打标签:
labs = []
for i in range(new_RFM.shape[0]):
    lab = None
    s = new_RFM.iloc[i]
    if s[0]=="高" and s[1]=="高" and s[2] =="高":
        lab = "重要价值用户"
    elif s[0]=="高" and s[1]=="低" and s[2] =="高":
        lab = "重要发展用户"
    elif s[0]=="低" and s[1]=="高" and s[2] =="高":
        lab = "重要保持用户"
    elif s[0]=="低" and s[1]=="低" and s[2] =="高":
        lab = "重要挽留用户"
    elif s[0]=="高" and s[1]=="高" and s[2] =="低":
        lab = "一般价值用户"
    elif s[0]=="高" and s[1]=="低" and s[2] =="低":
        lab = "一般发展用户"
    elif s[0]=="低" and s[1]=="高" and s[2] =="低":
        lab = "一般保持用户"
    else:
        lab = "一般挽留用户"
    labs.append(lab)  
new_RFM["用户价值标签"]=labs
new_RFM


四、Kmeans进行聚类划分标签
from sklearn.preprocessing import MinMaxScaler
#特征工程
std_model = MinMaxScaler()
std_rfm = std_model.fit_transform(RFM)

Kmeans建模

依据经验进行分组,通过均值进行比较,找到最适合分组数并进行标记补充。

km_rfm_model = KMeans(8).fit(std_rfm)
#每个类别的中心
rfmcc = km_rfm_model.cluster_centers_
#均值
rfm_mean = std_rfm.mean(axis=0)

KM_RFM = pd.Dataframe(data=(rfmcc>=rfm_mean),columns=['最近消费间隔', '消费频数', '累计消费金额'])
NEW_R = (KM_RFM["最近消费间隔"] >= KM_RFM["最近消费隔"].mean()).replace({False:"高",True:"低"})

NEW_FM = (KM_RFM.loc[:,["消费频数","累计消费金额"]] >= KM_RFM.loc[:,["消费频数","累计消费金额"]].mean()).replace({False:"低",True:"高"})

NEW_RFM = pd.concat([NEW_R,NEW_FM],axis=1)
NEW_RFM

labs = []
for i in range(NEW_RFM.shape[0]):
    lab = None
    s = NEW_RFM.iloc[i]
    if s[0]=="高" and s[1]=="高" and s[2] =="高":
        lab = "重要价值用户"
    elif s[0]=="高" and s[1]=="低" and s[2] =="高":
        lab = "重要发展用户"
    elif s[0]=="低" and s[1]=="高" and s[2] =="高":
        lab = "重要保持用户"
    elif s[0]=="低" and s[1]=="低" and s[2] =="高":
        lab = "重要挽留用户"
    elif s[0]=="高" and s[1]=="高" and s[2] =="低":
        lab = "一般价值用户"
    elif s[0]=="高" and s[1]=="低" and s[2] =="低":
        lab = "一般发展用户"
    elif s[0]=="低" and s[1]=="高" and s[2] =="低":
        lab = "一般保持用户"
    else:
        lab = "一般挽留用户"
    labs.append(lab)
    
NEW_RFM["用户价值标签"]=labs

RFM["用户价值标签"]=NEW_RFM["用户价值标签"][km_rfm_model.labels_].tolist()

分类后并重新验证后的群标签(类重新进行划分),与经验分组后的标签一一对应

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5572369.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存