概述:
1.聚类
“类”指的是具有相似性的集合。聚类是指将数据集划分为若干类,使得类内之间的数据最为相识,各类之间的数据相似度差别尽可能大。聚类分析就是以相似性为基础,对数据集进行聚类分析,属于无监督学习。
2.无监督学习和监督学习
k-均值聚类(k-means)与k-近邻(knn)算法之间没有任何关系。
监督学习知道从对象(数据)中学习什么,而无监督学习无需知道所要搜寻的目标,它是根据算法得到数据的共同特征。比如分类和聚类来说,分类事先就知道所要得到的类别,而聚类则不一样,只是以相似度为基础,将对象分得不同的簇。
3.k-means
k-means聚类算法是一种简单的迭代聚类算法,采用距离作为相似性指标,从而发现给定数据集的K个类,且每个类的中心是根据类中所有值的均值得到。选取欧式距离来作为相似度指标。
4.伪代码
创建K个点作为起始质心(经常是随机选择)
当任意一个点的簇分配结果发生改变时
对数据集中的每个数据点
对每个质心
计算质心与数据点之间的距离
将数据点分配到距其最近的簇
对每一个簇,计算簇中所有点的均值并将均值作为质心
import numpy as np
#计算距离
def dist(vecA,vecB):
return sqrt(sum(power((vecA-vecB),2)))
#随机生成质心点
def randCent(dataSet,k):
n = dataSet.shape[1]
center = np.mat(np.zeros(k,n))
for j in range(n):
minJ = min(dataSet[:,j])
rangeJ = float(max(dataSet[:,j])-minJ)
center[:,j] = minJ+rangeJ*np.random.rand(k,1)
return center
def kMeans(dataSet,k):
m = dataSet.shape[0] #数据集的个数
clusterAssment = np.mat(np.zeros(m,2)) #生成一个m行2列的0矩阵,第一列用于存储簇的类别,第二列用于存储距离
center = randCent(dataSet,k) #随机得到的质心点
clusterChanged = True
while clusterChanged:
clusterChanged = False
for i in range(m): #遍历每一个数据
minDist = inf #inf代表无穷大,-inf代表无穷小
minIndex = -1
for j in range(k): #遍历每一个质心
distJI = dist(dataSet[i,:],center[j,:]) #计算数据与质心的距离
if distJI<minDist:
minDist = distJI
minIndex = j
if clusterAssment[i,0] != minIndex: #判断是否收敛,用于迭代,直到所有数据点的簇分配结果不再改变
clusterChanged = True
clusterAssment[i,:] = minIndex,minDist**2 #赋值
print(center)
for cent in range(k): #更新聚类质心的值
dataCent = dataSet[np.nonzero(clusterAssment[:,0].A==cent)[0]] #得到的dataCent为属于同一质心的数据集
center[cent,:]=np.mean(dataCent,axis=0) #计算每一个类的新质心
return center,clusterAssment
sklearn中的k-means
class
sklearn.cluster.
KMeans
(n_clusters=8, init=’k-means++’, n_init=10, max_iter=300, tol=0.0001, precompute_distances=’auto’, verbose=0, random_state=None, copy_x=True, n_jobs=None, algorithm=’auto’)
1. k-means需要调的参数很少,主要是n_clusters,簇的个数
2.返回对象的属性
(1)cluster_centers_:每个簇的中心坐标
(2)labels_:每个数据点的标签
(3)inertia_:同一类别下的所有点到簇的平方距离
3.k-means对象的方法
(1) fit(X):计算聚类的簇
(2)predict(X):预测新的数据集的分类
from sklearn.cluster import KMeans
import numpy as np
x = np.array([[1, 2], [1, 4], [1, 0],
[4, 2], [4, 4], [4, 0]])
clf = KMeans(n_clusters=2,random_state=0)
clf.fit(x)
clf.labels_
>>>array([0, 0, 0, 1, 1, 1])
clf.cluster_centers_
>>>array([[ 1., 2.],
[ 4., 2.]])
clf.inertia_
>>>16.0
clf.predict([[0, 0], [4, 4]])
>>>array([0, 1])
用分类器对未知数据进行分类,需要使用的是分类器的predict方法