Python
K均值聚类是一种无监督的机器学习算法,能够实现自动归类的功能。
算法步骤如下:
(1)随机产生K个分类中心,一般称为质心。
(2)将所有样本划分到距离最近的质心代表的分类中。(距离可以是欧氏距离、曼哈顿距离、夹角余弦等)
(3)计算分类后的质心,可以用同一类中所有样本的平均属性来代表新的质心。
(4)重复(2)(3)两步,直到满足以下其中一个条件:
1)分类结果没有发生改变。
2)最小误差(如平方误差)达到所要求的范围。
3)迭代总数达到设置的最大值。
常见的K均值聚类算法还有2分K均值聚类算法,其步骤如下:
(1)将所有样本作为一类。
(2)按照传统K均值聚类的方法将样本分为两类。
(3)对以上两类分别再分为两类,且分别计算两种情况下误差,仅保留误差更小的分类;即第(2)步产生的两类其中一类保留,另一类进行再次分类。
(4)重复对已有类别分别进行二分类,同理保留误差最小的分类,直到达到所需要的分类数目。
具体Python代码如下:
# -*- coding: utf-8 -*-
"""
Created on Tue Nov 08 14:01:44 2016
K - means cluster
"""
import numpy as np
class KMeansClassifier():
"this
is a k-means classifier"
def __init__(self, k=3, initCent='random', max_iter=500 ):
self._k = k
self._initCent = initCent
self._max_iter = max_iter
self._clusterAssment = None
self._labels = None
self._sse = None
def _calEDist(self, arrA, arrB):
"""
功能:欧拉距离距离计算
输入:两个一维数组
"""
return np.math.sqrt(sum(np.power(arrA-arrB, 2)))
def _calMDist(self, arrA, arrB):
"""
功能:曼哈顿距离距离计算
输入:两个一维数组
"""
return sum(np.abs(arrA-arrB))
def _randCent(self, data_X, k):
"""
功能:随机选取k个质心
输出:centroids #返回一个m*n的质心矩阵
"""
n = data_X.shape[1] #获取特征的维数
centroids = np.empty((k,n)) #使用numpy生成一个k*n的矩阵,用于存储质心
for j in range(n):
minJ = min(data_X[:, j])
rangeJ
= float(max(data_X[:, j] -
minJ))
#使用flatten拉平嵌套列表(nested
list)
centroids[:, j] = (minJ
+ rangeJ * np.random.rand(k, 1)).flatten()
return centroids
def fit(self, data_X):
"""
输入:一个m*n维的矩阵
"""
if not isinstance(data_X, np.ndarray) or \
isinstance(data_X, np.matrixlib.defmatrix.matrix):
try:
data_X = np.asarray(data_X)
|