KMeans聚类
在聚类算法中,最出名的应该就是k均值聚类(KMeans)了,几乎所有的数据挖掘/机器学习书籍都会介绍它,有些初学者还会将其与KNN等混淆。k均值是一种聚类算法,属于无监督学习的一种,而KNN是有监督学习/分类学习的一种。
聚类:顾名思义,就是讲某些相似的事物聚在一起,形成一个类。这里就涉及到几个概念
1.如何表示一个事物?通常我们会准备好一个数据集,里面是我们的数据,每一行代表的都是一个数据,每一列是一个数据的一种特征。比如经典的分类数据集 iris(鸢尾花数据),每一行代表的是每一朵花,每一朵花都有花萼长度,花萼宽度,花瓣长度,花瓣宽度 4个特征,即有4列特征。
2.如何度量事物间的距离?我们拿到每一个数据的特征值之后,需要根据实际情况来进行两种数据之间的计算,常用的方法是欧氏距离、马氏距离、余弦距离等。
3.按照什么样的过程进行聚类?这里就涉及到具体的算法了,目前聚类大致有几个比较流行的方法:基于划分、基于层次、基于密度、基于网络。这里的K均值就属于基于划分的方法,后续会继续写其余几种方法的代表算法。
4.如何能判断聚类过程结束呢?当每一种类别中的数据趋于稳定,即为完成聚类
KMeans过程
上图是截取别人blog中的图片(参考文献1),这里讲的其实很清楚了。
上代码:
#!/usr/bin/python
# -*- coding:utf-8 -*-
"""
Author LiHao
Time 2018/11/26 9:21
"""
import os
import sys
import numpy as np
import scipy as sp
from sklearn.datasets import load_iris
# 欧式距离函数
from ml_learn.algorithm.distance import eculide
import matplotlib.pyplot as plt
def load_data():
"""
导入iris标准数据集
:return:
"""
iris = load_iris()
data = iris.data
target = iris.target
target_names = iris.target_names
return data,target,target_names
class Group(object):
"""
定义类簇的类 -- 后续也会使用
"""
def __init__(self):
self._name = ""
self._no = None
self._members = []
self._center = None
@property
def no(self):
return self._no
@property
def name(self):
return self._name
@name.setter
def name(self,no):
self._no = no
self._name = "G"+str(self._no