使用Python实现K均值聚类算法使用什么变成思想 10C

请问大神,使用Python实现K均值聚类算法,使用面向对象和面向过程,
这两种设计思想的区别,和优劣是什么,是结合这个具体的实现算法谈一下,

2个回答

我觉得你要弄懂这个问题首先要弄懂什么事k聚类,它的原理和方法是什么,,,网上有很多,讲的也很详细。我就不说了。。。。。然后对于面向对象好还是面向过程好,,优劣势怎么样,,我觉得你得多写写代码什么的,,就能搞懂了。至于那个好,我个人觉得肯定是面向对象好,因为结构清晰明了。而且容易编程,从顶层到底层编程,这样比较清晰。这是我作为一名数学院的学生的想法

如果你去看python的数学函数库,比如numpy pandas scipy 等等,很少有用到面向对象的,而这些库都是很知名的,具有影响力的库。成熟并且大量使用。

你要搞明白一个问题,就是使用python进行科学运算和统计优化的都是领域专家而不是职业程序员,他们需要的是简单高效的调用,而不是学院派的“面向对象”,也许专业开发者认为面向对象有利于编写那种健壮强大易于维护的软件,但是这些对于科学运算和数据处理没有什么实际用处。

如果你非要结合程序来讨论,我们就看一个这样的程序:

 import numpy
import random
import codecs
import copy
import re
import matplotlib.pyplot as plt

def calcuDistance(vec1, vec2):
    # 计算向量vec1和向量vec2之间的欧氏距离
    return numpy.sqrt(numpy.sum(numpy.square(vec1 - vec2)))

def loadDataSet(inFile):
    # 载入数据测试数据集
    # 数据由文本保存,为二维坐标
    inDate = codecs.open(inFile, 'r', 'utf-8').readlines()
    dataSet = list()
    for line in inDate:
        line = line.strip()
        strList = re.split('[ ]+', line)  # 去除多余的空格
        # print strList[0], strList[1]
        numList = list()
        for item in strList:
            num = float(item)
            numList.append(num)
            # print numList
        dataSet.append(numList)

    return dataSet      # dataSet = [[], [], [], ...]

def initCentroids(dataSet, k):
    # 初始化k个质心,随机获取
    return random.sample(dataSet, k)  # 从dataSet中随机获取k个数据项返回

def minDistance(dataSet, centroidList):
    # 对每个属于dataSet的item,计算item与centroidList中k个质心的欧式距离,找出距离最小的,
    # 并将item加入相应的簇类中

    clusterDict = dict()                 # 用dict来保存簇类结果
    for item in dataSet:
        vec1 = numpy.array(item)         # 转换成array形式
        flag = 0                         # 簇分类标记,记录与相应簇距离最近的那个簇
        minDis = float("inf")            # 初始化为最大值

        for i in range(len(centroidList)):
            vec2 = numpy.array(centroidList[i])
            distance = calcuDistance(vec1, vec2)  # 计算相应的欧式距离
            if distance < minDis:    
                minDis = distance
                flag = i                          # 循环结束时,flag保存的是与当前item距离最近的那个簇标记

        if flag not in clusterDict.keys():   # 簇标记不存在,进行初始化
            clusterDict[flag] = list()
        # print flag, item
        clusterDict[flag].append(item)       # 加入相应的类别中

    return clusterDict                       # 返回新的聚类结果

def getCentroids(clusterDict):
    # 得到k个质心
    centroidList = list()
    for key in clusterDict.keys():
        centroid = numpy.mean(numpy.array(clusterDict[key]), axis = 0)  # 计算每列的均值,即找到质心
        # print key, centroid
        centroidList.append(centroid)

    return numpy.array(centroidList).tolist()

def getVar(clusterDict, centroidList):
    # 计算簇集合间的均方误差
    # 将簇类中各个向量与质心的距离进行累加求和

    sum = 0.0
    for key in clusterDict.keys():
        vec1 = numpy.array(centroidList[key])
        distance = 0.0
        for item in clusterDict[key]:
            vec2 = numpy.array(item)
            distance += calcuDistance(vec1, vec2)
        sum += distance

    return sum

def showCluster(centroidList, clusterDict):
    # 展示聚类结果

    colorMark = ['or', 'ob', 'og', 'ok', 'oy', 'ow']      # 不同簇类的标记 'or' --> 'o'代表圆,'r'代表red,'b':blue
    centroidMark = ['dr', 'db', 'dg', 'dk', 'dy', 'dw']   # 质心标记 同上'd'代表棱形
    for key in clusterDict.keys():
        plt.plot(centroidList[key][0], centroidList[key][1], centroidMark[key], markersize = 12)  # 画质心点
        for item in clusterDict[key]:
            plt.plot(item[0], item[1], colorMark[key]) # 画簇类下的点

    plt.show()

