机器学习之聚类算法Kmeans及其应用,调用sklearn中聚类算法以及手动实现Kmeans算法。

简介: 机器学习之聚类算法Kmeans及其应用,调用sklearn中聚类算法以及手动实现Kmeans算法。

实现Kmeans算法实现聚类

要求:
1、根据算法流程,手动实现Kmeans算法;
2、调用sklearn中聚类算法,对给定数据集进行聚类分析;
3、对比上述2中Kmeans算法的聚类效果。

读取文件

def loadFile(path):
    dataList = []
    #打开文件:以二进制读模式、utf-8格式的编码方式                                                                                                打开
    fr = open(path,"r",encoding='UTF-8')
    record = fr.read()
    fr.close
    #按照行转换为一维表即包含各行作为元素的列表,分隔符有'\r', '\r\n', \n'
    recordList = record.splitlines()
    #逐行遍历:行内字段按'\t'分隔符分隔,转换为列表
    for line in recordList:
         if line.strip():
             dataList .append(list(map(float, line.split('\t'))))
    #返回转换后的矩阵
    recordmat = np.mat(dataList )
    return recordmat

手动实现Kmeans算法

def kMeans(dataset, k):
    m = np.shape(dataset)[0]
    ClustDist = np.mat(np.zeros((m, 2)))
    cents = randCents(dataset, k)
    clusterChanged = True
    # 循环迭代,得到最近的聚类中心
    while clusterChanged:
        clusterChanged = False
        for i in range(m):
            DistList = [distEclud(dataset[i, :], cents[jk,:]) for jk in range(k)]
            minDist = min(DistList)
            minIndex = DistList.index(minDist)

            if ClustDist[i, 0] != minIndex:
                clusterChanged = True
            ClustDist[i, :] = minIndex, minDist

        # 更新聚类
        for cent in range(k):
            ptsInClust = dataset[np.nonzero(ClustDist[:, 0].A == cent)[0]]
            # 更新聚类中心cents,axis=0按列求均值
            cents[cent, :] = np.mean(ptsInClust, axis=0)
    # 返回聚类中心和聚类分配矩阵
    return cents, ClustDist

处理数据

path_file = "TESTDATA.TXT"
recordMat = loadFile(path_file)
k = 4


cents, distMat = kMeans(recordMat, k)

绘制数据散点图

plt.subplot(311)
plt.grid(True)# 生成网格
for indx in range(len(distMat)):
    if distMat[indx, 0] == 0:
        plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='red', marker='o')
    if distMat[indx, 0] == 1:
        plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='blue', marker='o')
    if distMat[indx, 0] == 2:
        plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='cyan', marker='o')
    if distMat[indx, 0] == 3:
        plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='green', marker='o')

    #if distMat[indx, 0] == 4:
        #plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='black', marker='o')

绘制聚类中心

x = [cents[i,0] for i in range(k)]
y = [cents[i,1] for i in range(k)]
plt.scatter(x, y, s = 80, c='yellow', marker='o')
plt.title('Kmeans')

调用sklearn中聚类算法

from sklearn.cluster import KMeans
X = np.array(recordMat) # 生成初始聚类数据
#kmeans_model = KMeans(n_clusters=k, init='k-means++')  # 聚类模型
kmeans_model = KMeans(n_clusters=k, init='random')  # 聚类模型
kmeans_model.fit(X)  # 训练聚类模型

绘制k-Means聚类结果

# plt.figure()# 创建窗口
plt.subplot(312)
plt.axis([np.min(X[:,0])-1, np.max(X[:,0]+1), np.min(X[:,1])-1, np.max(X[:,1])+1])# 坐标轴
plt.grid(True)# 生成网格

colors = ['r', 'g', 'b','c'] # 聚类颜色
markers = ['o', 's', 'D', '+'] # 聚类标志
for i, l in enumerate(kmeans_model.labels_):
    plt.plot(X[i][0], X[i][1], color=colors[l],marker=markers[l],ls='None')
    plt.title('K = %s,random' %(k))

对比效果:

在这里插入图片描述

整合代码:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

def loadFile(path):
    dataList = []
    #打开文件:以二进制读模式、utf-8格式的编码方式                                                                                                打开
    fr = open(path,"r",encoding='UTF-8')
    record = fr.read()
    fr.close
    #按照行转换为一维表即包含各行作为元素的列表,分隔符有'\r', '\r\n', \n'
    recordList = record.splitlines()
    #逐行遍历:行内字段按'\t'分隔符分隔,转换为列表
    for line in recordList:
         if line.strip():
             dataList .append(list(map(float, line.split('\t'))))
    #返回转换后的矩阵
    recordmat = np.mat(dataList )
    return recordmat

