k-meanas原理自实现

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()

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
4S店客户管理小程序-毕业设计,基于微信小程序+SSM+MySql开发,源码+数据库+论文答辩+毕业论文+视频演示 社会的发展和科学技术的进步,互联网技术越来越受欢迎。手机也逐渐受到广大人民群众的喜爱,也逐渐进入了每个用户的使用。手机具有便利性,速度快,效率高,成本低等优点。 因此,构建符合自己要求的操作系统是非常有意义的。 本文从管理员、用户的功能要求出发,4S店客户管理系统中的功能模块主要是实现管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理,用户客户端:首页、车展、新闻头条、我的。门店客户端:首页、车展、新闻头条、我的经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与4S店客户管理系统实现的实际需求相结合,讨论了微信开发者技术与后台结合java语言和MySQL数据库开发4S店客户管理系统的使用。 关键字:4S店客户管理系统小程序 微信开发者 Java技术 MySQL数据库 软件的功能: 1、开发实现4S店客户管理系统的整个系统程序; 2、管理员服务端;首页、个人中心、用户管理、门店管理、车展管理、汽车品牌管理、新闻头条管理、预约试驾管理、我的收藏管理、系统管理等。 3、用户客户端:首页、车展、新闻头条、我的 4、门店客户端:首页、车展、新闻头条、我的等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流信息的查看及回复相应操作。
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本微信小程序医院挂号预约系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此微信小程序医院挂号预约系统利用当下成熟完善的SSM框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。微信小程序医院挂号预约系统有管理员,用户两个角色。管理员功能有个人中心,用户管理,医生信息管理,医院信息管理,科室信息管理,预约信息管理,预约取消管理,留言板,系统管理。微信小程序用户可以注册登录,查看医院信息,查看医生信息,查看公告资讯,在科室信息里面进行预约,也可以取消预约。微信小程序医院挂号预约系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值