kMeans--正态分布数据分组

本文介绍了如何使用Python和numpy、matplotlib库实现kMeans算法,特别是针对正态分布数据的分组。首先讲解了numpy和matplotlib的安装步骤,接着详细描述了kMeans算法的流程,并提供了在200次迭代内终止算法的要求。最后,给出了算法实现的代码段,用于展示数据聚类和散点图的结果。
摘要由CSDN通过智能技术生成

一、准备:k-Means算法是用Python来实现的,要显示出正态分布数据及其散点图,我们首先要先安装两个安装包,一个是numpy,另一个是matploylib,这两个安装包都在Python文件夹下可以找到。


1.numpy安装

      之前我们已经下载安装好了Python并将它保存到了C盘,现在我们只需要找到Python27文件夹下的Scripts文件夹,将Scripts这个目录拷贝下来,然后“右击计算机--属性--高级系统设置--环境变量--系统变量--path--编辑”,将刚才的路径粘贴进去。


       设置好环境变量之后,需要安装另外一个东西,叫做pip,pip就在python自己的目录下的一个叫做Scripts的文件夹里,点开这个文件夹并复制路径到cmd,并输入python -m pip install -U pip,然后等待安装,安装成功就会提示successfully installed.




2.matplotlib安装

       和numpy一样,matplotlib也是用pip来安装,进入cmd窗口下,执行python -m pip install -U pip setuptools进行升级,接着键入python -m pip install matplotlib自动进行安装,系统会自动下载安装包,pip会下载其他的关联安装包,并完成最终的安装。


       最后,如果安装成功就会提示successfully installed.

到这里,我们的准备工作就完成了,接下来就是实现算法。


二、要求:我们要求用正态分布生成数据并显示出数据,用kMeans算法进行聚类,并将聚类结果表现在散点图上,要求在200次以内算法要终止。


算法流程如下:

1.创建k个点作为起始质心(这里以k=2为例);

2.当任意一个点的簇分配结果发生改变时,对数据集中的每个数据点、对每个质心,计算质心与数据点之间的距离;

3.将数据点分配到距其最近的簇中;

4.对每一个簇,计算簇中所有点的均值并将均值作为质心;

5.判断新的质心与上一个质心的骗鬼量是否为0,如不为0,求出的质心取代原来的质心;若为0,迭代终止;

6.将结果显示出来。


该过程的代码如下:

import numpy
import pylab as pl
import matplotlib.pyplot as plt
plt.figure(1)

plt.figure(2)

x1 = numpy.round(numpy.random.normal(1,1,100),2)
y1 = numpy.round(numpy.random.normal(120,5,100),2)

x2 = numpy.round(numpy.random.normal(3,0.4,100),2)
y2 = numpy.round(numpy.random.normal(120,2,100),2)


a=[]                                                                                             #存入数据
b=[]
for i in x1:
     a.append(i)
for i in x2:
     a.append(i)
for i in y1:
     b.append(i)
for i in y2:
     b.append(i)
print '随机产生的正态分布的数据为:', list(zip(a,b))                                             #输出随机产生的正态分布的数据


def cal_distance(a, b):                                                                          #计算两点的距离
    return (a[0]- b[0]) ** 2 + (a[1] - b[1]) **2

k1=[1,120]
k2=[3,120]

clu_k1 = []                                                                                      #划分两个聚类
clu_k2 = [] 
while True:
    clu_k1 = []
    clu_k2 = []
    for i in range(200):
         
        ab_distance1 = cal_distance(k1, [a[i], b[i]])
        ab_distance2 = cal_distance(k2, [a[i], b[i]])                                           #计算每个样本到聚类中心的距离
        if (ab_distance1 <= ab_distance2):
            clu_k1.append(i)
        else:
            clu_k2.append(i)                                                                    #每个样本归于更近的聚类中心

    
    k1_x = sum([a[i] for i in clu_k1]) / len(clu_k1)    
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值