def distEclud(vecA, vecB):
    return np.linalg.norm(vecA-vecB, ord=2)

def randCents(dataSet, k):
    n = np.shape(dataSet)[1]
    cents = np.mat(np.zeros((k,n)))
    for j in range(n):
        #质心必须在数据集范围内,也就是在min到max之间
        minCol = min(dataSet[:,j])
        maxCol = max(dataSet[:,j])
        #利用随机函数生成0到1.0之间的随机数
        cents [:,j] = np.mat(minCol + float(maxCol - minCol) * np.random.rand(k,1))
    return cents

def kMeans(dataset, k):
    m = np.shape(dataset)[0]
    ClustDist = np.mat(np.zeros((m, 2)))
    cents = randCents(dataset, k)
    clusterChanged = True
    # 循环迭代,得到最近的聚类中心
    while clusterChanged:
        clusterChanged = False
        for i in range(m):
            DistList = [distEclud(dataset[i, :], cents[jk,:]) for jk in range(k)]
            minDist = min(DistList)
            minIndex = DistList.index(minDist)

            if ClustDist[i, 0] != minIndex:
                clusterChanged = True
            ClustDist[i, :] = minIndex, minDist

        # 更新聚类
        for cent in range(k):
            ptsInClust = dataset[np.nonzero(ClustDist[:, 0].A == cent)[0]]
            # 更新聚类中心cents,axis=0按列求均值
            cents[cent, :] = np.mean(ptsInClust, axis=0)
    # 返回聚类中心和聚类分配矩阵
    return cents, ClustDist

path_file = "TESTDATA.TXT"
recordMat = loadFile(path_file)
k = 4


cents, distMat = kMeans(recordMat, k)
# 绘制数据散点图
plt.subplot(311)
plt.grid(True)# 生成网格
for indx in range(len(distMat)):
    if distMat[indx, 0] == 0:
        plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='red', marker='o')
    if distMat[indx, 0] == 1:
        plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='blue', marker='o')
    if distMat[indx, 0] == 2:
        plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='cyan', marker='o')
    if distMat[indx, 0] == 3:
        plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='green', marker='o')

    #if distMat[indx, 0] == 4:
        #plt.scatter(recordMat[indx, 0], recordMat[indx, 1], c='black', marker='o')

# 绘制聚类中心
x = [cents[i,0] for i in range(k)]
y = [cents[i,1] for i in range(k)]
plt.scatter(x, y, s = 80, c='yellow', marker='o')
plt.title('Kmeans')





X = np.array(recordMat) # 生成初始聚类数据
# plt.figure()# 创建窗口
plt.subplot(312)
plt.axis([np.min(X[:,0])-1, np.max(X[:,0]+1), np.min(X[:,1])-1, np.max(X[:,1])+1])# 坐标轴
plt.grid(True)# 生成网格

colors = ['r', 'g', 'b','c'] # 聚类颜色
markers = ['o', 's', 'D', '+'] # 聚类标志
#kmeans_model = KMeans(n_clusters=k, init='k-means++')  # 聚类模型
kmeans_model = KMeans(n_clusters=k, init='random')  # 聚类模型
kmeans_model.fit(X)  # 训练聚类模型
# 绘制k-Means聚类结果

for i, l in enumerate(kmeans_model.labels_):
    plt.plot(X[i][0], X[i][1], color=colors[l],marker=markers[l],ls='None')
    plt.title('K = %s,random' %(k))



X = np.array(recordMat) # 生成初始聚类数据
# plt.figure()# 创建窗口
plt.subplot(313)
plt.axis([np.min(X[:,0])-1, np.max(X[:,0]+1), np.min(X[:,1])-1, np.max(X[:,1])+1])# 坐标轴
plt.grid(True)# 生成网格

colors = ['r', 'g', 'b','c'] # 聚类颜色
markers = ['o', 's', 'D', '+'] # 聚类标志
kmeans_model = KMeans(n_clusters=k, init='k-means++')  # 聚类模型
# kmeans_model = KMeans(n_clusters=k, init='random')  # 聚类模型
kmeans_model.fit(X)  # 训练聚类模型
# 绘制k-Means聚类结果

for i, l in enumerate(kmeans_model.labels_):
    plt.plot(X[i][0], X[i][1], color=colors[l],marker=markers[l],ls='None')
    plt.title('K = %s,k-means++' %(k))

