机器学习笔记之K-means聚类

简介: K-means聚类是聚类分析中比较基础的算法,属于典型的非监督学习算法。其定义为对未知标记的数据集,按照数据内部存在的数据特征将数据集划分为多个不同的类别,使类别内的数据尽可能接近,类别间的数据相似度比较大。用于衡量距离的方法主要有曼哈顿距离、欧氏距离、切比雪夫距离,其中欧氏距离较为常用。

K-means聚类是聚类分析中比较基础的算法,属于典型的非监督学习算法。

其定义为对未知标记的数据集,按照数据内部存在的数据特征将数据集划分为多个不同的类别,使类别内的数据尽可能接近,类别间的数据相似度比较大。用于衡量距离的方法主要有曼哈顿距离、欧氏距离、切比雪夫距离,其中欧氏距离较为常用。

算法原理如下:

1.创建K个点作为初始质心(通常是随机选择)
2.当任意一个点的簇分类结果发生改变时
2.1对数据的每一个点,计算每一个质心与该数据点的距离,将数据点分配到距其最近的簇
2.2对于每一个簇,计算簇中所有点的均值并将均值作为质心

image

停止条件为:所有的点类别划分都不再改变为止

K均值聚类算法原理简单易懂,聚类效果较好,但是其缺陷也较为明显:

1、对离群值比较敏感;
2、聚类个数的选择会影响最终聚类效果;
3、初始化聚类中心的选择会影响聚类效果。

image

以下是K-means聚类的伪代码:

image

算法实现:

经典的K-means均值聚类代码算法实现并不复杂,以下给出R语言实现过程:

## !/user/bin/env RStudio 1.1.423
## -*- coding: utf-8 -*-
## K-means Model

library("dplyr")
library('magrittr')
library('ggplot2')

rm(list = ls())
gc()

数据输入、标准化:

Data_Input <- function(file_path = "D:/R/File/iris.csv",p = .75){
    data = read.csv(file_path,stringsAsFactors = FALSE,check.names = FALSE)
    names(data) <- c('sepal_length','sepal_width','petal_length','petal_width','class')
    data[,-ncol(data)] <- scale(data[,-ncol(data)])
    x = data[,1:(ncol(data)-2)];y =  data$class_c
    return(
        list(
            data = data,
            train_data = x,
            train_target = y
            )
        )
   }

欧式距离计算:

DistEclud <- function(vecA, vecB){
    diff = rbind(vecA,vecB)
    euclidean = dist(diff) %>% as.numeric()
    return (euclidean)
   }

随机质心选择:

RandCentre <- function(dataSet, k){  
    n = ncol(dataSet)
    Centres = matrix(nrow = k,ncol = n)
    for(j in 1:n){
        minJ = min(dataSet[,j])
        rangeJ = max(dataSet[,j]) - minJ
        Centres[,j] = (minJ + rangeJ * runif(k)) 
    }
    return (Centres)
}

K-means聚类构建:

Kmeans_Cluster <- function(dataSet,k){
    m = nrow(dataSet)
    ClusterAssment = rep(0,times = 2*m) %>% matrix(nrow = m,ncol = 2)  
    Centres = RandCentre(dataSet,k)
    ClusterChanged = TRUE
    while(ClusterChanged){
        ClusterChanged = FALSE
        for(i in 1:m){
            minDist = Inf
            minIndex = 0
            for(j in 1:k){
                distJI = DistEclud(Centres[j,],dataSet[i,])
                if (distJI < minDist){
                    minDist = distJI
                    minIndex = j
                }
            }
            if(ClusterAssment[i,1] != minIndex){
                  ClusterChanged = TRUE
                  ClusterAssment[i,] = c(minIndex,minDist^2)
            } 
        }
        for(cent in 1:k){
            index = grep(cent,ClusterAssment[,1])
            ptsInClust = dataSet[index,]
            Centres[cent,] = apply(ptsInClust,2,mean)
        }
    print(Centres)
    }
    return (
        list(
            Centres = Centres,
            ClusterAssment = ClusterAssment
            )
        )
}

聚类模型执行与结果输出:

