Kmeans算法解决问题

题目描述:

现在有部分餐饮客户的消费数据存于数据文件:consumption.xls
其中R表示最近一次消费时间间隔,F表示消费频率,M表示消费总金额

编程实现K-Means聚类算法,将客户分类成3类客户群,并评价这些客户群的价值
数据集如下:

解题思路:

这是一个使用 K-Means 聚类算法的 Python 程序。

简单来说,K-Means 算法是一种聚类算法,它的目的是将数据集划分成 K 个聚类,使得每个聚类内的数据点尽可能地相似。

在这个程序中,首先使用 pandas 库读取了一个 Excel 文件中的数据,然后使用 K-Means 算法将数据分为 3 个聚类。然后,程序计算了每个聚类的平均消费频率和平均消费总金额,并使用这些信息计算出了每个聚类的价值。最后,程序使用 matplotlib 库绘制了每个聚类的价值的折线图。

其中,绘制出的价值曲线,x轴标识分出的客户群,y轴标识价值。客户群的价值是通过计算每个客户群的平均消费频率和平均消费总金额,然后相乘得到的。

具体来说,代码中使用了两个字典avg_freq和avg_m分别表示每个客户群的平均消费频率和平均消费总金额,然后使用一个字典cluster_value将它们相乘得到每个客户群的价值。

实验的主要函数的功能:

euclidean_distance函数:用于计算两个点之间的欧几里得距离。这个函数用于K-Means聚类算法中用于计算每个数据点与各个聚类中心的距离。

kmeans函数实现了K-Means聚类算法的过程。它接受两个参数:X表示待聚类的数据,K表示要聚成几类。函数返回两个值:clusters表示每个数据点所属的客户群编号,centers表示聚类后的聚类中心。

每次迭代的聚类中心:

得到的三个客户群的价值:

 

得到的折线图:

 

 

python实现代码:

from collections import defaultdict
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def euclidean_distance(x, y):
    return np.sqrt(np.sum((x - y) ** 2))


def kmeans(X, K):
    N = len(X)
    clusters = np.zeros(N)
    centers = X[np.random.choice(N, K, replace=False)]

    while True:
        for i in range(N):
            distances = [euclidean_distance(X[i], c) for c in centers]
            clusters[i] = np.argmin(distances)

        new_centers = np.zeros((K, 3))
        for k in range(K):
            new_centers[k] = np.mean(X[clusters == k], axis=0)
        print(new_centers)  # 输出新的中心点
        if np.allclose(centers, new_centers):
            break

        centers = new_centers

    return clusters, centers


data = pd.read_excel('/Users/mac/Desktop/上课内容/数据挖掘/实验三/1.xlsx', engine='openpyxl')
X = data[['R', 'F', 'M']].values

clusters, centers = kmeans(X, 3)

# 计算每个客户群的平均消费频率和平均消费总金额
cluster_freq = defaultdict(list)
for i, cluster in enumerate(clusters):
    cluster_freq[cluster].append(X[i, 1])

avg_freq = {c: sum(f) / len(f) for c, f in cluster_freq.items()}

cluster_m = defaultdict(list)
for i, cluster in enumerate(clusters):
    cluster_m[cluster].append(X[i, 2])

avg_m = {c: sum(m) / len(m) for c, m in cluster_m.items()}

# 评估每个客户群的价值
cluster_value = {c: avg_freq[c] * avg_m[c] for c in avg_freq}

print(cluster_value)

x = list(range(len(cluster_value)))
y = list(cluster_value.values())

plt.plot(x, y)
plt.show()

 

K-means聚类算法是一种常用的无监督学习算法,可以用于解决超市问题。该算法可以将一组数据分成K个不同的簇,使得同一簇内的数据点相似度较高,而不同簇之间的数据点相似度较低。 以下是使用K-means聚类算法解决超市问题的步骤: 1. 收集数据:收集超市的销售数据,包括每个顾客的购买金额和购买种类等信息。 2. 数据预处理:对收集到的数据进行预处理,包括数据清洗、缺失值处理、特征选择等。 3. 特征工程:根据超市问题的具体情况,选择合适的特征进行处理,例如将购买金额和购买种类转换为数值特征。 4. 选择K值:根据超市问题的需求和数据集的特点,选择合适的K值,即要将数据分成多少个簇。 5. 初始化聚类中心:随机选择K个数据点作为初始的聚类中心。 6. 迭代更新:重复以下步骤直到满足停止条件: - 计算每个数据点与聚类中心的距离,将数据点分配到距离最近的簇中。 - 更新每个簇的聚类中心,计算簇内数据点的平均值作为新的聚类中心。 7. 输出结果:得到最终的聚类结果,每个簇代表一类顾客,可以根据簇的特点进行分析和决策。 下面是一个使用K-means聚类算法解决超市问题的示例代码: ```python from sklearn.cluster import KMeans # 假设有一个超市销售数据集 sales_data,包含了每个顾客的购买金额和购买种类等信息 # 数据预处理和特征工程... # 选择K值 k = 3 # 初始化K-means模型 kmeans = KMeans(n_clusters=k) # 训练模型 means.fit(sales_data) # 获取聚类结果 labels = kmeans.labels_ # 输出每个顾客所属的簇 for i in range(len(labels)): print("顾客{}属于簇{}".format(i, labels[i])) # 输出每个簇的聚类中心 centers = kmeans.cluster_centers_ for i in range(k): print("簇{}的聚类中心为{}".format(i, centers[i])) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

就是木子呀

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

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

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

打赏作者

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

抵扣说明:

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

余额充值