首页 > 编程语言 >1.13 - 动手学聚类算法

1.13 - 动手学聚类算法

时间:2024-08-08 20:38:29浏览次数:11  
标签:学聚类 iris plt 1.13 聚簇 算法 聚类 import sklearn

1. 基于距离的k-means聚类,需要人工提供聚簇数量K

1.1 通过肘方法确定最佳聚簇数量

 

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_blobs, load_iris
from sklearn.metrics import silhouette_score
import warnings

warnings.filterwarnings("ignore")
np.printoptions(suppress=True)

# 解决中文乱码
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

# 1. 获取待聚簇数据
# 对鸢尾花数据集进行聚簇(众所周知,该数据有三类花朵)
X = load_iris(return_X_y=False).data
# 生成高斯聚簇分布的数据点, n_feature-样本特征数量; n_sample-样本数量
# X, y = make_blobs(n_samples=1500, n_features=2, centers=4, random_state=170)

# 2. 对待聚类数据归一化,不归一化,有的特征 数据过大会影响求解方差和最终聚簇结果。
x = StandardScaler().fit_transform(X)

# 3. 肘方法
scores1 = []
scores2 = []
for i in range(2, 8):
    # 通过 k-means 方法初始化聚簇质心,并重复实验 n_init 次,防止初始聚簇质心不好陷入局部最优
    model = KMeans(n_clusters=i, init='k-means++', n_init=10)
    model.fit(x)

    # model.cluster_centers_  # 查看聚簇质心

    # 1)按照轮廓系数选取最佳聚簇数K, 轮廓系数越大越好
    y = model.labels_  # 每个数据最终归纳到哪个簇
    score1 = silhouette_score(x, y)

    # 2)按照 聚簇方差损失 选取最佳聚簇数量,聚簇方差越小越好
    score2 = model.inertia_  # 各个点的聚簇方差总和

    scores1.append(score1)
    scores2.append(score2)

# 作图查看
plt.figure(num=1)
plt.plot(range(2, 8), scores1)
plt.xlabel("聚簇数量")
plt.ylabel("轮廓系数")
plt.title("肘方法 - 轮廓系数")

plt.figure(num=2)
plt.plot(range(2, 8), scores2)

plt.xlabel("聚簇数量")
plt.ylabel("所有数据点的方差和")
plt.title("肘方法 - 所有样本点聚簇方差总和")

# 显示图形
plt.show()

 

分析

  1)对于容易聚类的数据集如人工生成的,通过 轮廓系数和聚簇方差 都比较容易的选出最佳聚簇数K;但是对于比较难区分的数据集如鸢尾花数据集,很难看出来是三个簇。

  2)上述代码实现,聚簇方差因为是每个样本点的方差总和,所以实际选取的最佳聚簇数K应该是 损失比较平滑的起点,而不是原理中的什么 幅度最大的那个。( 看图 )

VS

2. 基于密度的 DBSCAN 聚类

  相比于前面的聚类方法,基于密度的聚类,如果超参数选好了效果还是相当不错的,但是一般选不好。所以 常用上面两个聚类而不用密度聚类。如下:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans, DBSCAN
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import make_blobs, load_iris
from sklearn.metrics import silhouette_score
import warnings

warnings.filterwarnings("ignore")
np.printoptions(suppress=True)

x_iris = load_iris(return_X_y=False).data
x_gauss, y = make_blobs(n_samples=1500, n_features=2, centers=4, random_state=170)

x_iris = StandardScaler().fit_transform(x_iris)
x_gauss = StandardScaler().fit_transform(x_gauss)

model = DBSCAN(eps=0.5, min_samples=5)
labels_iris = model.fit_predict(x_iris)
labels_gauss = model.fit_predict(x_gauss)

print('DBSCAN算法在鸢尾花数据集上最终聚簇为{}类'.format(len(np.unique(labels_iris))))  # 3 簇
print('DBSCAN算法在人生生成Gauss数据集上最终聚簇为{}类'.format(len(np.unique(labels_gauss))))  # 2 簇

分析:最终鸢尾花聚簇数为 3,人工生成Gauss分布数据集聚簇数为 2 ,显然很扯淡。

 

