当前位置: 首页 > news >正文

Kmeans


#pic_center =400x
系列文章:


文章目录

    • K-Means类概述
    • K-Means类主要参数
    • K 值的评估标准
    • DBSCAN算法


K-Means类概述

在 scikit-lean中,包含两个K-Means算法,一个是传统的K-Means,对应 的类是 KMeans; 另一个是基于采样的Mini Batch K-Menas算法,对应的类是MiniBatchKMeans.
使用KMeans类的话,一般要注意点仅仅是k值的选择,即参数n_clusters
如果是使用MiniBatchKMeans的话,多了batch_size
当然KMeans类和MiniBatchKMeans类可以选择的参数不少,但大多数不需要调参。

K-Means类主要参数

  1. n_cluster: 即k值,一般多试试可以获得比较好的聚类结果
  2. max_iter: 最大迭代次数,一般如果是凸数据集可以不管这个值,如果数据集不是凸的,可能比价难收敛,此时可以指定最大迭代次数让算法及时退出循环
  3. n_init : 用不同的初始化质心运行算法的次数。由于K-Means结果受初始值的影响,因此需要多跑几次以选择一个较好的聚类效果。默认是10,一般不需要改
  4. init: 初始值选择的方式,可以为完全随机选择’random’, 优化过的’k-means++', 或者自己指定初始化的k个质心。
  5. algorithm: 有"auto", “full”, “elkan” 三种, “full"是传统的K-Means算法,默认的"auto"会根据数据值是否稀疏来决定,一般数据是稠密的是"elkan”, 否则就是"full", 一般建议直接选择"auto"

使用scikit-learn学习K-Means聚类

K 值的评估标准

无监督聚类样本没有样本输出,也没有比较直接的聚类评估方法,但是可以从簇内稠密度和簇间的离散程度估计聚类效果。
类别内部数据的协方差越小越好,类别之间的协方差越大越好
轮廓系数是最常用的聚类算法的评价指标。
轮廓系数范围是(-1,1)

(1)好:s值越接近1,表示样本与自己所在的簇中的样本相似好,并且与其他簇中的样本不相似

(2)差:当样本点与簇外的样本更相似的时候,轮廓系数就为负。这些样本点在其族内就是属于异类。

(3)同族:当轮廓系数为0时,则代表两个簇中的这些样本的相似度一致,两个簇本应该是一个簇。

可以总结为轮廓系数越接近于1越好,负数则表示聚类效果非常差。

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets._samples_generator import make_blobs
from sklearn import metrics
from sklearn.cluster import  KMeans
# X为样本特征,Y为样本簇类别, 共1000个样本,每个样本2个特征,共4个簇,
# 簇中心在[-1,-1], [0,0],[1,1], [2,2], 簇方差分别为[0.4, 0.2, 0.2]
x, y = make_blobs(n_samples=1000, n_features=2,
                  centers=[[-1,-1],[0,0],[1,1],[2,2]],
                  cluster_std=[0.4, 0.2, 0.2, 0.2],
                  random_state=9)

plt.scatter(x[:,0],x[:,1], marker='o')
plt.show()

# "full"已被弃用,现在使用lloyd
y_pred = KMeans(n_clusters=2, random_state=9,algorithm="lloyd").fit_predict(x)
plt.scatter(x[:,0],x[:,1], c=y_pred)
plt.show()
print(metrics.calinski_harabasz_score(x, y_pred))

DBSCAN算法

基于密度空间的聚类算法 不需要聚类的数量 而是基于数据推测聚类的数目 可以对任意形状都能产生聚类

该算法首先要确定两个参数:
epsilon 在一个点周围邻近区域的半径;
minpts 这个邻近区域至少应该包含的点个数

根据这两个参数可以划分样本中的点为三类:
核心点 如果一个点在其eps半径内有超过minpts数目的点
边界点 如果一个点在半径eps内含有的数量小于minpts,但是他落在其他核心点的邻域内
噪音点即离群点 既不是核心点也不是边缘点

密度直达:如果点p在核心点q的eps邻域内,则认为p从q出发是直接可达的(在一个半径圈内)
密度可达:如果存在数据对象链p1、p2…pn、pn+1是从pi关于eps和minpts直接密度可达的,则认为pn是从数据对象p1关于epsminpts密度可达的(即一圈套一圈可以到达的)注意方向为单向
密度相连:对于对象p和q,如果存在核心对象样本o,使得p和q都可以从o密度可达,那么则成为p和q密度相连
在这里插入图片描述
x1是核心对象,x2可由x1密度直达,x3可由x1密度可发,x3与x4密度连接。
在这里插入图片描述
sklearn.datasets.make_circles(n_samples = 100,shuffle = True,noise = None,random_state = None,factor = 0.8 )
作用:在2d中创建一个包含校园的大圆的样本集
一般用于可视化聚类和分类算法
n_samples : int,optional(默认值= 100)
生成的总点数。如果是奇数,则内圆将比外圆具有一个点。

