import numpy as np
import matplotlib.pyplot as plt def build_data():
"""
准备数据
:return:准备好的数据
"""
data_list = []
# 加载数据
with open("./test.txt") as f:
# 将所有的元素读成一个列表
lines = f.readlines()
# 循环对每一行元素进行单独处理
for line in lines:
# print(line)
# 去除line 前后的空白字符
line_obj = line.strip().split('\t')
# print(line_obj)
# print(type(line_obj))
# print("*"*20)
# 把 line_obj 里面的每一个元素 转化为float,追加到一列表中
data_list.append([float(line_obj[0]), float(line_obj[1])]) # 列表嵌套列表的数据 ,每一个列表元素是原来的每一行元素
# print(data_list)
# 将列表嵌套列表转化为二维数组
data_array = np.array(data_list)
# print(data_array)
# 将二维数组 转化为矩阵
data = np.mat(data_array)
# print(data)
# print(type(data))
return data def center_init(data, k):
"""
初始化聚类中心
:param data: 所有的样本数据
:param k: 聚类的类别数目
:return: 聚类中心
"""
# 随机在 data中挑选4行 作为初始化的聚类中心
# 获取data 的列数
columns_num = data.shape[1]
# 获取data 的行数
index_num = data.shape[0]
# 先初始化一个全为0 的中心,然后,后续替换里面的值
center = np.zeros(shape=(k, columns_num))
# 每次初始化一个聚类中心,需要循环初始化k次
for i in range(k):
# 随机在80行里面选一个下标
# np.random.uniform() --->默认生成【0,1) 小数,可以更改最小值与最大值
r = int(np.random.uniform(0, index_num)) center[i, :] = data[r, :] return center def distance(v1, v2):
"""
计算点1 跟点2 的距离
:param v1: 点1
:param v2: 点2
:return: 距离
""" dist = np.sqrt(np.sum(np.power((v1 - v2), 2))) return dist def k_means_owns(data, k):
"""
自实现聚类算法
:param data: 所有的样本数据
:param k: 聚类的类别数目
:return: 聚类中心 、每一个样本属于哪一类别
""" # 获取data 的 行数
index_num = data.shape[0]
columns_num = data.shape[1]
# 1、初始化聚类中心
center = center_init(data, k)
# print(center) # 需要将这个样本属于哪一类,而且距离也要保存起来吧
new_data = np.zeros(shape=(index_num,columns_num))
# 2、计算距离
# 每一个样本 都与每一个聚类中心进行计算距离
# 设置开关
flag = True
while flag:
flag = False # 关闭开关
for i in range(index_num):
min_dist = 10000000000
min_index = -1
# i 代表每一行的样本的下标
for j in range(k):
# 每一个样本需要 与每一个聚类中心进行计算距离
# 样本点data[i,:] 聚类中心center[j,:]
dist = distance(data[i,:],center[j,:]) if dist < min_dist :
min_dist = dist
min_index = j
if new_data[i,1] != min_index:
flag = True # 打开
new_data[i,:] = min_dist,min_index
# 调整聚类中心
for p in range(k):
# p 0 1 2 3
# 找出属于同一类别
p_clustor = data[new_data[:,1] == p,:] # 计算这一类别的中心
# 先找出 这一类的簇第0 列的均值,与第1列的均值分别作为center 的行、列
center[p,:] = p_clustor[:,0].mean(),p_clustor[:,1].mean() return new_data,center def show_res(data,new_data,center):
"""
结果展示
:param data: 原始数据
:param new_data: 主要包含了聚类距离与最终类别的数据
:param center: 最终的聚类中心
:return: None
"""
# 1、创建画布
plt.figure()
# 2、绘图
# 获取原始数据的行数
index_num = data.shape[0] #
colors = ['r','g','pink','y']
# 绘制散点图
# 一个点的绘制,需要给该点进行添加颜色
for i in range(index_num):
plt.scatter(data[i,0],data[i,1],c=colors[int(new_data[i,1])]) # 绘制聚类中心
#
plt.plot(center[:,0],center[:,1],'bx',markersize=12)
# print(center[:,0])
# print(center[:,1])
# 3、展示
plt.show() def main():
"""
主函数
:return:
"""
# 1、构建数据
data = build_data() # 2、进行自实现k-means
# 确定聚类的类别数目
k = 4
new_data, center = k_means_owns(data, k) print(new_data)
print("*" * 80)
print(center) # 3、结果展示
# 进行绘制结果图形展示
show_res(data,new_data,center) if __name__ == '__main__':
main()

  

