k-means (python)算法

简介:
转:http://www.daniweb.com/forums/thread31449.html
什么都不说了,直接看代码吧。
注解 应该写的比较详细
# liukaiyi   
# 注 k-means ,维度类型 - 数值形式 ( 199 或 23.13 

import  sys, math, random

#  -- 类化 '数据' 
#
 在 n-维度空间
class  Point:
    
def   __init__ (self, coords, reference = None):
        self.coords 
=  coords
        self.n 
=  len(coords)
        self.reference 
=  reference
    
def   __repr__ (self):
        
return  str(self.coords)

#  -- 类化 '聚集点 / 聚类平均距离 点 ' 
#
 -- 在 n-维度空间
#
 -- k-means 核心类
#
 -- 每次 聚集各点 围绕她 进行聚集 
#
 -- 并提供方法 求-聚集后的计算中心点,同时记入 此次 中心点(聚集各点平均距离),为下一次聚集提供中心点.
class  Cluster:
    
def   __init__ (self, points):
        
if  len(points)  ==  0:  raise  Exception( " ILLEGAL: EMPTY CLUSTER " )
        self.points 
=  points
        self.n 
=  points[0].n
    
for  p  in  points:
            
if  p.n  !=  self.n:  raise  Exception( " ILLEGAL: MULTISPACE CLUSTER " )
        
#  求 聚集各点后 平均点
    self.centroid  =  self.calculateCentroid()
    
def   __repr__ (self):
        
return  str(self.points)
    
    
#  更新 中心点,并返回 原中心点 与 现中心点(聚集各点平均距离)距离  
     def  update(self, points):
        old_centroid 
=  self.centroid
        self.points 
=  points
        self.centroid 
=  self.calculateCentroid()
        
return  getDistance(old_centroid, self.centroid)
    
    
#  计算平均点 (聚集/收集各点(离本类的中心点)最近数据,后生成新的 中心点 )
     def  calculateCentroid(self):
        centroid_coords 
=  []
        
#   维度 迭代
     for  i  in  range(self.n):
            centroid_coords.append(
0.0 )
            
#  收集各点 迭代 
         for  p  in  self.points:
                centroid_coords[i] 
=  centroid_coords[i] + p.coords[i]
            centroid_coords[i] 
=  centroid_coords[i] / len(self.points)
        
return  Point(centroid_coords)

#  -- 返回根据 k-means 聚集形成的 数据集 
def  kmeans(points, k, cutoff):
    
#  Randomly sample k Points from the points list, build Clusters around them
    initial  =  random.sample(points, k)
    clusters 
=  []
    
for  p  in  initial: clusters.append(Cluster([p]))
    
#  迭代 k-means 直到 每次迭代 各收集点 别的 最多 不超过 0.5 
     while  True:
        
#   k 个收集 数组
        lists  =  []
        
for  c  in  clusters: lists.append([])
    
#  迭代 每个 数据点 ,并计算与每个中心点距离
     #  并把数据点添加入相应最短的中心点收集数组中
     #  在迭代中 smallest_distance 为每个点与各中心点最短距离 参数,请注意看
         for  p  in  points:
            smallest_distance 
=  getDistance(p, clusters[0].centroid)
            index 
=  0
            
for  i  in  range(len(clusters[ 1 :])):
                distance 
=  getDistance(p, clusters[i + 1 ].centroid)
                
if  distance  <  smallest_distance:
                    smallest_distance 
=  distance
                    index 
=  i + 1
            
#  添加到 离最短中心距离的 数组中
        lists[index].append(p)
    
        
#  聚集完,计算新 中心点
     #  并 cluster.centroid 属性记入下 新中心点(下一次 聚集的中心点 )
     #  并 计算与上一次 中心点 距离 ,如果 差值在 cutoff 0.5 以下 ,跳出迭代 (结束,返回最后一次 聚集集合)
    biggest_shift  =   0.0
        
for  i  in  range(len(clusters)):
            shift 
=  clusters[i].update(lists[i])
            biggest_shift 
=  max(biggest_shift, shift)
        
if  biggest_shift  <  cutoff:  break
    
return  clusters


#  -- 得到欧几里德距离两点之间 
def  getDistance(a, b):
    
#  Forbid measurements between Points in different spaces
     if  a.n  !=  b.n:  raise  Exception( " ILLEGAL: NON-COMPARABLE POINTS " )
    
#  Euclidean distance between a and b is sqrt(sum((a[i]-b[i])^2) for all i)
    ret  =   0.0
    
for  i  in  range(a.n):
        ret 
=  ret + pow((a.coords[i] - b.coords[i]),  2 )
    
return  math.sqrt(ret)

#  -- 在 n-维度 空间中创建 随机点
#
 -- 随机生成 测试数据
def  makeRandomPoint(n, lower, upper):
    coords 
=  []
    
for  i  in  range(n): coords.append(random.uniform(lower, upper))
    
return  Point(coords)

#  main 
def  main(args):
    
#  参数说明
     #  num_points,    n,    k,      cutoff,         lower,        upper 
     #  随机数据数量 , 维度, 聚集数, 跳出迭代最小距离 ,   维度数最大值,维度数最小值
    num_points, n, k, cutoff, lower, upper  =   10 2 3 0.5 - 200 200

    
#  在 n-维度空间里 , 创建 num_points 随机点
     #  测试数据生成 
    points  =  []
    
for  i  in  range(num_points): points.append(makeRandomPoint(n, lower, upper))

    
#  使用 k-means 算法,来 聚集数据点 (算法入口点)
    clusters  =  kmeans(points, k, cutoff)

    
print   " \nPOINTS: "
    
for  p  in  points:  print   " P: " , p
    
print   " \nCLUSTERS: "
    
for  c  in  clusters:  print   " C: " , c
if   __name__   ==   " __main__ " : main(sys.argv)
本文转自博客园刘凯毅的博客,原文链接:k-means (python)算法,如需转载请自行联系原博主。



目录
相关文章
|
19天前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
38 0
|
22天前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
46 4
|
22天前
|
机器学习/深度学习 缓存 算法
Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【10月更文挑战第4天】在Python编程中,算法的设计与优化至关重要,尤其在数据处理、科学计算及机器学习领域。本文探讨了评估算法性能的核心指标——时间复杂度和空间复杂度。通过详细解释两者的概念,并提供快速排序和字符串反转的示例代码,帮助读者深入理解这些概念。同时,文章还讨论了如何在实际应用中平衡时间和空间复杂度,以实现最优性能。
52 6
|
20天前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
36 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
1天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
6 3
|
4天前
|
机器学习/深度学习 人工智能 算法
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
车辆车型识别,使用Python作为主要编程语言,通过收集多种车辆车型图像数据集,然后基于TensorFlow搭建卷积网络算法模型,并对数据集进行训练,最后得到一个识别精度较高的模型文件。再基于Django搭建web网页端操作界面,实现用户上传一张车辆图片识别其类型。
12 0
【车辆车型识别】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+算法模型
|
8天前
|
机器学习/深度学习 算法 Java
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
机器学习、基础算法、python常见面试题必知必答系列大全:(面试问题持续更新)
|
17天前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
38 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
25天前
|
算法 安全 Go
RSA加密算法详解与Python和Go实现
RSA加密算法详解与Python和Go实现
56 1
|
25天前
|
存储 算法 安全
Python 加密算法详解与应用
Python 加密算法详解与应用
15 1