K-Means算法Python实现

from numpy import *
from random import _inst
import numpy as np
import matplotlib.pyplot as plt

def fileMat(filename):
    file = open(filename, "r")
    contain = file.readlines()
    count = len(contain)
    features = zeros((count, len(contain[0].split(‘,‘)) - 1))
    labels = []
    index = 0
    for lines in contain:
        line = lines.strip()
        listForm = line.split(",")
        features[index:] = listForm[0:len(listForm) - 1]
        labels.append(listForm[-1])
        index += 1
    return labels, features

‘‘‘初始化聚类中心,随机取3个样本点‘‘‘

def initCentroids(dataSet, K):
    # 初始化k个质心,随机获取
    #在dataSet中任取K个向量作为初始的中心向量
    return _inst.sample(dataSet, K)

‘‘‘样本点与每个聚类中心的距离‘‘‘

def ouShi(point1, point2):
    distance = np.sqrt(np.sum(np.square(point1 - point2)))
    return distance

‘‘‘计算样本中心点‘‘‘

def getMean(clusterDict):
    centerSet = list()
    for key in clusterDict.keys():
        centerSet.append(np.mean(np.array(clusterDict[key]), axis=0))  # 簇中样本的平均值
    return centerSet  # 返回的是簇中心的列表

‘‘‘聚类‘‘‘

def cluster(dataSet, centerSet):
    clusterDict = dict()
    for item in dataSet:
        flag = 0
        minDistance = float("inf")
        for i in range(len(centerSet)):
            distance = ouShi(item, centerSet[i])
            if distance < minDistance:
                minDistance = distance
                flag = i#第i类
        if flag not in clusterDict.keys():
            clusterDict[flag] = list()
        clusterDict[flag].append(item)
    return clusterDict

‘‘‘计算平方误差,是根据簇中样本点与该簇中心点的欧氏距离的平方计算的‘‘‘

def getE(clusterDic):
    sum = 0.0
    for key in clusterDic.keys():
        distance = 0.0
        centerDistance = np.mean(clusterDic[key])
        for item in clusterDic[key]:
            dis = np.square(ouShi(item, centerDistance))
            distance += dis
        sum += distance
    return sum