k-meanas原理自实现的更多相关文章

  1. AI小记-K近邻算法

    K近邻算法和其他机器学习模型比,有个特点:即非参数化的局部模型. 其他机器学习模型一般都是基于训练数据,得出一般性知识,这些知识的表现是一个全局性模型的结构和参数.模型你和好了后,不再依赖训练数据,直 ...

  2. 经典算法之K近邻(回归部分)

    1.算法原理 1.分类和回归 分类模型和回归模型本质一样,分类模型是将回归模型的输出离散化. 一般来说,回归问题通常是用来预测一个值,如预测房价.未来的天气情况等等,例如一个产品的实际价格为500元, ...

  3. 面试题40:最小的 k 个数

    import java.util.Arrays; /** * Created by clearbug on 2018/2/26. * * 面试题40:最小的 k 个数 * * 注意:因为前两天在陌陌面 ...

  4. poj 3680 Intervals(费用流)

    http://poj.org/problem?id=3680 巧妙的构图. 题目:给定N个区间(ai,bi)权值wi,求最大权和且每个点最多覆盖K次. 构图:将区间端点离散化,将第i个点连第i+1个点 ...

  5. R语言进行机器学习方法及实例(一)

    版权声明:本文为博主原创文章,转载请注明出处   机器学习的研究领域是发明计算机算法,把数据转变为智能行为.机器学习和数据挖掘的区别可能是机器学习侧重于执行一个已知的任务,而数据发掘是在大数据中寻找有 ...

  6. 【Network】优化问题——Label Smoothing

    滴:转载引用请注明哦[握爪]https://www.cnblogs.com/zyrb/p/9699168.html 今天来进行讨论深度学习中的一种优化方法Label smoothing Regular ...

  7. GDOI2018滚粗记

    day-50: 高中全体成员去了北京训练,我被虐成傻逼(貌似总分全校倒数第2). day-20: 回广州了,间断式略微考好55555..... day0: 早上起床好像有点晚qwq 然后简单打了个FF ...

  8. 学习笔记 ST算法

    [引子]RMQ (Range Minimum/Maximum Query)问题: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值 ...

  9. 【BZOJ3622】已经没有什么好害怕的了 容斥+DP

    [BZOJ3622]已经没有什么好害怕的了 Description Input Output Sample Input 4 2 5 35 15 45 40 20 10 30 Sample Output ...

  10. DP——最长上升子序列(LIS)

    DP——最长上升子序列(LIS) 基本定义: 一个序列中最长的单调递增的子序列,字符子序列指的是字符串中不一定连续但先后顺序一致的n个字符,即可以去掉字符串中的部分字符,但不可改变其前后顺序. LIS ...

随机推荐

  1. spring,get请求中带date日期格式参数,后台无法转换的问题

    今天遇到个很奇怪的问题.前端 的查询条件中带有日期范围日期的格式 是 yyyy-MM-dd HH:mm 结果后台报错 org.springframework.validation.BindExcept ...

  2. 前端小姐姐学PHP之(一)

    作为一个前端不懂后台那是不对的,嘻嘻,来走一波... 一.安装 **我这里用的是phpStudy和phpStrom** 1.安装phpStudy 链接:https://pan.baidu.com/s/ ...

  3. 01.python对象

    标准类型 数字 Integer 整型 Boolean 布尔型 Long integer 长整型 (python2) Floating point real number 浮点型 Complex num ...

  4. windows2008R2-AD域控组策略设置与其它相关设置

    防火墙设置 修改>计算机配置>策略>安全设置>高级安全windows防火墙>高级安全windows防火墙 修改入站规则 1.组名-文件和打印机共享(SMB-In)> ...

  5. LeetCode--047--全排列 II(java)

    给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例: 输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ] 对比46题增加了used数组,判断该数上次是 ...

  6. python中*args和**kwargs学习

    *args 和 **kwargs 经常看到,但是一脸懵逼 ,今天终于有收获了 """ python 函数的入参经常能看到这样一种情况 *args 或者是 **kwargs ...

  7. Crazy Binary String

    Crazy Binary String 最长01个数相等的子串和子序列 字串用二分做的,有hack数据 :8 00111100 好像数据太水,直接放过去了 下面为二分代码 #include<bi ...

  8. 第一周训练 | STL和基本数据结构

    A - 圆桌问题: HDU - 4841 #include<iostream> #include<vector> #include<stdio.h> #includ ...

  9. 【转】excel音标乱码

    源地址:https://zhidao.baidu.com/question/204553900.html 百度一个音标字体文件,下载后再拷贝到C:\WINDOWS\FONTS目录下面就可以了 下载地址 ...

  10. ionic学习使用笔记(二) slide 组件的使用

    开始做的时候,遇到了个要用ionic实现 有一系列的序列需要展示,但是当前页面上只能展示一小部分,剩余的在没有出现时是隐藏的,还得能滑动出现,但是又不能有滚动条. 之前使用jQuery来实现的话,其实 ...