专栏首页深度学习之tensorflow实战篇python 聚类分析实战案例:K-means算法(原理源码)

python 聚类分析实战案例:K-means算法(原理源码)

K-means算法:

关于步骤:参考之前的博客 关于代码与数据:暂时整理代码如下:后期会附上github地址,上传原始数据与代码完整版,

各种聚类算法的对比:参考连接

Kmeans算法的缺陷

1.聚类中心的个数K 需要事先给定,但在实际中这个 K 值的选定是非常难以估计的,很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适 2.Kmeans需要人为地确定初始聚类中心,不同的初始聚类中心可能导致完全不同的聚类结果。

#!usr/bin/env python
#_*_ coding:utf-8 _*_
import random
import math
'''
kMeans:2列数据对比,带有head
'''
#1.load data
def importData():
   f = lambda name,b,d: [name, float(b), float(d)]

   with open('birth-death-rates.csv', 'r') as inputFile:
          return [f(*line.strip().split('\t')) for line in inputFile]

写入文件类型

#2. calculate Distance

def euclideanDistance(x,y):
    return math.sqrt(sum([(a-b)**2 for (a,b) in zip(x,y)]))

#L=points,
def partition(points, k, means, d=euclideanDistance):
   # print('means={}'.format(means))
   thePartition = [[] for _ in means]  # list of k empty lists

   indices = range(k)
   # print('indices={}'.format(indices))

   for x in points:

      #index为indices索引,调用d函数,计算每个值与聚类中心的距离,将其分类
      closestIndex = min(indices, key=lambda index: d(x, means[index]))#实现X与每个Y直接的求解:key=lambda index: d(x, means[index])

      thePartition[closestIndex].append(x)

   return thePartition
#3.寻找收敛点
def mean(points):
   ''' assume the entries of the list of points are tuples;
       e.g. (3,4) or (6,3,1). '''

   n = len(points)
   # print(tuple(float(sum(x)) / n for x in zip(*points)))   #*points将【[1,2],[2,3]】分割出来【1,2】
   return tuple(float(sum(x)) / n for x in zip(*points))  #将最开始的[[4, 1], [1, 5]] 经过处理变成[(4, 1),(1, 5)]


def kMeans(points, k, initialMeans, d=euclideanDistance):
   oldPartition = []
   newPartition = partition(points, k, initialMeans, d)

   while oldPartition != newPartition:
      oldPartition = newPartition
      newMeans = [mean(S) for S in oldPartition]
      newPartition = partition(points, k, newMeans, d)

   return newPartition

#0.函数调用初始中心点

if __name__ == "__main__":
   L = [x[1:] for x in importData()] # remove names
   # print (str(L).replace('[','{').replace(']', '}'))
   import matplotlib.pyplot as plt
   '''
   plt.scatter(*zip(*L))
   plt.show()
   '''
   import random
   k = 3
   partition = kMeans(L, k, random.sample(L, k))  #L是集合,K分类个数,random.sample(L, k)中心点
   plt.scatter(*zip(*partition[0]), c='b')#[[],[],[]]
   plt.scatter(*zip(*partition[1]), c='r')
   plt.scatter(*zip(*partition[2]), c='g')
   plt.show()

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python 聚类分析实战案例:K-means算法(原理源码)

    K-means算法: ? 关于步骤:参考之前的博客 关于代码与数据:暂时整理代码如下:后期会附上github地址,上传原始数据与代码完整版, ?...

    学到老
  • R语言之主成分分析-PCA 贡献率

    综述:主成分分析 因子分析典型相关分析,三种方法的共同点主要是用来对数据降维处理的 从数据中提取某些公共部分,然后对这些公共部分进行分析和处理。

    学到老
  • R语言之主成分分析-PCA 贡献率

    1、关键点 综述:主成分分析 因子分析典型相关分析,三种方法的共同点主要是用来对数据降维处理的 从数据中提取某些公共部分,然后对这些公共部分进行分析和处理。 ...

    学到老
  • python 聚类分析实战案例:K-means算法(原理源码)

    K-means算法: ? 关于步骤:参考之前的博客 关于代码与数据:暂时整理代码如下:后期会附上github地址,上传原始数据与代码完整版, ?...

    学到老
  • 回归算法实例三:基于梯度下降法实现线性回归算法

    魏晓蕾
  • 「MoreThanJava」Day 3:构造程序逻辑的方法

    迄今为止,我们写的 Java 代码都是一条一条语句顺序执行的,这种代码结构通常称之为 顺序结构。

    我没有三颗心脏
  • 《绝地求生》开放API接口:可获取玩家信息、比赛结果等

    近日、《绝地求生大逃杀(PlayerUnknown’s Battlegrounds)》官方推特宣布将开放API开源接口。 ? 将允许玩家查看道具代码,动作代码等...

    BestSDK
  • 课时41:魔法方法:构造和析构

    之前我们讨论过 _ _init_ _()方法,说它相当于其它面向对象编程语言的构造方法,也就是类在实例化成对象的时候首先会调用的一个方法。

    py3study
  • JAVA将长方形图片剪裁成正方形。

    JAVA如何将长方形图片剪裁成正方形呢?其实很简单,用到了BufferedImage的getSubimage()方法。不多说,直接上代码:

    一诺千金
  • 在Egret项目中使用protobuf

    ProtocolBuffer是用于结构化数据串行化的灵活、高效、自动的方法,有如XML,不过它更小、更快、也更简单。你可以定义自己的数据结构,然后使用代码生成器...

    用户1428723

扫码关注云+社区

领取腾讯云代金券