K-means和DBSCAN

目录

一、K-means和DBSCAN之间的主要区别

二、DBSCAN聚类算法

2.1DBSCAN聚类算法实现点集数据的聚类

2.2DBSCAN聚类算法实现鸢尾花数据集的聚类

三、K-means聚类算法

3.1K-means聚类算法实现随机数据的聚类

3.2K-means聚类算法实现鸢尾花数据集的聚类


一、K-means和DBSCAN之间的主要区别

1.聚类原理:

        K-means:K-means是一种基于距离的聚类算法,它将数据点划分为K个簇,通过最小化数据点与所属簇的质心之间的平方距离来确定聚类结果。K-means假设聚类簇为凸形,并且簇的大小差异较小。

        DBSCAN:DBSCAN是一种基于密度的聚类算法,它通过确定数据点的密度来划分聚类。DBSCAN将高密度区域视为聚类,并能够识别出噪声点和孤立点。相比于K-means,DBSCAN对聚类簇的形状没有预设要求,可以发现任意形状的聚类簇。

2.聚类数量:

        K-means:K-means需要预先指定聚类的数量K。这是因为K-means是一个划分式聚类方法,需要事先确定聚类簇的数量,然后将数据点划分为K个簇。

        DBSCAN:DBSCAN不需要预先指定聚类的数量。它根据数据点的密度来决定聚类的形状和数量,可以自动发现不同大小和形状的聚类簇。

3.处理噪声和孤立点:

        K-means:K-means对噪声和孤立点敏感。它会将这些数据点分配到离它们最近的聚类簇中,即使这些数据点在实际中并不属于任何簇。

        DBSCAN:DBSCAN能够有效地处理噪声和孤立点。它将这些数据点标记为噪声或边界点,不归属于任何聚类簇。

4.参数选择:

        K-means:K-means需要事先指定聚类的数量K,这需要一定的先验知识或通过试验和评估来确定最佳的K值。

        DBSCAN:DBSCAN需要调整两个关键参数:领域半径(eps)和最小样本数(min_samples)。这些参数的选择可以影响聚类结果,需要根据数据集的特点进行调优。

二、DBSCAN聚类算法

2.1DBSCAN聚类算法实现点集数据的聚类

代码:

from sklearn import datasets
import numpy as np
import random
import matplotlib.pyplot as plt
import time
import copydef find_neighbor(j, x, eps):N = list()for i in range(x.shape[0]):temp = np.sqrt(np.sum(np.square(x[j] - x[i])))  # 计算欧式距离if temp <= eps:N.append(i)return set(N)def DBSCAN(X, eps, min_Pts):k = -1neighbor_list = []  # 用来保存每个数据的邻域omega_list = []  # 核心对象集合gama = set([x for x in range(len(X))])  # 初始时将所有点标记为未访问cluster = [-1 for _ in range(len(X))]  # 聚类for i in range(len(X)):neighbor_list.append(find_neighbor(i, X, eps))if len(neighbor_list[-1]) >= min_Pts:omega_list.append(i)  # 将样本加入核心对象集合omega_list = set(omega_list)  # 转化为集合便于操作while len(omega_list) > 0:gama_old = copy.deepcopy(gama)j = random.choice(list(omega_list))  # 随机选取一个核心对象k = k + 1Q = list()Q.append(j)gama.remove(j)while len(Q) > 0:q = Q[0]Q.remove(q)if len(neighbor_list[q]) >= min_Pts:delta = neighbor_list[q] & gamadeltalist = list(delta)for i in range(len(delta)):Q.append(deltalist[i])gama = gama - deltaCk = gama_old - gamaCklist = list(Ck)for i in range(len(Ck)):cluster[Cklist[i]] = komega_list = omega_list - Ckreturn clusterX1, y1 = datasets.make_circles(n_samples=2000, factor=.6, noise=.02)
X2, y2 = datasets.make_blobs(n_samples=400, n_features=2, centers=[[1.2, 1.2]], cluster_std=[[.1]], random_state=9)
X = np.concatenate((X1, X2))
eps = 0.08
min_Pts = 10
begin = time.time()
C = DBSCAN(X, eps, min_Pts)
end = time.time()
plt.figure()
plt.scatter(X[:, 0], X[:, 1], c=C)
plt.show()

