用python实现:用pandas库读取csv文件,其中olgt列为起点经度,olat列为起点纬度,绘制样本点分布图,使用Kmeans对其进行聚类,并根据不同k值选择,通过轮廓系数、Calinski-Harabaz指数、肘部法则等评价其聚类效果。要求自行编写聚类函数,不调用包。

时间: 2023-12-22 07:02:33 浏览: 33
以下是Python代码实现: ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt # 读取CSV文件 data = pd.read_csv('data.csv') # 获取起点经度和纬度 X = np.array(data[['olgt', 'olat']]) # 绘制样本点分布图 plt.scatter(X[:, 0], X[:, 1], s=50) plt.xlabel('Longitude') plt.ylabel('Latitude') plt.show() # 自定义K-means聚类函数 def kmeans(X, k, max_iterations=100): # 随机选择k个初始质心 indices = np.random.choice(len(X), size=k, replace=False) centers = X[indices] for i in range(max_iterations): # 计算每个点到各个质心的距离 distances = np.linalg.norm(X[:, np.newaxis] - centers, axis=2) # 将每个点归为距离最近的质心所在的簇 labels = np.argmin(distances, axis=1) # 计算每个簇的新质心 new_centers = np.array([X[labels == j].mean(axis=0) for j in range(k)]) # 如果新质心与旧质心相同,则退出循环 if np.all(centers == new_centers): break centers = new_centers return centers, labels # 定义轮廓系数函数 def silhouette_coefficient(X, labels): n = len(X) a = np.array([np.mean([np.linalg.norm(X[i] - X[j]) for j in range(n) if labels[j] == labels[i]]) for i in range(n)]) b = np.array([np.min([np.mean([np.linalg.norm(X[i] - X[j]) for j in range(n) if labels[j] == k]) for k in set(labels) if k != labels[i]]) for i in range(n)]) s = (b - a) / np.maximum(a, b) return np.mean(s) # 定义Calinski-Harabasz指数函数 def calinski_harabasz(X, labels): n = len(X) k = len(set(labels)) c = np.array([X[labels == i].mean(axis=0) for i in range(k)]) ssw = sum([np.sum([np.linalg.norm(X[j] - c[i]) ** 2 for j in range(n) if labels[j] == i]) for i in range(k)]) ssb = np.sum([np.sum([np.linalg.norm(c[i] - X.mean(axis=0)) ** 2 for i in range(k)]) for j in range(n)]) ch = (ssb / (k - 1)) / (ssw / (n - k)) return ch # 使用Kmeans对数据进行聚类,并评价聚类效果 for k in range(2, 6): centers, labels = kmeans(X, k) s = silhouette_coefficient(X, labels) ch = calinski_harabasz(X, labels) print(f'K={k}, Silhouette Coefficient={s:.4f}, Calinski-Harabasz Index={ch:.4f}') # 绘制聚类结果 plt.scatter(X[:, 0], X[:, 1], c=labels, s=50) plt.scatter(centers[:, 0], centers[:, 1], marker='*', s=200, c='black') plt.xlabel('Longitude') plt.ylabel('Latitude') plt.show() ``` 注意,在运行代码之前,需要将CSV文件名修改为实际文件名。运行后,会先绘制样本点分布图,然后对数据进行Kmeans聚类,并输出不同K值下的轮廓系数和Calinski-Harabasz指数。最后,会绘制聚类结果图。

最新推荐

recommend-type

使用Python中的matplotlib库读取csv文件绘制混合图

data = pd.read_csv('taobao_data.csv', index_col='\u4f4d\u7f6e') data.drop(['宝贝', '卖家'], inplace=True, axis=1) data = data.groupby(['位置']).mean().sort_values(by='\u6210\u4ea4\u91cf') print(data....
recommend-type

使用Python(pandas库)处理csv数据

(注:本文写于做毕设期间,有处理大量csv文件的需要,故使用python强大的库资源来处理数据,希望对有需要的你提供帮助和启发) 使用Python(pandas)处理数据 原始数据和处理之后的样式 图中为一个csv文件,待处理的...
recommend-type

pandas读取csv文件提示不存在的解决方法及原因分析

主要介绍了pandas读取csv文件提示不存在的解决方法及原因分析,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

使用python的pandas为你的股票绘制趋势图

主要介绍了通过python为你的股票绘制趋势图,动手写个小程序, 把股票趋势每天早上发到邮箱里,用 python 的 pandas, matplotlib 写起来很容易, 几十行代码搞定。,需要的朋友可以参考下
recommend-type

Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作

主要介绍了Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

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

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

用Spring boot和vue写一个登录注册界面

好的,这是一个比较常见的技术问题,我可以为您提供一些参考资料和思路。首先,您可以使用Spring Boot作为后端框架来处理用户认证和注册的逻辑,比如使用Spring Security实现用户登录认证。同时,您还需要设计相应的数据模型和数据库表结构来存储用户信息。在前端方面,您可以使用Vue.js作为框架来构建登录注册页面,使用Axios来发起API请求并和后端进行交互。当然,在实现过程中,还需要考虑一些具体细节,比如数据校验、安全性和用户体验等方面。希望这些信息能够帮助到您。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。