聚类分析学习

   聚类分析是机器学习中的一种无监督学习方法,其主要目标是将数据集中的样本划分为不同的组或簇,使得同一簇内得样本有较高得相似度,而不同簇之间得样本有较大的差异性。其中无监督学习是指聚类分析不需要预先标记的训练数据,而是根据数据样本本身的特征进行分组。

   聚类任务:指根据数据点之间的相似性或距离将数据分成若干组的无监督学习任务。其目标是发现数据中的内在结构或模式,以便将相似的数据点归为一类,不同类别之间有尽可能大的区别。

   不同距离计算方法的应用:在聚类分析中,常用的距离计算方法有欧氏距离、曼哈顿距离和余弦相似度。欧式距离适用于连续型数据,计算方法为两点之间的直线距离;曼哈顿距离适用于特征件的绝对差异,计算方法为两点在各轴上的差的绝对值总和;余弦相似度适用于文本或高维稀疏数据,衡量两个向量方向的相似性而不考虑它们的大小。

   原形聚类的方法:原型聚类是一类聚类算法,其核心思想是通过定义一些原型或代表性的点来表示每个簇,例如K均值算法:通过将数据点分配给最近的K个质心之一,并更新质心来最小化簇内的平方误差和。

   高斯混合聚类的原理:高斯混合模型假设数据是由有限个高斯分布混合而成的,每个高斯分布对应一个簇。高斯混合模型的原理用最大似然估计来确定每个分布的参数(均值和协方差矩阵),然后通过期望最大化算法来估计这些参数。

    密度聚类的技术:密度聚类算法根据样本的密度分布来确定簇的形状和数量,例如DBSCAN(Density-Based Spatial Clustering of Applications with Noise):通过指定领域内的最小样本数和距离阈值来识别核心点、边界点和噪声点,从而形成具有任意形状的簇。

   层次聚类的算法与实现:层次聚类是一种基于数据点之间的相似性逐步建立聚类结构的方法,它包括凝聚层次聚类和分裂层次聚类。凝聚层次聚类是从每一个数据点开始,逐步将最相似的样本或簇合并,直到所有样本形成一个更大的簇;分裂层次聚类是从一个包括所有样本的大簇开始,逐步分割为越来越小的子簇,直到每一个子簇包含一个样本。


    一般来讲,评估聚类质量有两个标准,为外部评价指标和内部评价指标。如果是有监督的(聚类算法的聚类结果和已知的)使用外部指标更能说明聚类算法的好,如果是无监督的(无需基准数据集,不需要借助与外部参考模型)利用样本数据集中样本点与聚类中心之间的距离来衡量聚类结果的优劣。

我完成此次任务运用的便是K均值算法,代码如下

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans, AgglomerativeClustering
from sklearn.mixture import GaussianMixture
from sklearn import metrics
import seaborn as sns

# 设置字体为SimHei(黑体),适用于中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False  # 解决负号显示问题

# 读取CSV文件
file_path = '1999年全国31个省份城镇居民家庭平均每人全年消费性支出数据.csv'  # 请替换为你的文件路径
df = pd.read_csv(file_path, encoding='gbk')

# 查看前几行数据
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
pd.set_option('display.width', 300)
print("\n数据预览:")
print(df.head())
print(df.isnull().any())

# 检查是否存在缺失值
print("\n缺失值情况:")
print(df.isnull().sum())
# 填充或删除缺失值(这里我们选择填充为0,可以根据需要调整)
df.fillna(0, inplace=True)
# 确保每列的数据类型正确
df = df.convert_dtypes()
# 查看数据类型
print("\n数据类型:")
print(df.dtypes)


# 对数值列进行标准化处理
numeric_columns = df.columns[1:]  # 第一列是省份名,其余列为数值列
X = df.iloc[:, 1:]
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
print(np.round(X_scaled, 2))

# 计算不同聚类数量的误差平方和和轮廓系数
inertias = []
silhouette_scores = []
max_clusters = 10  # 可以根据需要调整

for k in range(1, max_clusters + 1):
    kmeans = KMeans(n_clusters=k, random_state=42)
    kmeans.fit(df[numeric_columns])
    inertias.append(kmeans.inertia_)
    if k > 1:
        silhouette_scores.append(metrics.silhouette_score(df[numeric_columns], kmeans.labels_))

# 绘制肘部法则图像
plt.figure(figsize=(10, 6))
plt.plot(range(1, max_clusters + 1), inertias, marker='o', linestyle='-')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')
plt.xticks(range(1, max_clusters + 1))
plt.grid(True)
plt.show()

# 设置聚类数量为2
best_k = 2
# 创建KMeans实例,并指定聚类数量为k
kmeans = KMeans(n_clusters=best_k, random_state=42)
# 对数据进行聚类
kmeans.fit(X_scaled)
# 获取聚类标签(每个数据点所属的聚类)
labels = kmeans.labels_
# 将簇标签添加到原始数据中
df['亚类别'] = kmeans.labels_
print(df)

# K均值聚类
n_clusters = 2  # 聚类数量,可以根据肘部法则或其他方法确定
kmeans = KMeans(n_clusters=n_clusters, random_state=42)
df['Cluster'] = kmeans.fit_predict(df[numeric_columns])

# 可视化K均值聚类结果
plt.figure(figsize=(10, 6))
sns.scatterplot(data=df, x='食品', y='杂项', hue='Cluster', palette='viridis', s=100, alpha=0.8)
plt.title('KMeans 聚类结果 k=2')
plt.xlabel('feature1')
plt.ylabel('feature2')
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值