二分k-均值算法步骤:
首先将所有点作为一个属,然后将该簇-分为二,之 后选择其中-个簇进续进行划分,选择哪一个簇进行划取决于对其划分是否可以最大程度降低SSE的值,上述基于SSE的别分过程不断重复,直到得到用户指定的属数目为止,
将所有点看成一个簇
当簇数目小于k时
对于每一个簇:
计算总误差
在给定的簇上面进行K-均值聚类(k=2)计算将该簇一分为二后的总误差
选择使得误差最小的那个簇进行划分操作
另一种做法选择S正最大的簇进行划分,直到簇数目达到用户指定的数目为止。
Python实现
# -*- coding: utf-8 -*-
"""
Created on Thu Aug 16 11:09:04 2018
@author: wjw
"""
from numpy import *
def loadDataSet(fileName):
dataMat=[]
fr=open(fileName)
for line in fr.readlines():
arr=line.strip().split('\t')
#map (回调函数,列表)-》循环列表中的每个值,调用回归函数得到结果,存到map -》 list
l=list(map(float,arr))#float 强制类型转换
dataMat.append(l)
return dataMat
dataMat=loadDataSet('dataset/testSet.txt')
#print(dataMat[0:5])
#距离 度量方式:
#1.欧氏距离
def disEuclid(vecA,vecB):
return sqrt(sum(power((vecA-vecB),2)))
#初始质心选取
def randCenter(dataSet,k):
n=shape(dataSet)[1]#n=..列
centers=mat(zeros((k,n)))
#print(centers)
for j in range(n): #每循环一次,产生的一个特征值
#当前第j列的最小值,与最大值,求范围
minJ=