if __name__ == '__main__':

    inFile = "D:/ML/clustering/testSet.txt"            # 数据集文件 
    dataSet = loadDataSet(inFile)                      # 载入数据集
    centroidList = initCentroids(dataSet, 4)           # 初始化质心,设置k=4
    clusterDict = minDistance(dataSet, centroidList)   # 第一次聚类迭代
    newVar = getVar(clusterDict, centroidList)         # 获得均方误差值,通过新旧均方误差来获得迭代终止条件
    oldVar = -0.0001                                   # 旧均方误差值初始化为-1
    print '***** 第1次迭代 *****'
    print 
    print '簇类'
    for key in clusterDict.keys():
        print key, ' --> ', clusterDict[key]
    print 'k个均值向量: ', centroidList
    print '平均均方误差: ', newVar
    print 
    showCluster(centroidList, clusterDict)             # 展示聚类结果

    k = 2
    while abs(newVar - oldVar) >= 0.0001:              # 当连续两次聚类结果小于0.0001时,迭代结束          
        centroidList = getCentroids(clusterDict)          # 获得新的质心
        clusterDict = minDistance(dataSet, centroidList)  # 新的聚类结果
        oldVar = newVar                                   
        newVar = getVar(clusterDict, centroidList)

        print '***** 第%d次迭代 *****' % k
        print 
        print '簇类'
        for key in clusterDict.keys():
            print key, ' --> ', clusterDict[key]
        print 'k个均值向量: ', centroidList
        print '平均均方误差: ', newVar
        print
        showCluster(centroidList, clusterDict)            # 展示聚类结果

        k += 

数据载入、运算、显示结果清清楚楚,你告诉我面向对象你打算怎么面向?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Python实现K均值聚类算法
1、加载相应的模块,生成数据集 # coding:utf-8 import numpy as np import pylab as pl import random as rd import imageio import math import random import matplotlib.pyplot as plt import numpy as np from scipy import ...
K均值聚类算法及MATLAB函数使用
K-means算法是最简单的一种聚类算法。算法的目的是使各个样本与所在类均值的误差平方和达到最小(这也是评价K-means算法最后聚类效果的评价标准)
使用Python实现KMeans聚类算法
菜鸟一枚,编程初学者,最近想使用Python3实现几个简单的机器学习分析方法,记录一下自己的学习过程。 关于KMeans算法本身就不做介绍了,下面记录一下自己遇到的问题。 一   、关于初始聚类中心的选取   初始聚类中心的选择一般有: (1)随机选取 (2)随机选取样本中一个点作为中心点,在通过这个点选取距离其较大的点作为第二个中心点,以此类推。 (3)使用层次聚类等算法更新出初始...
k均值聚类算法
k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。
K均值聚类算法
利用k均值聚类算法对词进行聚类,输入是词之间的相似度矩阵
聚类算法k均值
这是聚类算法中的K均值算法,使用matlab软件编程,不需修改,直接使用
k均值-聚类算法
  分为两步:分配样本到离类中心最近的那个类,更新移动每个类中心。 输入:   多次随机  初始化:多次随机初始化,得到不同的类中心,这样能避免得到不同的类中心。   ...
