python数据挖掘——聚类

划分聚类

Kmeans

原理

(1)任意选择k个对象作为初始的簇中心;(2)根据距离(欧式距离)中心最近原则,将其他对象分配到相应类中;(3) 更新簇的质心,即重新计算每个簇中对象的平均值;(4) 重新分配所有对象,直到质心不再发生变化

 

 调包实现

import time
import pandas as pd
from sklearn import preprocessing

data = pd.read_csv("/.../iris.csv")
iris = data.iloc[:,:4] # 获取iris数据
target = data.iloc[:,4:] # 单独存放species属性

# 预处理
# 将species转换成数字
class_encoder = preprocessing.LabelEncoder()
target['species'] = class_encoder.fit_transform(target['species'].values)
# K-means
from sklearn.cluster import KMeans
# 将数据聚为3类
kms = KMeans(n_clusters = 3)
# 训练数据
kms.fit(iris)
# 预测结果
kms_label = kms.labels_
kms_label = pd.DataFrame(kms_label,columns=["聚类结果"])
kms_iris = iris.copy()
kms_iris["聚类结果"] = kms_label
kms_iris

参数调优

# 肘方法确定参数
SSE_list = []
for n in range(1,10):
    kms = KMeans(n_clusters=n)
    kms.fit(iris)
    SSE_list.append(kms.inertia_)
    
plt.xlabel = "n_clusters"
plt.ylabel = "SSE"
plt.plot(range(1,10),SSE_list,"o-")

 

结果可视化

kms_cc = pd.DataFrame(kms.cluster_centers_,
                      index=[0,1,2],
                      columns=['sepal_length','sepal_width','petal_length','petal_width'])
kms_iris = pd.concat([kms_iris,kms_cc])
fig = plt.figure()
ax = fig.add_subplot()
ax.scatter(x=kms_iris.iloc[:150,1:2],y=kms_iris.iloc[:150,3:4],c=kms.labels_,label=[1,2,0])
ax.scatter(x=kms_iris.iloc[150:,1:2],y=kms_iris.iloc[150:,3:4],c=[0,1,2],marker='*')
plt.show()

自己实现 

  

  

 

  

K-Medoids

不采用簇中对象的平均值作为参照点,  而是选用簇中位置最中心的对象,  即中心点作为参照点

PAM算法

反复地用非代表对象替代代表对象,以改进聚类的质量

CLARA算法

随机地抽取多个样本,针对每一个样本寻找代表对象medoids,并进行全部数据对象的聚类,然后从中选择质量最好的聚类结果作为最终结果,并分配其余对象。


层次聚类

分裂型层次聚类法

分割最不相似的两个部分,从所有的对象归属在唯一的一个簇中开始,逐层向下分解,直到每一个对象形成一个簇。

凝聚型AGNES

(1)首先将每一个对象独立地作为一个簇。 (2)然后根据各个簇之间的相似程度(距离)逐层向上聚结,形成越来越大的簇。 (3)最终形成包含全部对象的唯一的一个簇,也可以在满足一定的聚结终止条件时终止聚结。 

 代码实现

# AGNES聚类
from sklearn.cluster import AgglomerativeClustering
# 将数据聚为3类
ac = AgglomerativeClustering(linkage='complete',n_clusters=3)
# 训练数据
ac.fit(iris)
# 得到结果
ac_label = ac.labels_
ac_label = pd.DataFrame(ac_label,columns=["聚类结果"])
ac_iris = iris.copy()
ac_iris["聚类结果"] = ac_label
# 数据匹配
ac_iris["聚类结果"].loc[ac_iris["聚类结果"]==2] = 'x'
ac_iris["聚类结果"].loc[ac_iris["聚类结果"]==0] = 2
ac_iris["聚类结果"].loc[ac_iris["聚类结果"]==1] = 0
ac_iris["聚类结果"].loc[ac_iris["聚类结果"]=='x'] = 1
ac_iris

 层次聚类树