shuffle : bool,optional(默认值= True)
是否洗牌样品。

noise: 双倍或无(默认=无)
高斯噪声的标准偏差加到数据上。

random_state : int,RandomState实例或None(默认)
确定数据集重排和噪声的随机数生成。传递一个int,用于跨多个函数调用的可重现输出。见术语表。

factor : 0 <double <1(默认值= .8)
内圈和外圈之间的比例因子。

返回值

生成的样本X ,数据类型ndarray: shape[n_samples,2]
y : 形状数组[n_samples]
每个样本的类成员资格的整数标签(0或1)。

sklearn.datasets.make_blobs(n_samples=100, n_features=2, centers=None, cluster_std=1.0, center_box=(-10.0, 10.0), shuffle=True, random_state=None)
参数解释:
n_samples(int/array):如果参数为int,代表总样本数;如果参数为array-like,数组中的每个数代表每一簇的样本数。默认值100
n_features(int):样本点的维度。默认值2
centers(int):样本中心数。如果样本数为int且centers=None,生成三个样本中心;如果样本数(n_samples)为数组,则centers 要么为None,要么为数组的长度。默认值3
cluster_std(float/sequence of floats):样本中,簇的标准差。默认值1.0
center_box(pair of floats (min, max)):每个簇的上下限。默认值(-10.0, 10.0)
shuffle(boolean):是否将样本打乱。默认值True
random_state(int/RandomState instance /None):指定随机数种子,每个种子生成的序列相同,与minecraft地图种子同理。
返回类型:X : 样本数组 [n_samples, n_features]

产生的样本

y : array of shape [n_samples]

每个簇的标签

from sklearn import  datasets
import numpy as np
import random
import  matplotlib.pyplot as plt
import time
import  copy

# x1是生成的样本,y1是对应样本的标签(该点属于内圆还是外圆)
x1, y1 = datasets.make_circles(n_samples=50, factor=0.6,noise=0.2)

x2, y2 = datasets.make_blobs(n_samples=50, n_features=2, centers=2)
plt.figure()
plt.scatter(x2[:,0],x2[:,1])
plt.show()

在这里插入图片描述

np二维矩阵计算想减求和

x1 = np.array([[1,0],[3,0],[4,0]])
# print(x1.shape)
# print(x1.shape[0])
for i in  range(x1.shape[0]):
    # print(x1[i]-x1[0]) #得到如[0,0],[2,0],[3,0]
    # print(np.square(x1[i]-x1[0])) #得到如[0,0],[4,0],[9,0]
    print(np.sum(np.square(x1[i]-x1[0]))) #0  4   9

DBSCAN聚类算法Python实现

相关文章:

  • 【C++】C++11的那些新特性
  • 【数据结构 | 入门】线性表与链表 (问题引入实现算法优化)
  • vmware虚拟机中的archlinux无法播放声间的解决办法
  • 深度学习常用的backbone有哪些
  • 君正X2000/X1600主控CPU方案有哪些场景?行业迈向人机交互智能时代来啦!
  • c++类和对象万字详解
  • Less预处理——初识Less
  • 在低浓度下修饰生物分子的Pyrimidine-Tetrazine-PEG1-Alkyne 四嗪试剂
  • 【web前端开发】前端生日礼物--主页面篇
  • Linux 驱动开发 五十六:Buildroot 笔记
  • 移动端JDtoolbar
  • 公众号题库搜题对接(免费接口)
  • 傻妞机器人对接TG【无需QQ】
  • Mysql基础 (二)
  • winform服务站药品管理系统VS开发sqlserver数据库cs结构c#编程源码网页
  • 【Linux系统编程】快速查找errno错误码信息
  • Android框架之Volley
  • Git同步原始仓库到Fork仓库中
  • Python十分钟制作属于你自己的个性logo
  • Twitter赢在开放,三年创造奇迹
  • 浮现式设计
  • 离散点最小(凸)包围边界查找
  • 浏览器缓存机制分析
  • 使用Gradle第一次构建Java程序
  • 思维导图—你不知道的JavaScript中卷
  • 微服务入门【系列视频课程】
  • 想写好前端,先练好内功
  • 与 ConTeXt MkIV 官方文档的接驳
  • 智能合约Solidity教程-事件和日志(一)
  • #### go map 底层结构 ####
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (1) caustics\
  • (52)只出现一次的数字III
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (WSI分类)WSI分类文献小综述 2024
  • (六)激光线扫描-三维重建
  • (十)T检验-第一部分
  • (一)Neo4j下载安装以及初次使用
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET CORE 第一节 创建基本的 asp.net core
  • .Net FrameWork总结
  • .Net 代码性能 - (1)
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET成年了,然后呢?
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .NET命令行(CLI)常用命令
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .NET业务框架的构建
  • .Net组件程序设计之线程、并发管理(一)
  • @Async注解的坑,小心