结果:

2.2DBSCAN聚类算法实现鸢尾花数据集的聚类

代码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import DBSCAN
from sklearn.decomposition import PCA# 加载鸢尾花数据集
iris = load_iris()
X = iris.data# 使用PCA进行数据降维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)# 使用DBSCAN进行聚类
dbscan = DBSCAN(eps=0.4, min_samples=3)
labels = dbscan.fit_predict(X_pca)# 绘制聚类结果
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=labels)
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('DBSCAN Clustering on Iris Dataset')
plt.show()

结果:

三、K-means聚类算法

3.1K-means聚类算法实现随机数据的聚类

代码:

import torch
import math
import matplotlib.pyplot as pltdef dis(a, b):return math.sqrt((a[0] - b[0]) * (a[0] - b[0]) + (a[1] - b[1]) * (a[1] - b[1]))X = torch.randn(2000) * 100
y = torch.randn(2000) * 100
C = torch.zeros(2000)K = 5
CentPoint = []for i in range(K):CentPoint.append([torch.randint(-100, 100, (1,)).item(),torch.randint(-100, 100, (1,)).item()])print(CentPoint)
for p in range(10):NewPoint = [[0, 0] for i in range(K)]for i in range(len(X)):mDis = 1e9mC = 0for j in range(len(CentPoint)):cp = CentPoint[j]D = dis([X[i].item(), y[i].item()], cp)if mDis > D:mDis = DmC = jC[i] = mCNewPoint[mC][0] += X[i].item()NewPoint[mC][1] += y[i].item()for i in range(K):CentPoint[i][0] = NewPoint[i][0] / 2000CentPoint[i][1] = NewPoint[i][1] / 2000print(CentPoint)cc = list(C)
for i in range(len(X)):if cc[i] == 0:plt.plot(X[i].item(), y[i].item(), 'r.')elif cc[i] == 1:plt.plot(X[i].item(), y[i].item(), 'g.')elif cc[i] == 2:plt.plot(X[i].item(), y[i].item(), 'b.')elif cc[i] == 3:plt.plot(X[i].item(), y[i].item(), color='pink', marker='.')elif cc[i] == 4:plt.plot(X[i].item(), y[i].item(), color='orange', marker='.')for CP in CentPoint:plt.plot(CP[0], CP[1], color='black', marker='X')plt.show()

3.2K-means聚类算法实现鸢尾花数据集的聚类

代码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA# 加载鸢尾花数据集
iris = load_iris()
X = iris.data# 使用PCA进行数据降维
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)# 使用K-means进行聚类
kmeans = KMeans(n_clusters=3, random_state=0)
labels = kmeans.fit_predict(X_pca)# 绘制聚类结果
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=labels)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='x', color='red', label='Centroids')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.title('K-means Clustering on Iris Dataset')
plt.legend()
plt.show()

结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/636425.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【大数据】TiDB: A Raft-based HTAP Database

文章目录 数据库知识介绍数据库系统的ACID特性分布式系统和CAP理论关系型数据库与非关系型数据库关系型数据库非关系型数据库 OldSQL、NoSQL、NewSQLOldSQLNoSQLNewSQL OLTP、OLAP、HTAP 前言&#xff1a;为什么选择TiDB学习&#xff1f;pingCAP介绍TiDB介绍TiDB的影响力TiDB概…

【C】 初识C语言

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;C语言从入门到精通⏪   &#x1f69a;代码仓库:C语言初级&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C知识   &#x1f51d;&#x1f51d; 目录 前言 1. 什么是C语言&#…

STM32学习和实践笔记(14):按键控制实验

