【机器学习】k-means算法原理自实现

  1 import pandas as pd
  2 import numpy as np
  3 import matplotlib.pyplot   as plt
  4 from sklearn.cluster import KMeans # 导入k-means
  5
  6
  7 def build_data():
  8     """
  9     构建数据
 10     :return:data
 11     """
 12     # (1)加载数据
 13     data = pd.read_table("../day08/test.txt", sep="\t")
 14     print("data:\n", data)
 15     # print("data的数据类型\n", data.dtypes)
 16     # (2)转化为矩阵
 17     data = np.mat(data.values)
 18
 19     # print("data:\n",data)
 20
 21     return data
 22
 23
 24 def center_init(data, k):
 25     """
 26     初始化聚类中心
 27     :param data: 数据
 28     :param k: 聚类的类别数量
 29     :return: center
 30     """
 31     # 获取数据的行数
 32     index_num = data.shape[0]
 33     print(index_num)
 34     # 获取数据的列数
 35     columns_num = data.shape[1]
 36     print(columns_num)
 37     # for i in range(k):
 38     #     # 随机选择一行所有的数据作为一个中心
 39     #     # [low,high)
 40     #     r = np.random.randint(low=0, high=index_num, dtype=np.int32)
 41     #     print("r:\n",r)
 42     # 先初始化一个全为0 的聚类中心
 43     center = np.zeros(shape=(k, columns_num))
 44     # 设计列表来退出循环
 45     r_list = []
 46     # 设计一个计数器来 给聚类中心赋值
 47     i = 0
 48     while True:
 49         #   # 随机选择一行所有的数据作为一个中心
 50         #   # [low,high)
 51         r = np.random.randint(low=0, high=index_num, dtype=np.int32)
 52         if r not in r_list:
 53             # print("初始化为聚类中心")
 54             # 给聚类中心进行赋值
 55             center[i, :] = data[r, :]
 56             r_list.append(r)
 57             i += 1
 58         else:
 59             continue
 60         # 如果 随机选择了4个不同的r,那就退出循环
 61         if len(r_list) == k:
 62             break
 63
 64     return center
 65
 66
 67 def distance(v1, v2):
 68     """
 69     计算距离
 70     :param v1:点1
 71     :param v2: 点2
 72     :return: 距离dist
 73     """
 74     # 法1
 75     # v1 是矩阵 将矩阵转化数组,再进行降为1维
 76     # v1 = v1.A[0]
 77     # print(v1)
 78     # sum_ = 0
 79     # for i in range(v1.shape[0]):
 80     #     sum_ += (v1[i] - v2[i]) ** 2
 81     # dist = np.sqrt(sum_)
 82     # print(dist)
 83     # 法2
 84     dist = np.sqrt(np.sum(np.power((v1 - v2), 2)))
 85     return dist
 86
 87
 88 def k_means_owns(data, k):
 89     """
 90     自实现k-means
 91     :param data: 需要的聚类的样本
 92     :param k: 聚类的类别数目
 93     :return: None
 94     """
 95
 96     # 获取数据的行数
 97     index_num = data.shape[0]
 98
 99     # 创建一个new_data 来保存每一个样本的最短距离与属于哪一个聚类中心的簇
100     new_data = np.zeros(shape=(index_num, 2))
101     print("new_data: \n", new_data)
102
103     # (1)初始化聚类中心--随机在所有样本选择4行样本作为聚类中心
104     center = center_init(data, k)
105     print("center:\n", center)
106     flag = True
107     while flag:
108         flag = False
109         # (2) 计算每一个样本与每一个聚类中心的距离
110         for i in range(index_num):
111             min_dist = 10000000000000
112             min_index = -1
113             for j in range(k):
114                 # 计算距离
115                 dist = distance(data[i, :], center[j, :])
116                 print("dist:\n", dist)
117                 if dist < min_dist:
118                     min_dist = dist
119                     min_index = j
120             if new_data[i, 0] != min_index:
121                 flag = True
122                 new_data[i, :] = min_index, min_dist
123
124         if flag:
125             # 求取各个簇的中心
126             for p in range(k):
127                 # p   --->0 1 2 3
128                 p_cluster = data[new_data[:, 0] == p, :]
129                 # print("第%d簇的样本:" % p)
130                 # print(p_cluster)
131                 # 计算新的聚类中心
132                 center[p, :] = p_cluster[:, 0].mean(), p_cluster[:, 1].mean()
133
134     return new_data, center
135
136
137 def show_res_owns(data, new_data, center):
138     """
139     结果展示
140     :param data: 原数据
141     :param new_data: 记录属于哪一类别的数据
142     :param center: 聚类中心
143     :return: None
144     """
145     # 1、创建画布
146     plt.figure()
147     # 2、绘图
148     color_list = ["r", "g", "pink", "y"]
149     # 散点图
150     for i in range(data.shape[0]):
151         plt.scatter(data[i, 0], data[i, 1], c=color_list[int(new_data[i, 0])])
152
153     # 绘制标注
154     plt.plot(center[:, 0], center[:, 1], "bx", markersize=12)
155     # 3、展示
156     plt.show()
157
158
159 def show_res(data, y_predict, center):
160     """
161     结果展示
162     :param data: 原数据
163     :param y_predict: 预测类别
164     :param center: 聚类中心
165     :return: None
166     """
167     # 1、创建画布
168     plt.figure()
169     # 2、绘图
170     color_list = ["r", "g", "pink", "y"]
171     # 散点图
172     for i in range(data.shape[0]):
173         plt.scatter(data[i, 0], data[i, 1], c=color_list[y_predict[i]])
174
175     # 绘制标注
176     plt.plot(center[:, 0], center[:, 1], "bx", markersize=12)
177     # 3、展示
178     plt.show()
179
180
181
182 def main():
183     """
184     主函数
185     :return: None
186     """
187     # 1、构建数据
188     data = build_data()
189     print("data:\n", data)
190
191     # 2、自实现k-means
192     # (1)确定聚类的类别数目
193     k = 4
194     new_data, center = k_means_owns(data, k)
195     #
196     print("new_data:\n", new_data)
197     print("最终的聚类中心:\n", center)
198
199     # 3、结果展示
200     show_res_owns(data, new_data, center)
201
202
203     # 使用sklearn中的kmeans来实现聚类
204     # 1、创建算法实例
205     # km = KMeans(n_clusters=k)
206     # # 2、训练数据
207     # km.fit(data)
208     # # 3、进行预测
209     # y_predict = km.predict(data)
210     # # 获取聚类中心
211     # center = km.cluster_centers_
212     #
213     # print("预测值:\n",y_predict)
214     # print("center:\n",center)
215
216     # 进行结果展示
217     # show_res(data,y_predict,center)
218
219
220 if __name__ == ‘__main__‘:
221     main()

