0
点赞
收藏
分享

微信扫一扫

链表经典题目—相交链表和链表倒数第k个节点

dsysama 2024-05-27 阅读 29

目录

🍉简介

🍈K-means聚类模型详解

🍈K-means聚类的基本原理

🍈K-means聚类的算法步骤

🍈K-means聚类的优缺点

🍍优点

🍍缺点

🍈K-means聚类的应用场景

🍈K-means的改进和变体

🍉K-means聚类算法示例

🍈问题

🍍数据准备

🍍选择K值

🍍运行K-means聚类

🍍分析聚类结果

🍈完整代码实现

🍈代码解释


🍉简介

🍈K-means聚类模型详解

🍈K-means聚类的基本原理

假设我们有一个数据集${x_1, x_2, \ldots, x_n}$,其中每个数据点$x_i$是一个d维向量。我们需要将这些数据点分成K个簇${C_1, C_2, \ldots, C_K}$。K-means的优化目标可以表示为:

其中,$\mu_k$表示簇$C_k$的质心。

🍈K-means聚类的算法步骤

K-means聚类算法主要包括以下步骤:

🍈K-means聚类的优缺点

🍍优点

🍍缺点

🍈K-means聚类的应用场景

K-means聚类在实际中有广泛的应用,包括但不限于:

🍈K-means的改进和变体

为了克服K-means的一些缺点,研究人员提出了许多改进和变体方法:

🍉K-means聚类算法示例

🍈问题

假设我们是一家电子商务公司,希望通过分析客户的购买行为,将客户分成不同的群体,以便进行有针对性的市场营销。我们拥有以下客户数据集:

🍍数据准备

首先,我们需要对数据进行预处理和标准化,因为不同特征的量纲可能会影响聚类效果。

import pandas as pd
from sklearn.preprocessing import StandardScaler

# 创建示例数据集
data = {
    'CustomerID': [1, 2, 3, 4, 5],
    'Age': [25, 34, 45, 23, 35],
    'Annual Income (k$)': [15, 20, 35, 60, 45],
    'Spending Score (1-100)': [39, 81, 6, 77, 40]
}
df = pd.DataFrame(data)

# 标准化特征
scaler = StandardScaler()
df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']] = scaler.fit_transform(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])

🍍选择K值

通常情况下,选择K值可以通过“肘部法则”来确定。我们绘制不同K值下的SSE(误差平方和)曲线,选择拐点作为K值。

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 计算不同K值下的SSE
sse = []
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, random_state=0)
    kmeans.fit(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])
    sse.append(kmeans.inertia_)

# 绘制肘部法则图
plt.figure(figsize=(8, 5))
plt.plot(range(1, 11), sse, marker='o')
plt.title('Elbow Method for Optimal K')
plt.xlabel('Number of clusters')
plt.ylabel('SSE')
plt.show()

假设通过肘部法则确定K值为3。

🍍运行K-means聚类

使用K-means算法对客户进行分群。

# 运行K-means聚类
kmeans = KMeans(n_clusters=3, random_state=0)
df['Cluster'] = kmeans.fit_predict(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])

# 查看聚类结果
print(df)

🍍分析聚类结果

通过可视化和统计分析,我们可以更好地理解每个簇的特征。

# 可视化聚类结果
plt.figure(figsize=(8, 5))
plt.scatter(df['Annual Income (k$)'], df['Spending Score (1-100)'], c=df['Cluster'], cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 1], kmeans.cluster_centers_[:, 2], s=300, c='red')
plt.title('Customer Segments')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.show()

此外,我们可以查看每个簇的中心和簇内数据点的分布情况:

# 查看每个簇的中心
centroids = kmeans.cluster_centers_
print("Cluster Centers:\n", centroids)

# 查看每个簇的样本数量
print(df['Cluster'].value_counts())

🍈完整代码实现

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt

# 创建示例数据集
data = {
    'CustomerID': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
    'Age': [25, 34, 45, 23, 35, 64, 24, 29, 33, 55],
    'Annual Income (k$)': [15, 20, 35, 60, 45, 70, 18, 24, 50, 40],
    'Spending Score (1-100)': [39, 81, 6, 77, 40, 80, 20, 60, 54, 50]
}
df = pd.DataFrame(data)

# 标准化特征
scaler = StandardScaler()
df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']] = scaler.fit_transform(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])

# 计算不同K值下的SSE
sse = []
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, random_state=0)
    kmeans.fit(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])
    sse.append(kmeans.inertia_)

# 绘制肘部法则图
plt.figure(figsize=(8, 5))
plt.plot(range(1, 11), sse, marker='o')
plt.title('Elbow Method for Optimal K')
plt.xlabel('Number of clusters')
plt.ylabel('SSE')
plt.show()

# 根据肘部法则选择K值为3
k = 3

# 运行K-means聚类
kmeans = KMeans(n_clusters=k, random_state=0)
df['Cluster'] = kmeans.fit_predict(df[['Age', 'Annual Income (k$)', 'Spending Score (1-100)']])

# 查看聚类结果
print(df)

# 可视化聚类结果
plt.figure(figsize=(8, 5))
plt.scatter(df['Annual Income (k$)'], df['Spending Score (1-100)'], c=df['Cluster'], cmap='viridis')
plt.scatter(kmeans.cluster_centers_[:, 1], kmeans.cluster_centers_[:, 2], s=300, c='red', marker='x')
plt.title('Customer Segments')
plt.xlabel('Annual Income (k$)')
plt.ylabel('Spending Score (1-100)')
plt.show()

# 查看每个簇的中心
centroids = kmeans.cluster_centers_
print("Cluster Centers:\n", centroids)

# 查看每个簇的样本数量
print(df['Cluster'].value_counts())

🍈代码解释

🍍导入必要的库

🍍创建示例数据集

🍍标准化特征

🍍选择K值

🍍运行K-means聚类

🍍可视化聚类结果

🍍查看聚类结果


 

希望这些能对刚学习算法的同学们提供些帮助哦!!!

举报

相关推荐

0 条评论