用python实现k-means聚类算法

时间: 2023-11-30 16:33:05 浏览: 23
好的,以下是用Python实现K-means聚类算法的代码: ```python import numpy as np from sklearn.datasets import make_blobs def euclidean_distance(x1, x2): return np.sqrt(np.sum((x1 - x2)**2)) class KMeans: def __init__(self, k=5, max_iters=100, plot_steps=False): self.k = k self.max_iters = max_iters self.plot_steps = plot_steps # list of sample indices for each cluster self.clusters = [[] for _ in range(self.k)] # mean feature vector for each cluster self.centroids = [] def predict(self, X): self.X = X self.n_samples, self.n_features = X.shape # initialize centroids random_sample_idxs = np.random.choice(self.n_samples, self.k, replace=False) self.centroids = [self.X[idx] for idx in random_sample_idxs] # optimization loop for _ in range(self.max_iters): # update clusters self.clusters = self._create_clusters(self.centroids) if self.plot_steps: self.plot() # update centroids centroids_old = self.centroids.copy() self.centroids = self._get_centroids(self.clusters) # check if converged if self._is_converged(centroids_old, self.centroids): break if self.plot_steps: self.plot() # return cluster labels return self._get_cluster_labels(self.clusters) def _get_cluster_labels(self, clusters): labels = np.empty(self.n_samples) for cluster_idx, cluster in enumerate(clusters): for sample_idx in cluster: labels[sample_idx] = cluster_idx return labels def _create_clusters(self, centroids): clusters = [[] for _ in range(self.k)] for idx, sample in enumerate(self.X): centroid_idx = self._closest_centroid(sample, centroids) clusters[centroid_idx].append(idx) return clusters def _closest_centroid(self, sample, centroids): distances = [euclidean_distance(sample, point) for point in centroids] closest_idx = np.argmin(distances) return closest_idx def _get_centroids(self, clusters): centroids = np.zeros((self.k, self.n_features)) for cluster_idx, cluster in enumerate(clusters): cluster_mean = np.mean(self.X[cluster], axis=0) centroids[cluster_idx] = cluster_mean return centroids def _is_converged(self, centroids_old, centroids): distances = [euclidean_distance(centroids_old[i], centroids[i]) for i in range(self.k)] return np.sum(distances) == 0 def plot(self): fig, ax = plt.subplots(figsize=(12, 8)) for i, index in enumerate(self.clusters): point = self.X[index].T ax.scatter(*point) for point in self.centroids: ax.scatter(*point, marker="x", color='black', linewidth=2) plt.show() ``` 这里我们先定义了一个 `euclidean_distance` 函数来计算两个样本之间的欧几里得距离。然后定义了 `KMeans` 类,其中我们定义了聚类数、最大迭代次数和是否绘制聚类步骤的标志。在 `predict` 方法中进行了优化迭代,首先初始化聚类中心,然后根据聚类中心更新聚类并更新聚类中心,直到算法收敛或达到最大迭代次数。最后返回聚类标签。在 `_create_clusters` 方法中,我们根据每个样本到聚类中心的距离将其分配到相应的聚类中。在 `_get_centroids` 方法中,我们计算每个聚类的平均特征向量,并返回平均特征向量作为聚类中心。在 `_is_converged` 方法中,我们使用欧几里得距离判断算法是否收敛。最后,我们在 `plot` 方法中绘制了每个聚类的数据点和聚类中心。

相关推荐