原文地址:https://www.cnblogs.com/Tree0108/p/12116152.html

时间: 2024-10-05 22:21:04

【机器学习】k-means算法原理自实现的相关文章

机器学习之Adaboost算法原理

转自:http://www.cnblogs.com/pinard/p/6133937.html 在集成学习原理小结中,我们讲到了集成学习按照个体学习器之间是否存在依赖关系可以分为两类,第一个是个体学习器之间存在强依赖关系,另一类是个体学习器之间不存在强依赖关系.前者的代表算法就是是boosting系列算法.在boosting系列算法中, Adaboost是最著名的算法之一.Adaboost既可以用作分类,也可以用作回归.本文就对Adaboost算法做一个总结. 1. 回顾boosting算法的基

机器学习——k最近邻算法(K-Nearest Neighbor,Python实现)

一.什么是看KNN算法? 二.KNN算法的一般流程 三.KNN算法的Python代码实现 numpy模块参考教程:http://old.sebug.net/paper/books/scipydoc/index.html 一:什么是看KNN算法? kNN算法全称是k-最近邻算法(K-Nearest Neighbor) kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.该方法在确定分类决策上只依据最邻近的一个

机器学习入门-线性回归算法(原理)

数据:工资和年龄(2个特征) 目标:预测银行会贷款多少钱(标签) 考虑: 工资和年龄影响银行贷款,它们各自的影响大小(参数) x1, x2 表示的是两个特征(年龄, 工资) y 是银行最终会借我们多少钱 找到一条最合适线(一些高维点)来最好拟合我们的数据点 假设theta1是年龄的参数, theta2是工资的参数 h0 = theta0 + theta1 * x1 + theta2 * x2  # 目标函数np.dot(X, theta.T) y = h0 + error  # 真实值与预测值的

机器学习实战笔记-K近邻算法1(分类动作片与爱情片)

K近邻算法采用测量不同特征值之间的距离方法进行分类 K近邻算法特点: 优点:精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围:数值型和标称型. K近邻算法原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据(最近 邻)的分类标签.一般来说,我们只选择样本数据集中前k个最

机器学习十大算法(二)

文章来源:https://www.dezyre.com/article/top-10-machine-learning-algorithms/202 本人自行翻译,如有错误,还请指出.后续会继续补充实例及代码实现. 3.机器学习算法概述 3.1 朴素贝叶斯分类器算法 手动分类网页,文档,电子邮件或任何其他冗长的文本注释将是困难且实际上不可能的. 这是朴素贝叶斯分类器机器学习算法来解决. 分类器是从可用类别之一分配总体的元素值的函数. 例如,垃圾邮件过滤是朴素贝叶斯分类器算法的流行应用程序. 此处

《统计学习方法》:第三章 K 近邻算法

k -- NN k--NN 是一种基本分类和回归方法.对新实例进行分类时,通过已经训练的数据求出 k 个最近实例,通过多数表决进行分类.故 k 邻近算法具有不显式的学习过程. 三个基本要素:k 值选择,距离度量,分类决策规则. 1. k 近邻算法 原理:给定一个训练集,对于新输入的实例,在训练集中找到与其相似的 k 个实例,这 k 个实例的多数属于某一类,就将该实例归属到这一类. 输入:训练数据集 \(T = \{(x_1,y_1),(x_2,y_2),...,(x_3,y_3)\}\) 其中,

机器学习--K近邻 (KNN)算法的原理及优缺点

一.KNN算法原理 K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法. 它的基本思想是: 在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类. KNN算法的描述: (1)计算测试数据与各个训练数据之间的距离: (2)按照距离的递增关系进行排序: (3)选取距离最小的K个点: (4)确定前K个点所在类别的出现频率   (5

机器学习---K最近邻(k-Nearest Neighbour,KNN)分类算法

K最近邻(k-Nearest Neighbour,KNN)分类算法 1.K最近邻(k-Nearest Neighbour,KNN) K最近邻(k-Nearest Neighbour,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.用官方的话来说,所谓K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实

郑捷《机器学习算法原理与编程实践》学习笔记(第六章 神经网络初步)6.3 自组织特征映射神经网路(SMO)

具体原理网址:http://wenku.baidu.com/link?url=zSDn1fRKXlfafc_tbofxw1mTaY0LgtH4GWHqs5rl8w2l5I4GF35PmiO43Cnz3YeFrrkGsXgnFmqoKGGaCrylnBgx4cZC3vymiRYvC4d3DF3 自组织特征映射神经网络(Self-Organizing Feature Map.也称Kohonen映射),简称为SMO网络,主要用于解决模式识别类的问题.SMO网络属于无监督学习算法,与之前的Kmeans算