plt.show()
目录
相关文章
|
8天前
|
机器学习/深度学习 数据采集 人工智能
MATLAB在机器学习模型训练与性能优化中的应用探讨
本文介绍了如何使用MATLAB进行机器学习模型的训练与优化。MATLAB作为强大的科学计算工具,提供了丰富的函数库和工具箱,简化了数据预处理、模型选择、训练及评估的过程。文章详细讲解了从数据准备到模型优化的各个步骤,并通过代码实例展示了SVM等模型的应用。此外,还探讨了超参数调优、特征选择、模型集成等优化方法,以及深度学习与传统机器学习的结合。最后,介绍了模型部署和并行计算技巧,帮助用户高效构建和优化机器学习模型。
26 1
MATLAB在机器学习模型训练与性能优化中的应用探讨
|
6天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于机器学习的人脸识别算法matlab仿真,对比GRNN,PNN,DNN以及BP四种网络
本项目展示了人脸识别算法的运行效果(无水印),基于MATLAB2022A开发。核心程序包含详细中文注释及操作视频。理论部分介绍了广义回归神经网络(GRNN)、概率神经网络(PNN)、深度神经网络(DNN)和反向传播(BP)神经网络在人脸识别中的应用,涵盖各算法的结构特点与性能比较。
|
15天前
|
机器学习/深度学习 数据采集 运维
机器学习在网络流量预测中的应用:运维人员的智慧水晶球?
机器学习在网络流量预测中的应用:运维人员的智慧水晶球?
58 19
|
20天前
|
机器学习/深度学习 分布式计算 大数据
阿里云 EMR Serverless Spark 在微财机器学习场景下的应用
面对机器学习场景下的训练瓶颈,微财选择基于阿里云 EMR Serverless Spark 建立数据平台。通过 EMR Serverless Spark,微财突破了单机训练使用的数据规模瓶颈,大幅提升了训练效率,解决了存算分离架构下 Shuffle 稳定性和性能困扰,为智能风控等业务提供了强有力的技术支撑。
141 15
|
11天前
|
机器学习/深度学习 算法 数据挖掘
探索机器学习在农业中的应用:从作物预测到精准农业
探索机器学习在农业中的应用:从作物预测到精准农业
|
14天前
|
机器学习/深度学习 人工智能 自然语言处理
解锁机器学习的新维度:元学习的算法与应用探秘
元学习作为一个重要的研究领域,正逐渐在多个应用领域展现其潜力。通过理解和应用元学习的基本算法,研究者可以更好地解决在样本不足或任务快速变化的情况下的学习问题。随着研究的深入,元学习有望在人工智能的未来发展中发挥更大的作用。
|
7天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
本研究基于MATLAB 2022a,使用GRU网络对QAM调制信号进行检测。QAM是一种高效调制技术,广泛应用于现代通信系统。传统方法在复杂环境下性能下降,而GRU通过门控机制有效提取时间序列特征,实现16QAM、32QAM、64QAM、128QAM的准确检测。仿真结果显示,GRU在低SNR下表现优异,且训练速度快,参数少。核心程序包括模型预测、误检率和漏检率计算,并绘制准确率图。
80 65
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
|
12天前
|
算法
基于遗传优化算法的风力机位置布局matlab仿真
本项目基于遗传优化算法(GA)进行风力机位置布局的MATLAB仿真,旨在最大化风场发电效率。使用MATLAB2022A版本运行,核心代码通过迭代选择、交叉、变异等操作优化风力机布局。输出包括优化收敛曲线和最佳布局图。遗传算法模拟生物进化机制,通过初始化、选择、交叉、变异和精英保留等步骤,在复杂约束条件下找到最优布局方案,提升风场整体能源产出效率。
|
12天前
|
算法 安全 机器人
基于包围盒的机械臂防碰撞算法matlab仿真
基于包围盒的机械臂防碰撞算法通过构建包围盒来近似表示机械臂及其环境中各实体的空间占用,检测包围盒是否相交以预判并规避潜在碰撞风险。该算法适用于复杂结构对象,通过细分目标对象并逐级检测,确保操作安全。系统采用MATLAB2022a开发,仿真结果显示其有效性。此技术广泛应用于机器人运动规划与控制领域,确保机器人在复杂环境中的安全作业。
|
12天前
|
机器学习/深度学习 数据采集 算法
基于WOA鲸鱼优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB 2022a实现时间序列预测,采用CNN-GRU-SAM网络结构,结合鲸鱼优化算法(WOA)优化网络参数。核心代码含操作视频,运行效果无水印。算法通过卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征,全连接层整合输出。数据预处理后,使用WOA迭代优化,最终输出最优预测结果。

热门文章

最新文章