蔚箐 2024-03-21 08:49 采纳率: 50%
浏览 26
已结题

用MATLAB实现L1正则化的深度谱聚类算法

用MATLAB实现 L1正则化的深度谱聚类算法
输入 数据样本集 X ∈ Rd×n ,聚簇数 k
输出 X ∈ Rd×n的聚类结果
1)初始化:β,F参数;
2)利用自编码器对样本Xn×d提取特征并构造拉普拉斯矩阵L;
3)正交化步骤:从数据集中随机选择m 个样本并计算对应的正
交化模块输出,计算Cholesky分解得到正交权重;
4)随机梯度下降步骤:从数据集中再次随机选择 m 个样本构成
Xm×k,计算相似矩阵Wm×m并利用F计算m个样本的前k个拉普拉斯
特征向量并利用正交权重求解正交化输出Ym×k;
5)重复执行步骤3)~6),直到算法收敛;
6)用训练好的模型F (θ)得到特征向量y1,y2 ,⋯,yn;
7)利用k-means对y1 ,y2 ,⋯,yn进行聚类,得到样本的聚簇划分。

img

img

img

img

  • 写回答

16条回答 默认 最新

  • 逆水寒718 2024-03-25 21:39
    关注

    以下是一种可能的实现方法:

    clc;
    clear all;
    close all;
    
    % generate the data
    % data = kmeansRnd(2, 2, 500)
    % data = data';
    
    data = dlmread('test1_data.txt'); 
    data = data;
    figure(1),plot(data(:,1), data(:,2),'bo'), title('Original Data Points'); 
    %saveas(gcf, '1.jpeg');
    grid on;shg
    hold on;
    
    % calculate the affinity / similarity matrix (W)
    affinity = CalculateAffinity(data);
    % figure,imshow(affinity,[]), title('Affinity Matrix')
    
    % compute the degree matrix (D)
    for i=1:size(affinity,1)
        D(i,i) = sum(affinity(i,:));
    end
    
    % compute the normalized laplacian / affinity matrix (method 1)
    %NL1 = D^(-1/2) .* L .* D^(-1/2);
    for i=1:size(affinity,1)
        for j=1:size(affinity,2)
            NL1(i,j) = affinity(i,j) / (sqrt(D(i,i)) * sqrt(D(j,j)));  
        end
    end
    
    % compute the normalized laplacian (method 2)  eye command is used to
    % obtain the identity matrix of size m x n
    % NL2 = eye(size(affinity,1),size(affinity,2)) - (D^(-1/2) .* affinity .* D^(-1/2));
    
    % perform the eigen value decomposition
    [eigVectors,eigValues] = eig(NL1);
    
    % select k largest eigen vectors
    k = 4;
    nEigVec = eigVectors(:,(size(eigVectors,1)-(k-1)): size(eigVectors,1));
    
    % construct the normalized matrix U from the obtained eigen vectors
    for i=1:size(nEigVec,1)
        n = sqrt(sum(nEigVec(i,:).^2));    
        U(i,:) = nEigVec(i,:) ./ n; 
    end
    % perform kmeans clustering on the matrix U
    [IDX,C] = kmeans(U',3);
    IDX = IDX';
    
    % plot the eigen vector corresponding to the largest eigen value
    %figure,plot(IDX)
    figure,
    hold on;
    for i=1:size(IDX,1)
        if IDX(i,1) == 1
            plot(data(i,1),data(i,2),'bo');
        elseif IDX(i,1) == 2
            plot(data(i,1),data(i,2),'ro');
        elseif IDX(i,1) == 3
            plot(data(i,1),data(i,2),'go');
        else
            plot(data(i,1),data(i,2),'yo');        
        end
    end
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(15条)

报告相同问题?

问题事件

  • 系统已结题 4月3日
  • 已采纳回答 3月26日
  • 创建了问题 3月21日

悬赏问题

  • ¥15 Windows Script Host 无法找到脚本文件"C:\ProgramData\Player800\Cotrl.vbs”
  • ¥15 matlab自定义损失函数
  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图