机器学习(二)——K均值聚类算法(K-means)

概述:

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方法 

猜你喜欢

转载自blog.csdn.net/guoyang768/article/details/84871530