def showCluster(centerSet, 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(centerSet[key][0], centerSet[key][1], centroidMark[key], markersize=12)  # 画质心点
        for item in clusterDict[key]:
            plt.plot(item[0], item[1], colorMark[key])  # 画簇类下的点

    plt.show()

if __name__ == ‘__main__‘:
    dataLabels, dataSet = fileMat("TestData.txt")
    firstCenterSet = initCentroids(list(dataSet), 4)
    print(‘初始聚类中心为:‘, firstCenterSet)
    clusterDict = cluster(dataSet, firstCenterSet)
    newE = getE(clusterDict)
    oldE = -0.0001
    print("------------------------------------ 第1次迭代 ------------------------------------")
    for key in clusterDict.keys():
        buff = list()
        for i in range(len(clusterDict[key])):
            buff.append(list(clusterDict[key][i]))
        print(key, ‘ --> ‘, buff)
    newCenterSet = list()
    for i in range(len(firstCenterSet)):
        newCenterSet.append(list(firstCenterSet[i]))
    print(‘k个均值向量: ‘, newCenterSet)
    print(‘平均均方误差: ‘, newE)
    showCluster(firstCenterSet, clusterDict)
    d = 2
    while abs(newE - oldE) != 0:  # 当连续两次聚类结果小于0.0001时,迭代结束
        centerSet = getMean(clusterDict)  # 获得新的质心
        clusterDict = cluster(dataSet, centerSet)  # 新的聚类结果
        oldE = newE
        newE = getE(clusterDict)

        print(‘------------------------------------------- 第%d次迭代 -------------------------------------------‘ % d)
        for key in clusterDict.keys():
            buff = list()
            for i in range(len(clusterDict[key])):
                buff.append(list(clusterDict[key][i]))
            print(key, ‘ --> ‘, buff)
        newCenterSet = list()
        for i in range(len(firstCenterSet)):
            newCenterSet.append(list(firstCenterSet[i]))
        print(‘k个均值向量: ‘, newCenterSet)
        print(‘平均均方误差: ‘, newE)
        showCluster(centerSet, clusterDict)
        d += 1
时间: 2024-10-27 00:02:02

K-Means算法Python实现的相关文章

K均值算法-python实现

测试数据展示: #coding:utf-8__author__ = 'similarface''''实现K均值算法 算法摘要:-----------------------------输入:所有数据点A,聚类个数k输出:k个聚类的中心点 随机选取k个初始的中心点repeat: 计算每个点和中心点的距离,将点分配给最近的中心簇中 计算Ck,更新簇的中心点until 中心点稳定 -----------------------------'''import sysimport randomimport

k近邻算法python实现 -- 《机器学习实战》

1 ''' 2 Created on Nov 06, 2017 3 kNN: k Nearest Neighbors 4 5 Input: inX: vector to compare to existing dataset (1xN) 6 dataSet: size m data set of known vectors (NxM) 7 labels: data set labels (1xM vector) 8 k: number of neighbors to use for compar

K-means算法

K-means算法很简单,它属于无监督学习算法中的聚类算法中的一种方法吧,利用欧式距离进行聚合啦. 解决的问题如图所示哈:有一堆没有标签的训练样本,并且它们可以潜在地分为K类,我们怎么把它们划分呢?     那我们就用K-means算法进行划分吧. 算法很简单,这么做就可以啦: 第一步:随机初始化每种类别的中心点,u1,u2,u3,--,uk; 第二步:重复以下过程: 然后 ,就没有然后了,就这样子. 太简单, 不解释.

Fuzzy C Means 算法及其 Python 实现——写得很清楚,见原文

Fuzzy C Means 算法及其 Python 实现 转自:http://note4code.com/2015/04/14/fuzzy-c-means-%E7%AE%97%E6%B3%95%E5%8F%8A%E5%85%B6-python-%E5%AE%9E%E7%8E%B0/ 1.  算法向  算法的扩展 在  算法中,如果要将数据集合  划分为  个类,使得任意数据对象  必须属于并且仅属于一个类,同时每一个类至少包含一个数据对象,那么可以用一个  的矩阵  来表示,矩阵中的任意一个元素

用Python从零开始实现K近邻算法

K近邻算法 (或简称kNN)是易于理解和实现的算法,而且是你解决问题的强大工具. http://python.jobbole.com/87407/ 在本教程中,你将基于Python(2.7)从零开始实现kNN算法.该实现主要针对分类问题,将会用鸢尾花分类问题来演示. 这篇教程主要针对Python程序员,或者你可以快速上手Python,并且对如何从零实现kNN算法感兴趣. kNN算法图片,来自Wikipedia,保留所有权利 什么是kNN kNN算法的模型就是整个训练数据集.当需要对一个未知数据实

k近邻算法的Python实现

k近邻算法的Python实现 0. 写在前面 这篇小教程适合对Python与NumPy有一定了解的朋友阅读,如果在阅读本文的源代码时感到吃力,请及时参照相关的教程或者文档. 1. 算法原理 k近邻算法(k Nearest Neighbor)可以简称为kNN.kNN是一个简单直观的算法,也是机器学习从业者入门首选的算法.先看一个简单的应用场景. 小例子 设有下表,命名为为表1 电影名称 打斗镜头数量 接吻镜头数量 电影类型 foo1 3 104 爱情片 foo2 2 100 爱情片 foo3 1

【机器学习算法-python实现】采样算法的简单实现

1.背景 采样算法是机器学习中比较常用,也比较容易实现的(出去分层采样).常用的采样算法有以下几种(来自百度知道): 一.单纯随机抽样(simple random sampling) 将调查总体全部观察单位编号,再用抽签法或随机数字表随机抽取部分观察单位组成样本. 优点:操作简单,均数.率及相应的标准误计算简单. 缺点:总体较大时,难以一一编号. 二.系统抽样(systematic sampling) 又称机械抽样.等距抽样,即先将总体的观察单位按某一顺序号分成n个部分,再从第一部分随机抽取第k

【机器学习算法-python实现】矩阵去噪以及归一化

1.背景 项目需要,打算用python实现矩阵的去噪和归一化.用numpy这些数学库没有找到很理想的函数,所以一怒之下自己用标准库写了一个去噪和归一化的算法,效率有点低,不过还能用,大家如果有需要可以拿去. (1)去噪算法:根据概率论的知识,如果一组数据服从正态分布,我们设均值是n,方差是v,那么对于每个离散数值有百分之九十二以上的概率会在(n-3*v,n+3*v)的区间内.所以这里的去噪功能主要是实现如果超出了区间就将这个值标记为区间所能容忍最大值. (2)归一化:找到输入队列最大值max,最

K 近邻算法

声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,因为本人在学习初始时有非常多数学知识都已忘记,所以为了弄懂当中的内容查阅了非常多资料.所以里面应该会有引用其它帖子的小部分内容,假设原作者看到能够私信我,我会将您的帖子的地址付到以下. 3.假设有内容错误或不准确欢迎大家指正. 4.假设能帮到你.那真是太好了. 描写叙述 给定一个训练数据集,对新的输入实例.在训练数据集中找到与该实例最邻近的K个实例,若这K个实

【机器学习算法-python实现】K-means无监督学习实现分类

1.背景 无监督学习的定义就不多说了,不懂得可以google.因为项目需要,需要进行无监督的分类学习. K-means里面的K指的是将数据分成的份数,基本上用的就是算距离的方法. 大致的思路就是给定一个矩阵,假设K的值是2,也就是分成两个部分,那么我们首先确定两个质心.一开始是找矩阵每一列的最大值max,最小值min,算出range=max-min,然后设质心就是min+range*random.之后在逐渐递归跟进,其实要想明白还是要跟一遍代码,自己每一步都输出一下看看跟自己想象的是否一样. (