Educoder 机器学习 --- k-means
第1关:距离度量
欧氏距离
欧氏距离是最容易直观理解的距离度量方法,我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。
曼哈顿距离
顾名思义,在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离”。曼哈顿距离也称为“城市街区距离”。
编程要求
请仔细阅读右侧代码,结合相关知识,在 Begin-End 区域内进行代码补充,完成使用Python编写一个能计算样本间欧式距离与曼哈顿距离的方法。
#encoding=utf8 import numpy as np def distance(x,y,p=2): ''' input:x(ndarray):第一个样本的坐标 y(ndarray):第二个样本的坐标 p(int):等于1时为曼哈顿距离,等于2时为欧氏距离 output:distance(float):x到y的距离 ''' #********* Begin *********# dis2 = np.sum(np.abs(x-y)**p) dis = np.power(dis2,1/p) return dis #********* End *********#
第2关:什么是质心
编程要求
请仔细阅读右侧代码,结合相关知识,在 Begin-End 区域内进行代码补充,完成质心的计算。
#encoding=utf8 import numpy as np #计算样本间距离 def distance(x, y, p=2): ''' input:x(ndarray):第一个样本的坐标 y(ndarray):第二个样本的坐标 p(int):等于1时为曼哈顿距离,等于2时为欧氏距离 output:distance(float):x到y的距离 ''' #********* Begin *********# dis2 = np.sum(np.abs(x-y)**p) dis = np.power(dis2,1/p) return dis #********* End *********# #计算质心 def cal_Cmass(data): ''' input:data(ndarray):数据样本 output:mass(ndarray):数据样本质心 ''' #********* Begin *********# Cmass = np.mean(data,axis=0) #********* End *********# return Cmass #计算每个样本到质心的距离,并按照从小到大的顺序排列 def sorted_list(data,Cmass): ''' input:data(ndarray):数据样本 Cmass(ndarray):数据样本质心 output:dis_list(list):排好序的样本到质心距离 ''' #********* Begin *********# dis_list = [] for i in range(len(data)): dis_list.append(distance(Cmass,data[i][:])) dis_list = sorted(dis_list) #********* End *********# return dis_list
第3关:k-means算法流程
任务描述
本关任务:使用Python实现k-means算法,并根据红酒的13个特征对红酒数据进行聚类。
相关知识
为了完成本关任务,你需要掌握:1.k-means算法原理,2.k-means算法流程,3.如何确定k的值。
数据集介绍
数据集为一份红酒数据,一共有178个样本,每个样本有13个特征,这里不会提供你红酒的标签,你需要自己根据这13个特征对红酒进行聚类,部分数据如下图:
编程要求
请仔细阅读右侧代码,结合相关知识,在 Begin-End 区域内进行代码补充,完使用Python实现k-means算法的任务。
#encoding=utf8 import numpy as np # 计算一个样本与数据集中所有样本的欧氏距离的平方 def euclidean_distance(one_sample, X): one_sample = one_sample.reshape(1, -1) distances = np.power(np.tile(one_sample, (X.shape[0], 1)) - X, 2).sum(axis=1) return distances def cal_dis(old_centroids, centroids): dis = 0 for i in range(old_centroids.shape[0]): dis += np.linalg.norm(old_centroids[i] - centroids[i], 2) return dis class Kmeans(): """Kmeans聚类算法. Parameters: ----------- k: int 聚类的数目. max_iterations: int 最大迭代次数. varepsilon: float 判断是否收敛, 如果上一次的所有k个聚类中心与本次的所有k个聚类中心的差都小于varepsilon, 则说明算法已经收敛 """ def __init__(self, k=2, max_iterations=500, varepsilon=0.0001): self.k = k self.max_iterations = max_iterations self.varepsilon = varepsilon np.random.seed(1) #********* Begin *********# # 从所有样本中随机选取self.k样本作为初始的聚类中心 def init_random_centroids(self, X): m, n = X.shape center = np.zeros((self.k, n)) for i in range(self.k): index = int(np.random.uniform(0, m)) center[i] = X[index] return center # 返回距离该样本最近的一个中心索引[0, self.k) def _closest_centroid(self, sample, centroids): distances = euclidean_distance(sample, centroids) return np.argsort(distances)[0] # 将所有样本进行归类,归类规则就是将该样本归类到与其最近的中心 def create_clusters(self, centroids, X): m, n = X.shape clusters = np.mat(np.zeros((m, 1))) for i in range(m): index = self._closest_centroid(X[i], centroids) clusters[i] = index return clusters # 对中心进行更新 def update_centroids(self, clusters, X): centroids = np.zeros([self.k, X.shape[1]]) for i in range(self.k): pointsInCluster = [] for j in range(clusters.shape[0]): if clusters[j] == i: pointsInCluster.append(X[j]) centroids[i] = np.mean(pointsInCluster, axis=0) # 对矩阵的行求均值 return centroids # 将所有样本进行归类,其所在的类别的索引就是其类别标签 def get_cluster_labels(self, clusters, X): return # 对整个数据集X进行Kmeans聚类,返回其聚类的标签 def predict(self, X): # 从所有样本中随机选取self.k样本作为初始的聚类中心 centroids = self.init_random_centroids(X) clusters = [] iter = 0 # 迭代,直到算法收敛(上一次的聚类中心和这一次的聚类中心几乎重合)或者达到最大迭代次数 while iter < self.max_iterations: iter += 1 # 将所有进行归类,归类规则就是将该样本归类到与其最近的中心 clusters = self.create_clusters(centroids, X) # 计算新的聚类中心 old_centroids = centroids[:] centroids = self.update_centroids(clusters, X) if cal_dis(old_centroids, centroids) < self.varepsilon: break # 如果聚类中心几乎没有变化,说明算法已经收敛,退出迭代 return np.array(clusters).reshape([X.shape[0], ]) #********* End *********#
本文来自博客园,作者:Nikkie-02,转载请注明原文链接:https://www.cnblogs.com/Nikkie-02/p/16836867.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)