Python中k-means算法原理自实现代码

k-means算法原理自实现

import numpy as np # 科学计算库
import matplotlib.pyplot as plt # 数据可视化库
import pandas as pd # 数据处理库
from sklearn.cluster import KMeans # k-means算法API

“”"
k-means算法也叫k均值算法。
k-means算法以k为参数,把n个对象分成k个簇, 使簇内具有较高的相似度, 而簇间的相似度较低

“”"

def build_data():
“”"
构建数据
:return: 数据
“”"
# 加载数据
data = pd.read_table("./test.txt", sep=’\t’, header=None)
# 将data转化为矩阵
data = np.mat(data.values)
return data

def center_init(data, k):
“”"
聚类中心初始化
:param data: 数据
:param k: 聚类的类别数目
:return: center
“”"
# 确定数据的行下标
index_num = data.shape[0]
# 确定数据列数
column_num = data.shape[1]

# 初始化一个全为0的聚类中心
center = np.zeros(shape=(k, column_num))
# 定义一个计数器
i = 0
# 定义一个行数列表
r_list = []
while True:
    # 随机初始化行下标
    r = np.random.randint(low=0, high=index_num, )
    if r not in r_list:
        r_list.append(r)
        # 对聚类中心进行赋值
        center[i, :] = data[r, :]
    else:
        continue
    # 初始化中心的退出条件
    if len(r_list) == k:
        break
    i += 1
return center

def distance(v1, v2):
“”"
距离计算
: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):
“”"
自实现k-means原理
:param data: 数据
:param k: 聚类的类别数目
:return: None
“”"

# 初始化聚类中心---随机初始化
center = center_init(data, k)
print("center:\n", center)
# 获取行数
index_num = data.shape[0]
# 定义一个数组来保存该样本最近的聚类中心以及距离该聚类中心的距离
new_data = np.zeros(shape=(index_num, 2))
print("赋值数据之前:new_data\n", new_data)
flag = True
while flag:
    flag = False
    # 外层循环,数据
    for i in range(index_num):
        min_dist = 10000000
        min_index = -1
        # 内层循环,聚类中心
        for j in range(k):
            # 计算距离
            dist = distance(data[i, :], center[j, :])
            if dist < min_dist:
                min_dist = dist
                min_index = j
        # 如果当前计算的样本属于聚类中心的类别与上一次的不一致
        if new_data[i, 0] != min_index:
            flag = True
            new_data[i, :] = min_index, min_dist
    if flag:
        # 计算新的聚类中心
        # bool数组索引
        for p in range(k):
            # 返回bool
            bool_index = new_data[:, 0] == p
            # 选定簇
            p_cluster = data[bool_index, :]
            # 计算新的聚类中心
            center[p, :] = p_cluster[:, 0].mean(), p_cluster[:, 1].mean()
        # 如果新的聚类中心与上一次的聚类中心重合就结束
        # 如果这一次,所有样本所属的聚类中心与上一次所有样本所属的聚类中心的类别一致就结束
return new_data, center

def show_res_owns(data, new_data, center):
“”"
结果展示
:param data: 原始数据
:param new_data: 保存着各个样本最终的样本
:param center: 最终的聚类中心
:return: None
“”"
# 1.创建画布
plt.figure()
# 需要更改RC参数来让其支持中文
# 支持中文,支持负号:
plt.rcParams[‘font.sans-serif’] = ‘SimHei’
plt.rcParams[‘axes.unicode_minus’] = False
# 设置颜色列表
c_list = [“r”, “g”, “y”, “pink”]
marker_list = ["*", “o”, “d”, “D”]
# 2.绘图
for i in range(data.shape[0]):
# 绘制散点图
plt.scatter(data[i, 0], data[i, 1], c=c_list[int(new_data[i, 0])], marker=marker_list[int(new_data[i, 0])])
# 绘制聚类中心
plt.plot(center[:, 0], center[:, 1], “bx”, markersize=12)
# 增加名称
plt.title(“聚类结果展示”, )
# 保存图片
plt.savefig("./聚类结果展示.png")
# 3.绘制展示
plt.show()

def main():
# 1.构建数据
data = build_data()
# 2.自实现K-means算法原理
# 确定聚类的类别数目
k = 4
new_data, center = k_means_owns(data, k)
# 3.结果展示
show_res_owns(data, new_data, center)

if name == ‘main’:
main()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值