k-means算法是无监督学习方法的经典算法之一,也是最简单的一个。
其中我们需要选择一种距离度量来表示数据点之间的距离,本文中我们使用的是欧式距离。
一、k均值聚类算法
1.支持函数
import numpy as np
def loadDataSet(fileName):
"""
函数说明:加载数据
Parameters:
fileName - 文件名
Returns:
dataMat - 数据矩阵
"""
dataMat = []
fr = open(fileName)
for line in fr.readlines():
curLine = line.strip().split('\t')
fltLine = list(map(float, curLine)) # 转化为float类型
dataMat.append(fltLine)
return np.array(dataMat)
def distEclud(vecA, vecB):
"""
函数说明:欧拉距离
parameters:
vecA,vecB:两个数据点的特征向量
returns:
欧式距离
"""
return np.sqrt(np.sum(np.power(vecA - vecB, 2)))
def randCent(dataSet, k):
"""
函数说明:
:param dataSet: 数据矩阵
:param k: 最终分类的个数
:return: centroids:一个包含k个随机质心的集合
"""
# n为特征值个数
n = np.shape(dataSet)[1]
centroids = np.mat(np.zeros((k, n)))
for j in range(n):
# minJ为特征值最小值,rangeJ为特征值取值范围
minJ = min(dataSet[:, j])
rangeJ = float(max(dataSet[:, j]) - minJ)
centroids[:, j] = np.mat(minJ + rangeJ * np.random.rand(k, 1))
return centroids
为了测试一下randCent
函数,输入以下命令:
arr = np.eye(5)
result = randCent(arr,6)
print(result)
得到以下结果:
[[ 0.05560545 0.81041864 0.79611652 0.9373905 0.08548578]
[ 0.42075168 0.86751914 0.66679966 0.57616285 0.13381111]
[ 0.46620813 0.2056531 0.35411902 0.10988056 0.51711511]
[ 0.48553254 0.38452667 0.3622934 0.85310448