zip
爬虫(Web Crawler)是一种自动化程序,用于从互联网上收集信息。其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始URL开始,递归或迭代地发现新的URL,构建一个URL队列。这些URL可以通过链接分析、站点地图、搜索引擎等方式获取。 请求网页: 爬虫使用HTTP或其他协议向目标URL发起请求,获取网页的HTML内容。这通常通过HTTP请求库实现,如Python中的Requests库。 解析内容: 爬虫对获取的HTML进行解析,提取有用的信息。常用的解析工具有正则表达式、XPath、Beautiful Soup等。这些工具帮助爬虫定位和提取目标数据,如文本、图片、链接等。 数据存储: 爬虫将提取的数据存储到数据库、文件或其他存储介质中,以备后续分析或展示。常用的存储形式包括关系型数据库、NoSQL数据库、JSON文件等。 遵守规则: 为避免对网站造成过大负担或触发反爬虫机制,爬虫需要遵守网站的robots.txt协议,限制访问频率和深度,并模拟人类访问行为,如设置User-Agent。 反爬虫应对: 由于爬虫的存在,一些网站采取了反爬虫措施,如验证码、IP封锁等。爬虫工程师需要设计相应的策略来应对这些挑战。 爬虫在各个领域都有广泛的应用,包括搜索引擎索引、数据挖掘、价格监测、新闻聚合等。然而,使用爬虫需要遵守法律和伦理规范,尊重网站的使用政策,并确保对被访问网站的服务器负责。

最新推荐

Python用K-means聚类算法进行客户分群的实现

通过会员卡,你用有一些关于你的客户的基本数据,如客户ID,年龄,性别,年收入和消费分数。 消费分数是根据客户行为和购买数据等定义的参数分配给客户的。 问题陈述:你拥有这个商场。想要了解怎么样的顾客可以很...

python基于K-means聚类算法的图像分割

主要介绍了python基于K-means聚类算法的图像分割,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Python——K-means聚类分析及其结果可视化

K-Means是聚类算法的一种,通过距离来判断数据点间的相似度并据此对数据进行聚类。 1 聚类算法 科学计算中的聚类方法 方法名称 参数 可伸缩性 用例 几何形状(使用的指标) K-Means number of ...

k-means 聚类算法与Python实现代码

k-means 聚类算法思想先随机选择k个聚类中心,把集合里的元素与最近的聚类中心聚为一类,得到一次聚类,再把每一个类的均值作为新的聚类中心重新聚类,迭代n次得到最终结果分步解析 一、初始化聚类中心 首先随机...

python中实现k-means聚类算法详解

k-means算法实际上就是通过计算不同样本间的距离来判断他们的相近关系的,相近的就会放到同一个类别中去。 1.首先我们需要选择一个k值,也就是我们希望把数据分成多少类,这里k值的选择对结果的影响很大,Ng的课说的...

GIS设备运行管理重点及运行注意事项PPT课件.pptx

GIS设备运行管理重点及运行注意事项PPT课件.pptx

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire

电子商务中的多渠道销售管理技术

# 1. 多渠道销售管理技术的概述 1.1 电子商务中的多渠道销售概念及特点 在当今数字化时代,多渠道销售已成为企业成功的关键。多渠道销售是指企业通过多种不同的销售渠道(如线下实体店铺、线上电子商务平台、移动应用等)向消费者提供产品或服务的销售模式。这种模式的特点包括覆盖面广、销售渠道多样化、服务体验多样化等。 1.2 多渠道销售管理技术的重要性 多渠道销售管理技术的引入可以有效帮助企业实现跨渠道销售数据的整合与分析,提高销售效率,优化用户体验,增强市场竞争力。通过技术手段的支持,企业可以更好地监控和管理不同销售渠道的表现,及时作出调整和改进。 1.3 多渠道销售管理技术对商业发展的影响

cuda 的库目录环境变量, 在cmake中

在 CMake 中,可以使用 `find_library()` 函数来查找 CUDA 库文件并将其链接到目标中。此函数会自动查找 CUDA 库文件所在的目录,并将该目录添加到目标的链接器路径中。如果需要指定 CUDA 库文件的目录,可以在 `find_library()` 函数中设置 `PATHS` 参数。例如,以下代码段可以在 CMake 中查找 CUDA 库文件并将其链接到目标中: ``` find_library(CUDA_LIBS cudart PATHS /path/to/cuda/lib) target_link_libraries(my_target ${CUDA_LIBS}

知识产权大数据平台建设方案.docx

知识产权大数据平台建设方案.docx