# 层次聚类树
from scipy.cluster import hierarchy
plt.figure(figsize=(15,5)) 
# 生成聚类树
Z = hierarchy.linkage(ac_iris,method='weighted',metric='euclidean')
hierarchy.dendrogram(Z)
plt.show()

 BIRCH算法

假设在给定的一个簇中,有n个m维的数据点,i = 1, 2, ..., n

该簇的聚类特征向量CF = (N, LS, SS):(1) N是该类中的数据点数目;(2) LS是该n个数据点的线性和,即 \sum_{i=1}^{N}x_{i};(3) SS是该n个数据点的平方和,即 \sum_{i=1}^{N}x_{i}^{2}


密度聚类

DBSCAN

关键概念:核心对象、直接密度可达、密度可达、密度相连、簇与噪声

调包实现

# DBSCAN
from sklearn.cluster import DBSCAN
# 设置邻域半径为0.81,MinPts为10
db = DBSCAN(eps=0.81, min_samples=10)
# 训练数据
db.fit(iris)
# 得到结果
db_label = db.labels_
db_label = pd.DataFrame(db_label,columns=["聚类结果"])
db_iris = iris.copy()
db_iris["聚类结果"] = db_label
db_iris

由于聚类是无监督学习,聚类结果可能与本身的标签不匹配,所以还需要做数据匹配。下图还没有做数据匹配,可以通过颜色看出聚类结果与本身标签并不对应。 

参数调优

# 确定最佳参数
db_list = []
for each_eps in np.arange(0.01,10,0.10):
    for each_minpts in range(5,11):
        db = DBSCAN(eps=each_eps,min_samples=each_minpts)
        # 训练模型
        db.fit(iris)
        db_label = db.labels_
        db_label = pd.DataFrame(db_label,columns=["聚类结果"])
        n = pd.DataFrame(db.labels_).value_counts().size-1 # 簇数
        db_iris = iris.copy()
        db_iris["聚类结果"] = db_label
        try:
            score = silhouette_score(db_iris,db.labels_) # 轮廓系数
            db_list.append({'eps':each_eps,'min_samples':each_minpts,
                           'n_clusters':n,'轮廓系数':score})
        except:
            continue

  

所以设置邻域半径为0.81,MinPts为10

 自己实现(待完善)

 

 

  

OPTICS算法

优先选择最小的\varepsilon值密度可达的对象, 以便高密度的聚类能被首先完成


聚类评价

下图是已经做过数据匹配之后的结果,p4是原分类结果

 兰德系数

FMI 

 

DBI 

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python数据挖掘建模中的聚类是一种将数据集中的样本分成不同的簇或类别的技术。聚类算法可以帮助我们发现数据中的隐藏模式和结构,从而更好地理解数据。其中一种常用的聚类算法是K-Means算法。 在Python中实现K-Means聚类算法需要以下几个步骤: 1. 导入数据并进行标准化:首先,需要导入数据集并进行标准化处理。标准化可以使得不同特征之间的值具有相同的尺度,避免某些特征对聚类结果的影响过大。 2. 构建K-Means模型:使用sklearn库中的KMeans类,设置聚类的类别数k,并指定一些参数如最大循环次数和随机种子等。然后,使用.fit()方法拟合模型并进行聚类。 3. 分析聚类结果:根据聚类结果,可以进行一些进一步的分析,如查看每个簇的样本数量、簇的聚类中心等。可以使用聚类模型的属性和方法来获取这些信息。 需要注意的是,在聚类分析中,评估聚类模型结果的好坏是比较主观的,通常需要根据具体问题来判断。常用的评估指标有轮廓系数和内部评价指标等,可以根据需要选择适合的评估方法。 综上所述,Python数据挖掘建模中的聚类可以帮助我们发现数据集中的模式和结构,并根据聚类结果进行进一步的分析和应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【Python数据分析】数据挖掘建模——聚类分析](https://blog.csdn.net/weixin_41168304/article/details/122747347)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [代码实操:Python聚类分析](https://download.csdn.net/download/weixin_44510615/88231861)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Kentos(acoustic ver.)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值