当前位置:   article > 正文

头歌--机器学习之k-means_机器学习 --- k-means sklearn中的k-means头歌

机器学习 --- k-means sklearn中的k-means头歌

目录

1.距离度量

2.什么是质心

3.k-means算法流程

4.sklearn中的k-means


1.距离度量

  1. #encoding=utf8
  2. import numpy as np
  3. def distance(x,y,p=2):
  4. '''
  5. input:x(ndarray):第一个样本的坐标
  6. y(ndarray):第二个样本的坐标
  7. p(int):等于1时为曼哈顿距离,等于2时为欧氏距离
  8. output:distance(float):x到y的距离
  9. '''
  10. #********* Begin *********#
  11. if p == 1:
  12. distance = np.sum(np.abs(x - y))
  13. elif p == 2:
  14. distance = np.sqrt(np.sum((x - y) ** 2))
  15. else:
  16. raise ValueError("p的值只能为1或2")
  17. return distance
  18. #********* End *********#

2.什么是质心

  1. #encoding=utf8
  2. import numpy as np
  3. #计算样本间距离
  4. def distance(x, y, p=2):
  5. '''
  6. input:x(ndarray):第一个样本的坐标
  7. y(ndarray):第二个样本的坐标
  8. p(int):等于1时为曼哈顿距离,等于2时为欧氏距离
  9. output:distance(float):x到y的距离
  10. '''
  11. #********* Begin *********#
  12. if p == 1:
  13. distance = np.sum(np.abs(x - y))
  14. elif p == 2:
  15. distance = np.sqrt(np.sum((x - y) ** 2))
  16. else:
  17. raise ValueError("p的值只能为1或2")
  18. return distance
  19. #********* End *********#
  20. #计算质心
  21. def cal_Cmass(data):
  22. '''
  23. input:data(ndarray):数据样本
  24. output:mass(ndarray):数据样本质心
  25. '''
  26. #********* Begin *********#
  27. Cmass = np.mean(data, axis=0)
  28. #********* End *********#
  29. return Cmass
  30. #计算每个样本到质心的距离,并按照从小到大的顺序排列
  31. def sorted_list(data,Cmass):
  32. '''
  33. input:data(ndarray):数据样本
  34. Cmass(ndarray):数据样本质心
  35. output:dis_list(list):排好序的样本到质心距离
  36. '''
  37. #********* Begin *********#
  38. dis_list = []
  39. for sample in data:
  40. dis = distance(sample, Cmass)
  41. dis_list.append(dis)
  42. dis_list.sort()
  43. #********* End *********#
  44. return dis_list

3.k-means算法流程

  1. #encoding=utf8
  2. import numpy as np
  3. # 计算一个样本与数据集中所有样本的欧氏距离的平方
  4. def euclidean_distance(one_sample, X):
  5. one_sample = one_sample.reshape(1, -1)
  6. distances = np.power(np.tile(one_sample, (X.shape[0], 1)) - X, 2).sum(axis=1)
  7. return distances
  8. class Kmeans():
  9. """Kmeans聚类算法.
  10. Parameters:
  11. -----------
  12. k: int
  13. 聚类的数目.
  14. max_iterations: int
  15. 最大迭代次数.
  16. varepsilon: float
  17. 判断是否收敛, 如果上一次的所有k个聚类中心与本次的所有k个聚类中心的差都小于varepsilon,
  18. 则说明算法已经收敛
  19. """
  20. def __init__(self, k=2, max_iterations=500, varepsilon=0.0001):
  21. self.k = k
  22. self.max_iterations = max_iterations
  23. self.varepsilon = varepsilon
  24. np.random.seed(1)
  25. # 从所有样本中随机选取self.k样本作为初始的聚类中心
  26. def init_random_centroids(self, X):
  27. random_indices = np.random.permutation(X.shape[0])
  28. centroids = X[random_indices[:self.k]]
  29. return centroids
  30. # 返回距离该样本最近的一个中心索引[0, self.k)
  31. def _closest_centroid(self, sample, centroids):
  32. distances = euclidean_distance(sample, centroids)
  33. closest_index = np.argmin(distances)
  34. return closest_index
  35. # 将所有样本进行归类,归类规则就是将该样本归类到与其最近的中心
  36. def create_clusters(self, centroids, X):
  37. clusters = [[] for _ in range(self.k)]
  38. for sample in X:
  39. index = self._closest_centroid(sample, centroids)
  40. clusters[index].append(sample)
  41. return clusters
  42. # 对中心进行更新
  43. def update_centroids(self, clusters, X):
  44. centroids = np.zeros((self.k, X.shape[1]))
  45. for i, cluster in enumerate(clusters):
  46. centroids[i] = np.mean(cluster, axis=0)
  47. return centroids
  48. # 将所有样本进行归类,其所在的类别的索引就是其类别标签
  49. def get_cluster_labels(self, clusters, X):
  50. labels = np.zeros(X.shape[0])
  51. for i, cluster in enumerate(clusters):
  52. for sample in cluster:
  53. index = np.where((X == sample).all(axis=1))[0][0]
  54. labels[index] = i
  55. return labels
  56. # 对整个数据集X进行Kmeans聚类,返回其聚类的标签
  57. def predict(self, X):
  58. # 从所有样本中随机选取self.k样本作为初始的聚类中心
  59. centroids = self.init_random_centroids(X)
  60. # 迭代,直到算法收敛(上一次的聚类中心和这一次的聚类中心几乎重合)或者达到最大迭代次数
  61. for _ in range(self.max_iterations):
  62. # 将所有进行归类,归类规则就是将该样本归类到与其最近的中心
  63. clusters = self.create_clusters(centroids, X)
  64. # 计算新的聚类中心
  65. new_centroids = self.update_centroids(clusters, X)
  66. # 如果聚类中心几乎没有变化,说明算法已经收敛,退出迭代
  67. if np.linalg.norm(new_centroids - centroids) < self.varepsilon:
  68. break
  69. centroids = new_centroids
  70. # 将所有样本进行归类,其所在的类别的索引就是其类别标签
  71. labels = self.get_cluster_labels(clusters, X)
  72. return labels

4.sklearn中的k-means

  1. #encoding=utf8
  2. from sklearn.cluster import KMeans
  3. def kmeans_cluster(data):
  4. '''
  5. input:data(ndarray):样本数据
  6. output:result(ndarray):聚类结果
  7. '''
  8. #********* Begin *********#
  9. kmeans = KMeans(n_clusters=3)
  10. result = kmeans.fit_predict(data)
  11. #********* End *********#
  12. return result

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/827454
推荐阅读
相关标签
  

闽ICP备14008679号