资源简介
k-means的python实现及数据,使用numpy实现了k-means的算法实例
代码片段和文件信息
import numpy as np
import matplotlib.pyplot as plt
# 返回距离样本最近的质心的下标索引
def group_one(sample centers):
distance_vect = np.sum((sample-centers)**2 axis=1)
return np.argmin(distance_vect)
# 将所有样本分组到k个质心,返回二维列表[[属于分组1的样本][属于分组2的样本]...]
def group_all(data k centers):
# 这里使用二维列表,而不是ndarray的原因在于,每个分组的大小,也就是样本的个数是不确定的
# 而array是确定大小的,强行转换这里会变成列表对象的数组,效率低下且更容易出错
# 如果有更好的做法欢迎交流
groups = []
for index in range(k):
groups.append([])
# 对每一个样本进行分组
for sample in data:
index = group_one(sample centers)
groups[index].append(sample.tolist())
return groups
# 根据样本分组,更新每个质心的位置
def update_centers(data k groups):
centers = np.zeros((k data.shape[1]))
for index in range(k):
centers[index] = np.mean(np.array(groups[index]) axis=0)
return centers
# 检测与上一次迭代的更新差值
def iter_diff(old_centers new_centers):
return np.sum(np.abs(old_centers - new_centers))
# 生成随机质心
def rand_center(data k):
# 共k个质心,data.shape[1]是每个数据样本的维度,质心的维度应与样本的维度一致。
centers = np.random.rand(k data.shape[1])
# rand随机的范围是零到一,要适用于样本的范围需要进行缩放
# 这里使用样本在该维度的最大值作为每个维度上的缩放倍数
scale = np.max(data axis=0)
centers *= scale
return centers
# 迭代主体函数
def classify(data k threshold max_iter=0):
centers = rand_center(data k)
loss = float(“inf“)
iter_count = 0
# 当loss小于阈值,或迭代次数大于指定最大次数时(若不指定则只判断loss足够低)终止
while loss > threshold and ((max_iter == 0) or iter_count < max_iter):
groups = group_all(data k centers)
old_centers = centers
centers = update_centers(data k groups)
loss = iter_diff(old_centers centers)
iter_count += 1
print(“iter_%d : loss=%f“ % (iter_count loss))
return centers groups
# 绘图
def paint_result(data centers k groups debug=False):
c = []
flatten_group = []
for index in range(k):
for item in groups[index]:
c.append(index)
flatten_group.append(item)
groups = np.array(flatten_group)
if debug:
plt.scatter(groups[: 0] groups[: 1])
else:
plt.scatter(groups[: 0] groups[: 1]c=c)
plt.scatter(centers[: 0] centers[: 1] color=“red“)
plt.show()
def main():
data = np.loadtxt(“d:/data.csv“ delimiter=““)
data.resize((500 2))
center groups = classify(data 3 0 0)
paint_result(data center 3 groups)
if __name__ == ‘__main__‘:
main()
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 25501 2018-03-18 23:56 data.csv
文件 3160 2018-03-19 22:17 kmeans.py
相关资源
- Python教学大纲.rar
- ESP8266通过MQTT订阅主题并推送数据到
- 模拟退火-遗传算法 34省会城市TSP问题
- python题库112732
- 基于Mnist数据集的贝叶斯分类器
- python 实现股票分时图K线图及抓取免费
- textrank自动文摘抽取python代码
- arcpy 工具包
- pyexcelerator
- PYTHON题库
- MNIST数据集获取 input_data.py
- 利用selenium编写的python网络爬虫-淘宝
- 人脸检测python源代码
- python实现可暂停的动态曲线绘制,横
- python2048游戏源代码
- 机器学习-python处理UCI鲍鱼数据集.ra
- python带基因元胞自动机代码
- python-web系统实时监控
- numpy-1.17.0+mkl-cp37-cp37m-win_amd64.whl百度云
- 四行Python代码实现将word文件转换为
- python评分卡模型数据源
- 传智播客 python基础班 + 就业班 + 课件
- python实现简易3D方块动画
- 基于PYTHON+OPENCV的SIFT SURF图像特征匹配
- python总结
- boost.python 动态编译库
- 高斯投影正反算Python源码
- python xlutils
- Python3网络爬虫实战思维导图
- ros_arduino_python 调通版
评论
共有 条评论