Show_Result <- function(k){
    data_source = Data_Input()
    dataSet = data_source$train_data
    y = data_source$train_target
    result = Kmeans_Cluster(dataSet,k)
    centroids = result$Centres
    clusterAssment = result$ClusterAssment
    ggplot() +
    geom_point(data = NULL,aes(x = dataSet[,1],y = dataSet[,2],fill = factor(clusterAssment[,1])),shape = 21,colour = 'white',size = 4) +
    geom_point(data = NULL,aes(x= centroids[,1],y = centroids[,2]),fill = 'Red',size = 10,shape = 23) +
    scale_fill_brewer(palette = 'Set1') +
    guides(fill=guide_legend(title=NULL)) +
    theme_void()
   }

image

image

以下是基于Python的K-means算法源码实现:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import numpy  as np
import pandas as pd
from sklearn import preprocessing
from sklearn.metrics import confusion_matrix
from matplotlib import pyplot as plt

数据输入与标准化:

def DataInput():
    data = pd.read_csv("D:/Python/File/iris.csv")
    data.columns = ['sepal_length','sepal_width','petal_length','petal_width','class']
    print(data.shape,'\n',data.head())
    data.iloc[:,0:-1] = preprocessing.scale(data.iloc[:,0:-1])
    data['class_c'] =  pd.factorize(data['class'])[0]
    return  data.iloc[:,0:-2],data.iloc[:,-1]

欧式距离计算:

def DistEclud(vecA, vecB)
    return np.sqrt(np.sum(np.power(vecA - vecB, 2)))
#随机质心选择函数:

def RandCentre(dataSet, k):     
    n = dataSet.shape[1]
    Centres = np.mat(np.zeros((k,n)))
    for j in range(n):
        minJ = np.min(dataSet.iloc[:,j])
        rangeJ = np.float(np.max(dataSet.iloc[:,j]) - minJ)
        Centres[:,j] = np.mat(minJ + rangeJ * np.random.rand(k,1)) 
    return Centres

聚类算法源码:

def kMeans(dataSet,k): 
    m = dataSet.shape[0]
    ClusterAssment = np.mat(np.zeros((m,2)))
    Centres = RandCentre(dataSet,k)
    ClusterChanged = True
    while ClusterChanged:
        ClusterChanged = False
            for i in range(m): 
            minDist = np.inf;minIndex = -1
            for j in range(k):
                distJI = DistEclud(Centres[j,:],dataSet.iloc[i,:].values)
                if distJI < minDist:
                    minDist = distJI
                    minIndex = j
            if ClusterAssment[i,0] != minIndex:
                ClusterChanged = True
                ClusterAssment[i,:] = minIndex,minDist**2
        print(Centres)
        for cent in range(k):
            index = np.nonzero(ClusterAssment[:,0].A== cent)[0].tolist()
            ptsInClust = dataSet.iloc[index,:]
            Centres[cent,:] = np.mean(ptsInClust,axis=0).values
            return Centres,ClusterAssment

聚类算法执行与结果输出:

def show(k): 
    dataSet,y = DataInput()
    centroids, clusterAssment = kMeans(dataSet,k)
    m,n = dataSet.shape  
    mark  = ['or', 'ob', 'og']
    for i in range(m):  
        markIndex = np.int(clusterAssment[i,0])  
        plt.plot(dataSet.iloc[i,0], dataSet.iloc[i,1],mark[markIndex])  
    for i in range(k):  
        plt.plot(centroids[i,0], centroids[i,1], mark[i], markersize = 12)  
    plt.show()
        return centroids,clusterAssment

show(k=3)

image

image

以上是原生k-means算法的简单实现,其中最为核心的聚类算法模块几乎高度还原了伪代码的核心思想,但是鉴于聚类分析中异常值、K值选择以及初始聚类中心的选择都会影响最终的聚类效果,所以在使用K-means聚类算法时要选择合适的K值以及初始聚类质心,并合理处理数据中的异常值问题。

原文发布时间为:2018-06-30
本文作者:杜雨
本文来自云栖社区合作伙伴“ 数据小魔方”,了解相关信息可以关注“ 数据小魔方”。