标签:学聚类,iris,plt,1.13,聚簇,算法,聚类,import,sklearn
From: https://www.cnblogs.com/zhangzhenw/p/18349581

相关文章

  • 【探索数据结构与算法】——深入了解双向链表(图文详解)
    目录一、双向链表的基本概念 ​​​二、双向链表的结构三、双向链表的基本操作实现方法 1.双向链表的初始化2.双向链表的头插3.双向链表的尾插6.查找节点7.在指定位置之前插入节点8.删除指定位置节点9.打印链表数据  10.双向链表销毁四、完整代码实现 LIst.h......
  • LLVM中四种寄存器分配算法及开启选项
    在LLVM编译器中,一共有四种寄存器分配算法:BasicRegisterAllocator、FastRegisterAllocator、PBQPRegisterAllocator、GreedyRegisterAllocator。FastRegisterAllocator这种分配器是局部的,作用于各个基本块,它尽量地将值保持在寄存器中并重用它们。BasicRegisterAl......
  • 算法小总结-图论
    拓扑排序[HNOI2015]菜肴制作////Createdbyfxzon2024/8/3.//#include<bits/stdc++.h>usingnamespacestd;intans[1008611];#defineintlonglongboolTopSort(vector<vector<int>>&G,intn,vector<int>&inDegree){......
  • 代码随想录算法训练营第64天 | 图论:Floyd 算法+A * 算法
    97.小明逛公园https://kamacoder.com/problempage.php?pid=1155Floyd算法精讲https://www.programmercarl.com/kamacoder/0097.小明逛公园.html#floyd-算法精讲Floyd算法精讲问题总结:双向道路;路径规划;多个起点到多个终点核心思想:动态规划确定dp数组和下标含义:grid......
  • 揭秘人工智能三大基石:数据、算法与算力的深度融合
    在科技日新月异的今天,人工智能(AI)作为引领未来科技浪潮的核心力量,正以前所未有的速度改变着我们的生活、工作乃至整个社会的面貌。人工智能的快速发展并非偶然,而是建立在三大坚实基石之上:数据、算法与计算能力。这三者相辅相成,共同构筑了人工智能技术的基石,推动了AI技术的不断突破......
  • 2024-8-7 算法学习
    P6136【模板】普通平衡树(数据加强版)题意:1,插入一个数;2,删除一个数3,查询一个数的排名4,查询第x个数5,查询x的前驱和后继重点在于分裂split和合并merge操作:1:分裂为X[0,x],Y[x+1,n],后rt=merge(X,x,Y)2:分裂为X[0,x-1],Y[x,x],Z[x+1,n]后Y=merge(Y.l,Y.r),后rt=merge(X,Y,Z);3......
  • paxos算法详解
    1分布式一致性:共识算法对于一个分布式系统来说,保障集群中所有节点的数据完全相同(即一致性)是很重要的,随着多节点的引入,这影响的是整个分布式系统对外服务的表象一致性。也就是说,一个分布式系统想要做到完全的一致性,需要对外表现为顺序一致性,即各个节点上的操作顺序都一致。而在......
  • 【Python机器学习】利用AdaBoost元算法提高分类性能——基于单层决策树构建弱分类器
    单层决策树(也称决策树桩)是一种简单的决策树。它基于单个特征来做决策,由于这棵树只有一次分裂过程,因此它实际上就是一个树桩。在构造AdaBoost代码时,首先通过一个简单数据集来确保在算法上一切就绪:fromnumpyimport*defloadSimpData():datMat=matrix([[1.0,2.1],......
  • 机器学习算法之一 线性回归
    1.线性预测函数定义左侧为真实值,右侧为预测值与误差的和,其中为权重矩阵。2.目标函数的推导2.1高斯分布函数误差符合独立同分布假设,服从均值为0的高斯分布:将线性函数带入,得:......
  • 文心一言 VS 讯飞星火 VS chatgpt (320)-- 算法导论22.3 12题
    十二、证明:我们可以在无向图G上使用深度优先搜索来获得图G的连通分量,并且深度优先森林所包含的树的棵数与G的连通分量数量相同。更准确地说,请给出如何修改深度优先搜索来让其给每个结点赋予一个介于1和k之间的整数值v.cc,这里k是G的连通分量数,使得u.cc=v.cc当且仅当结点u和结......