机器学习实战(10) ——K均值聚类算法(python实现)
这是学习机器学习算法实战这本书时,写的代码实战。让自己对各个算法有更直观的了解,不能一直不写啊。不管简单还是不简单都亲自一行一行的敲一遍啊。具体的源码和和数据链接:https://pan.baidu.com/s/1G2S2pb5gfBnxGNNTFgTkEA 密码:fov0这个第十章的代码和自己做的测试kMeans.py .这章代码较少,但后面的调用雅虎接口一直调不通。# -*- coding: ...
c#实现K均值聚类算法,(使用mysql数据库)
使用mysql 进行数据库连接,把分析聚类的结果再存储到 mysql数据库中,代码实现了连接数据库, 分析数据,把结果返回数据库的相关内容。有注释。
k均值聚类算法 matlab源码
可视化分类结果,只弄了2维的可视化 需要在同文件中自己新建一个生产的数据文本 看看你就懂了,完全按照k均值聚类的思想写的
聚类算法:k均值(k-means)
k-means算法接受一个未标记的数据集,然后将数据聚类成不同的组,k-means是一个迭代算法,步骤如下: 1.首先选择k个随机的点(即聚为k组),作为聚类中心(cluster centroids). 2.对于数据集中的每一个数据,计算其到每一个中心点的距离,并与距离最近的中心点关联起来,与同一个中心点关联的所有点聚成一类 3.计算每一组的平均值,将改组的中心点移动到中心值的位置 4.重
K-Means(K均值)聚类算法
K-mean ​ 初始数据集如下图所示,数据集未做任何标记labels 要求将其分为两簇,K均值算法的操作原理为: 随机挑选两个点作为聚类中心(cluster centroids),K-均值算法是一个迭代过程,分为两部分,第一为簇分类,第二为移动聚类中心。 ​ 所谓的的簇分类是将图中所有的绿色样本点根据其距离蓝色、红色中心点距离,分配到簇中。如下图: ​ 接下来将染色的点计算它们的平均...
遗传k均值聚类算法程序
读入文本数据的程序可能要自己写,其他参数在define里改就行了。
K均值聚类算法的Java实现
这是一种数据挖掘中的k均值聚类算法的简单实现,基于Java语言
java编写的K均值聚类算法
本算法实例把平面上任意数量的点根据K均值原理进行聚类。
K均值聚类算法-matlab实现
K均值聚类算法-matlab实现,里面有2个我实现的kmeans算法
k均值聚类算法,visual c++
用c++编的 十分好用,是数据挖掘的好工具
数据挖掘聚类算法--k均值算法
数据挖掘聚类算法--k均值算法,txt包含了数据点,该程序可以将这些数据聚为几类
k均值聚类算法 vc++
这是刚弄好的 不知他如何,请指教啊。很好用,也很容易实现算法。
遗传K均值聚类算法
珍贵的毕业设计,让我想起大学的美好时光,CSDN变得很Sx,我是说真的
K均值聚类算法 matlab
很好用的K均值聚类算法 简单易懂 用matlab完成,可以适用于图像分割的K均值聚类
K均值聚类算法(二维)
本算法用C#编写,可以实现将平面上的十个点分为两组.
K均值聚类算法(数据挖掘)
K均值聚类算法,包含运行程序及所需的数据源
kMeans算法(K均值聚类算法)
机器学习中有两类的大问题,一个是分类,一个是聚类。分类是根据一些给定的已知类别标号的样本,训练某种学习机器,使它能够对未知类别的样本进行分类。这属于supervised learning(监督学习)。而聚类指事先并不知道任何样本的类别标号,希望通过某种算法来把一组未知类别的样本划分成若干类别,这在机器学习中被称作 unsupervised learning (无监督学习)。在本文中,我们关注其中一
K-Means(K均值聚类算法)
K-Means(K均值聚类算法)1.前言要学习聚类算法就要知道聚类学习算法是什么,为什么要学习聚类学习聚类学习算法,有什么用途,下面就简单的做一下介绍,并且详细的说明k—means均值聚类学习算法。2.是什么问题 机器学习中有两类大问题,一类是分类,一类是聚类。聚类问题属于无监督学习范畴,分类属于监督学习范畴。也就是说在监督学习领域比如朴素贝叶斯、SVM等,一开始都会给定类别y,说明该样本的类别,比
K-Means(K均值)聚类算法的MATLAB实现
最近在学习 k-means聚类算法,网上有很多关于用MATLAB对这一算法的实现,下面对这一知识点进行了总结,希望大家可以采纳,欢迎留言。 在聚类分析中希望能有一种算法能够自动的将相同的元素分为紧密关系的子集或簇。聚类属于无监督学习中的一种方法,也是一种在许多领域中用于统计数据分析的常用技术。K-means算法是使用的最广泛的一种算法。 1.算法步骤: 1)首先选择一些类/组,并随机初始化它们各自...
K均值聚类算法加源码
提供详细源码,上机可运行。完全的代码。最简单实用的代码
k均值聚类算法(k-menans)
k均值聚类算法,k-means,实现
K均值聚类算法的实现
K均值聚类算法的C++实现代码 word形式 #include "iostream.h" #include "math.h" #include "stdlib.h" #include "iomanip.h" #include "time.h" #include "fstream.h"
k均值聚类算法源码(matlab)
k均值聚类算法源码(matlab)k均值聚类算法源码(matlab)
C++实现k均值聚类算法
C++实现k均值文本聚类算法,已经调试通过,欢迎学习使用
【opencv学习之四十三】K均值聚类算法
K均值聚类算法,在opencv中通过kmeans()函数实现;k均值通俗讲:就是从一堆样本中,随便挑出几个,比如3个吧,然后用样本中的和这挑出来的比较,比较后排序,谁和挑出的那个接近就把他划到那个类里,比如样A和挑1、挑2、挑3中,挑2最接近,则把样A划到挑2里,当然还没完事,还得再对挑完的3个类群,确定一个类群代表——“均值”,然后以这3个新的代表——“均值”再次与样本对比,直到“均值”不在变了...
k均值聚类算法MATLAB程序及注释
文档提供了一个完整的k均值聚类算法MATLAB程序,已运行无误,且有超级详细的注释
k均值聚类算法的原理与matlab实现
初始聚类中心给定。K均值聚类算法首先是聚类算法。K均值算法是一种简单的迭代型聚类算法,采用距离作为相似性指标,从而发现给定数据集中的K个类,且每个类的中心是根据类中所有值的均值得到,每个类用聚类中心来描述。它将相似的对象归到同一个簇中,聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好,之所以称之为K-均值是因为它可以发现k个不同的簇。
MKKM(多核k均值聚类算法)KKM(核k均值聚类算法)
k均值聚类的扩展,带核函数的k均值聚类以及多核k均值聚类
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数