相关文章
|
22天前
|
机器学习/深度学习 计算机视觉 Python
模型预测笔记(三):通过交叉验证网格搜索机器学习的最优参数
本文介绍了网格搜索(Grid Search)在机器学习中用于优化模型超参数的方法,包括定义超参数范围、创建参数网格、选择评估指标、构建模型和交叉验证策略、执行网格搜索、选择最佳超参数组合,并使用这些参数重新训练模型。文中还讨论了GridSearchCV的参数和不同机器学习问题适用的评分指标。最后提供了使用决策树分类器进行网格搜索的Python代码示例。
35 1
|
18天前
|
机器学习/深度学习 算法 数据可视化
机器学习的核心功能:分类、回归、聚类与降维
机器学习领域的基本功能类型通常按照学习模式、预测目标和算法适用性来分类。这些类型包括监督学习、无监督学习、半监督学习和强化学习。
20 0
|
3月前
|
机器学习/深度学习 数据采集 算法
【机器学习】K-Means聚类的执行过程?优缺点?有哪些改进的模型?
K-Means聚类的执行过程、优缺点,以及改进模型,包括K-Means++和ISODATA算法,旨在解决传统K-Means算法在确定初始K值、收敛到局部最优和对噪声敏感等问题上的局限性。
60 2
|
3月前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】聚类算法中的距离度量有哪些及公式表示?
聚类算法中常用的距离度量方法及其数学表达式,包括欧式距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、余弦相似度等多种距离和相似度计算方式。
214 1
|
3月前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】Python详细实现基于欧式Euclidean、切比雪夫Chebyshew、曼哈顿Manhattan距离的Kmeans聚类
文章详细实现了基于不同距离度量(欧氏、切比雪夫、曼哈顿)的Kmeans聚类算法,并提供了Python代码,展示了使用曼哈顿距离计算距离矩阵并输出k=3时的聚类结果和轮廓系数评价指标。
62 1
|
3月前
|
机器学习/深度学习 数据可视化 搜索推荐
【python机器学习】python电商数据K-Means聚类分析可视化(源码+数据集+报告)【独一无二】
【python机器学习】python电商数据K-Means聚类分析可视化(源码+数据集+报告)【独一无二】
123 0
|
5月前
|
机器学习/深度学习 人工智能 自然语言处理
机器学习算法入门:从K-means到神经网络
【6月更文挑战第26天】机器学习入门:从K-means到神经网络。文章涵盖了K-means聚类、逻辑回归、决策树和神经网络的基础原理及应用场景。K-means用于数据分组,逻辑回归适用于二分类,决策树通过特征划分做决策,神经网络则在复杂任务如图像和语言处理中大显身手。是初学者的算法导览。
|
5月前
|
机器学习/深度学习 算法 搜索推荐
机器学习中的聚类
**文章摘要:** 本文介绍了聚类算法的基本概念、应用、实现流程和评估方法。聚类是一种无监督学习技术,用于将数据分为相似的组,如K-means、层次聚类、DBSCAN和谱聚类。K-means算法通过迭代优化质心,将数据点分配到最近的簇,直至质心不再变化。模型评估包括误差平方和(SSE)、肘部方法(确定最佳簇数)和轮廓系数法(Silhouette Coefficient),以量化聚类的紧密度和分离度。应用场景涵盖用户画像、广告推荐和图像分割等。在Python的sklearn库中,可以使用KMeans API进行聚类操作。
|
5月前
|
机器学习/深度学习 分布式计算 算法
在机器学习项目中,选择算法涉及问题类型识别(如回归、分类、聚类、强化学习)
【6月更文挑战第28天】在机器学习项目中,选择算法涉及问题类型识别(如回归、分类、聚类、强化学习)、数据规模与特性(大数据可能适合分布式算法或深度学习)、性能需求(准确性、速度、可解释性)、资源限制(计算与内存)、领域知识应用以及实验验证(交叉验证、模型比较)。迭代过程包括数据探索、模型构建、评估和优化,结合业务需求进行决策。
54 0
|
5月前
|
机器学习/深度学习 算法 数据可视化
技术心得记录:机器学习笔记之聚类算法层次聚类HierarchicalClustering
技术心得记录:机器学习笔记之聚类算法层次聚类HierarchicalClustering
44 0

热门文章

最新文章