【机器学习】k-means聚类原理及python实现
1、k-means原理
2、改进的kmenas-------二分k-means
3、实例----对地图上的点进行聚类
本节完整代码可戳:https://github.com/LisaPig/machineLearning/tree/master/k_means
聚类是一种无监督的学习,它将相似的对象归到同一个簇中。它有点像全自动分类。聚类方法几乎可以应用于所有对象,簇内的对象越相似,聚类的效果越好。本章要学习一种称为K-均值( K-means)聚类的算法。之所以称之为K-均值是因为它可以发现k个不同的簇,且每个簇的中心采用簇中所含值的均值计算而成。下面会逐步介绍该算法的更多细节。
一、k-means原理
K-均值是发现给定数据集的k个簇的算法。簇个数k是用户给定的,每一个簇通过其质心( 即簇中所有点的中心)来描述。
1. K-均值算法的工作流程?
首先,随机确定k个初始点作为质心。然后将数据集中的每个点分配到一个簇中,具体来讲,为每个点找距其最近的质心,并将其分配给该质心所对应的簇。这一步完成之后,每个簇的质心更新为该簇所有点的平均值。
上述过程的伪代码表示如下:
创建k个点作为起始质心(经常是随机选择)
当任意一个点的簇分配结果发生改变时
对数据集中的每个数据点
对每个质心
计算质心与数据点之间的距离
将数据点分配到距其最近的簇
对每一个簇,计算簇中所有点的均值并将均值作为质心
代码实现:
2、K-均值聚类的优缺点:
优点:容易实现。
缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢。
适用数据类型:数值型数据。
3、聚类和分类的区别?
聚类与分类的最大不同在于,分类的目标事先已知,而聚类则不一样。因为其产生的结果与分类相同,而只是类别没有预先定义,聚类有时也被称为无监督分类( unsupervisedclassification)。
4.最基本的k-means函数实现聚类:
# -*- coding:utf-8 -*-
"""
@author:Lisa
@file:k_means.py
@time:2018/7/14 0014下午 8:27
"""
from numpy import *
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
"""
函数:读取数据集文件
输出:读取到的数据集(列表形式)
"""
def loadDataSet(filename):
dataMat=[]
fr=open(filename)
for line in fr.readlines():
curLine=line.strip().split('\t')
floatLine=list(map(float,curLine) ) #将每一行的数据映射成float型
dataMat.append(floatLine)
return dataMat
"""
函数:计算欧式两个向量之间的距离
输入:两个向量vecA、vecB
"""
def distEclud(vecA,vecB):
return np.sqrt(np.sum(np.power(vecA-vecB , 2)))
"""
函数:k个质心随机初始化
返回值:随机初始化的k个质心数据点
说明:此函数为k-means函数初始化k个质心
注意:质心的每一维度的取