消除抖动有软件和硬件两种方法 软件方法就是在首次检测到低电平时加延时&#xff0c;通常延时5-10ms&#xff0c;让抖动先过去&#xff0c;然后再来检测是否仍为低电平&#xff0c;如果仍然是&#xff0c;说明确实按下。 硬件方法就是加RC滤波电路&#xff0c;硬件方法会增加…

Linux - Docker 安装 Nacos

拉取 Nacos 镜像 使用以下命令从 Docker Hub 拉取最新版本的 Nacos 镜像&#xff1a; docker pull nacos/nacos-server启动 Nacos 容器 使用以下命令启动 Nacos 容器&#xff1a; docker run -d \--name nacos \--privileged \--cgroupns host \--env JVM_XMX256m \--env M…

Git:使用conda命令切换虚拟环境

1. 问题 在win10电脑的Git中&#xff0c;无法使用conda list命令&#xff0c;报错&#xff08;bash&#xff1a;conda&#xff1a;command not found&#xff09;。也无法使用conda activate base命令激活虚拟环境&#xff0c;报错&#xff08;bash&#xff1a;conda&#xff…

python免费调用阿里云通义千问(q-wen-max)大模型API

文章目录 通义千问开通免费API Keypython调用阿里云通义千问API 通义千问 通义千问&#xff0c;是基于阿里巴巴达摩院在自然语言处理领域的研究和积累。采用更先进的算法和更优化的模型结构&#xff0c;能够更准确地理解和生成自然语言、代码、表格等文本。 支持更多定制化需…

深度学习500问——Chapter08:目标检测(2)

文章目录 8.2.4 R-FCN 8.2.5 FPN 8.2.6 Mask R-CNN 8.2.4 R-FCN R-FCN 有哪些创新点 R-FCN仍然属于two-stage目标检测算法&#xff1a;RPN R-FCN Fully convolutional位置敏感得分图&#xff08;position-sentive score maps&#xff09; our region-based detector is ful…

vs code server for wsl closed unexpectedly

前言&#xff1a; 我的Windows 版本&#xff1a; 10.0.19045.4291 &#xff08;如果你是Win11或者你要使用WSL2请谨慎&#xff09; 之前是可以用的&#xff0c;但安装Vmware&#xff08;并安装了Ubuntu进行了一番实验后&#xff0c;就出现如标题所述问题&#xff09; 问题&a…

【SpringBoot实战篇】获取用户详细信息

1 明确需求 1需要获取用户详细信息 2 接口文档 1基本信息 2请求参数 无 3 响应数据 响应数据类型&#xff1a;application/json 响应参数说明&#xff1a; 响应数据样例 3 思路分析 1用户名在请求头里获取 4 开发 4.1 控制器usercontroller GetMapping("/userInfo")p…

Solidworks 2024安装教程(附免费安装包资源)

鼠标右击软件压缩包&#xff0c;选择“解压到Solidworks.2024”。 打开解压后的文件夹下的“SolidSQUAD”&#xff0c;双击“sw2024_network_serials_licensing”。 点击“是”。 点击“确定”。 复制“SolidWorks_Flexnet_Server”文件夹。 将其粘贴至C盘。 打开复制后的文件夹…

LabVIEW多设备控制与数据采集系统

LabVIEW多设备控制与数据采集系统 随着科技的进步&#xff0c;自动化测试与控制系统在工业、科研等领域的应用越来越广泛。开发了一种基于LabVIEW平台开发的多设备控制与数据采集系统&#xff0c;旨在解决多设备手动设置复杂、多路数据显示不直观、数据存储不便等问题。通过RS…

Matlab|【复现】主动配电网故障定位方法研究

目录 1 主要内容 算例模型 期望故障电流状态函数 评价函数&#xff08;膨胀率函数&#xff09; 算例验证方法 详实的文档说明 2 部分程序 3 程序结果 4 下载链接 1 主要内容 该程序方法复现了《基于改进多元宇宙算法的主动配电网故障定位方法研究》_郑聪&#xff0c;建…