【matlab 投影寻踪】基于PSO算法的最优投影方向优化

一 投影寻踪算法

投影寻踪是处理和分析高维数据的一类统计方法,其基本思想是将高维数据投影到低维(1~3维)子空间上,寻找出反映原高维数据的结构或特征的投影,以达到研究和分析高维数据的目的。1974年,美国Stanford大学的Friedman和Tukey首次将该方法命名为Projection Pursuit,即投影寻踪。
投影寻踪(projection pursuit,简称PP)是国际统计界于70年代中期发展起来的一种新的、有价值的新技术,是统计学、应用数学和计算机技术的交叉学科。它是用来分析和处理高维观测数据,尤其是非正态非线性高维数据的一种新兴统计方法。它通过把高维数据投影到低维子空间上,寻找出能反映原高维数据的结构或特征的投影,达到研究分析高维数据的目的。它具有稳健性、抗干扰性和准确度高等优点,因而在许多领域得到广泛应用。

三 粒子群算法

粒子群算法(Particle Swarm Optimization,PSO)是一种基于群体智能的优化算法,用于解决优化问题。它模拟群体中的个体(粒子)在解空间中的搜索过程,通过个体之间的信息交流和合作来寻找最优解。

粒子群算法的基本思想是,将解空间看作是一个多维空间,个体(粒子)在解空间中移动,并通过个体之间的信息交流和自我学习来改进自己的搜索策略。每个个体都有自己的位置和速度,并根据自己的经验(个体最优解)和群体的经验(全局最优解)来调整自己的移动方向和速度。

在粒子群算法中,每个粒子都有一个位置向量和一个速度向量。粒子根据自己的速度向量更新自己的位置,并根据自己的位置计算自己的适应度值。每个粒子都保留了自己的最优位置和适应度值,同时也保存了群体中的全局最优位置和适应度值。粒子根据自己的最优位置和全局最优位置来更新自己的速度,从而改变自己的移动方向和速度。

具体来说,粒子的速度更新公式为:
v_i(t+1) = w * v_i(t) + c1 * r1 * (pbest_i - x_i(t)) + c2 * r2 * (gbest - x_i(t))

其中,v_i(t)为粒子i在时刻t的速度,w为惯性权重,c1和c2为加速因子,r1和r2为随机数。pbest_i为粒子i的最优位置,x_i(t)为粒子i在时刻t的位置,gbest为全局最优位置。

粒子的位置更新公式为:
x_i(t+1) = x_i(t) + v_i(t+1)

粒子群算法的搜索过程一般包括以下步骤:

  1. 初始化粒子的位置和速度。
  2. 计算每个粒子的适应度值,并更新每个粒子的最优位置和全局最优位置。
  3. 根据粒子的最优位置和全局最优位置,更新每个粒子的速度和位置。
  4. 重复步骤2和步骤3,直到达到停止条件。

粒子群算法的优点是简单易实现,并且能够在较短的时间内找到较优解。然而,它也存在一些缺点,比如容易陷入局部最优解、对参数敏感等。因此,在应用粒子群算法时需要根据实际情况进行参数的调整和优化。

三 代码分享

clc
close all
clear all
dbstop if error
%%
filename='一二三四五线城市量化分析数据.xlsx';
% sheetname='2000-2013';
sheetname='2014-2016';[data,txt]=xlsread(filename,sheetname);
%% 读取数据
% xij=data(:,9:end-2);
xij=data(:,9:end);namelist=txt(3:end,2);
x_ij_norm=(xij-min(min(xij)))./(max(max(xij))-min(min(xij)));
%% 求解最优投影系数a_best
[n,m]=size(x_ij_norm);
objfunction=@(a)objFunction(a,x_ij_norm);
%%求解
lb=zeros(m,1);
ub=ones(m,1);
pop=50;
Max_iter=100;
[a_best,Best_score,curve]=PSO(pop,Max_iter,lb,ub,m,objfunction);figureplot(abs(curve))
xlabel('迭代次数')
ylabel('目标函数指')
title('粒子群算法进化曲线')%% 计算落户门槛指数
Z=x_ij_norm*a_best';%% 显示结果figure
subplot(2,2,1)
bar(Z(1:30))
xticks(1:30)
xticklabels(namelist(1:30))
ylabel('落户门槛指数')
subplot(2,2,2)
bar(Z(1+30:60))
xticks(1:30)
xticklabels(namelist(1+30:60))
ylabel('落户门槛指数')
subplot(2,2,3)
bar(Z(1+60:90))
xticks(1:30)
xticklabels(namelist(1+60:90))
ylabel('落户门槛指数')
subplot(2,2,4)
bar(Z(1+90:120))
xticks(1:30)
xticklabels(namelist(1+90:120))
ylabel('落户门槛指数')
sgtitle(sheetname)
%% 粒子群算法
function [Best_pos,Best_score,curve]=PSO(pop,Max_iter,lb,ub,dim,fobj)
%% 参数设置
w = 0.9;      % 惯性因子
c1 = 2;       % 加速常数
c2 = 2;       % 加速常数
%速度范围设定
Vmax = 2;
Vmin = -2;
Dim = dim ;            % 维数
sizepop = pop;       % 粒子群规模
maxiter  = Max_iter;      % 最大迭代次数
%%
if(max(size(ub)) == 1)ub = ub.*ones(1,dim);lb = lb.*ones(1,dim);
end
fun=fobj;
%% 粒子群初始化
% Range = ones(sizepop,1)*(ub-lb);
% pop = rand(sizepop,Dim).*Range + ones(sizepop,1)*lb;    % 初始化粒子群
pop=init(sizepop,lb,ub);
V = rand(sizepop,Dim)*(Vmax-Vmin) + Vmin;                 % 初始化速度
fitness = zeros(sizepop,1);
for i=1:sizepopfitness(i,:) = fun(pop(i,:));                         % 粒子群的适应值
end%% 个体极值和群体极值
[bestf, bestindex]=min(fitness);
zbest=pop(bestindex,:);   % 全局最佳
gbest=pop;                % 个体最佳
fitnessgbest=fitness;              % 个体最佳适应值
fitnesszbest=bestf;               % 全局最佳适应值%% 迭代寻优
iter = 0;
while( (iter < maxiter ))for j=1:sizepop% 速度更新V(j,:) = w*V(j,:) + c1*rand*(gbest(j,:) - pop(j,:)) + c2*rand*(zbest - pop(j,:));if V(j,:)>VmaxV(j,:)=Vmax;endif V(j,:)<VminV(j,:)=Vmin;end% 位置更新pop(j,:)=pop(j,:)+V(j,:);for k=1:Dimif pop(j,k)>ub(k)pop(j,k)=ub(k);endif pop(j,k)<lb(k)pop(j,k)=lb(k);endendpop(j,:)=pop(j,:)./sum(pop(j,:));% 适应值fitness(j,:) =fun(pop(j,:));% 个体最优更新if fitness(j) < fitnessgbest(j)gbest(j,:) = pop(j,:);fitnessgbest(j) = fitness(j);end% 群体最优更新if fitness(j) < fitnesszbestzbest = pop(j,:);fitnesszbest = fitness(j);endenditer = iter+1;                      % 迭代次数更新fprintf('当前迭代次数%i\n',iter)curve(iter) = fitnesszbest;
end
%% 绘图
Best_pos = zbest;
Best_score = fitnesszbest;

四 结果演示

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3250567.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习中的正则化技术 - Dropout篇

序言 在深度学习的浩瀚领域中&#xff0c;模型过拟合一直是研究者们面临的挑战之一。当模型在训练集上表现得近乎完美&#xff0c;却难以在未见过的数据&#xff08;测试集&#xff09;上保持同样优异的性能时&#xff0c;过拟合现象便悄然发生。为了有效缓解这一问题&#xf…

java文本比较解决方案

参考资料 VBA计算页码和行号https://learn.microsoft.com/zh-cn/office/vba/api/word.wdinformation 概述&#xff1a; 最近在做word文档对比的&#xff0c;总结了几种解决方案&#xff0c;记录一下 在java中&#xff0c;常用的文本对比方案有如下几种&#xff1a; 差异比较…

Pycharm 报错 Environment location directory is not empty 解

删除项目中ven文件夹&#xff08;已存在的&#xff09;&#xff0c;然后再添加新的ven虚拟环境就可以了

Richteck立锜科技电源管理芯片简介及器件选择指南

一、电源管理简介 电源管理组件的选择和应用本身的电源输入和输出条件是高度关联的。 输入电源是交流或直流&#xff1f;需求的输出电压比输入电压高或是低&#xff1f;负载电流多大&#xff1f;系统是否对噪讯非常敏感&#xff1f;也许系统需要的是恒流而不是稳压 (例如 LED…

入门C语言只需一个星期(星期三)

点击上方"蓝字"关注我们 01、基本数据类型 char 1 字节 −128 ~ 127 单个字符/字母/数字/ASCIIsigned char 1 字节 −128 ~ 127 -unsigned char 1 字节 0 ~ 255 -int…

【自学安全防御】三、企业双机热备和带宽管理的综合实验

实验拓扑&#xff1a; 实验任务&#xff1a; 12&#xff0c;对现有网络进行改造升级&#xff0c;将当个防火墙组网改成双机热备的组网形式&#xff0c;做负载分担模式&#xff0c;游客区和DMZ区走FW3&#xff0c;生产区和办公区的流量走FW1 13&#xff0c;办公区上网用户限制流…

JavaSE 知识梳理(上)

1. Java语言的特性 简单性、面向对象、分布式、健壮性、安全性、体系结构中立、可移植性、解释性、高能效、多线程、动态性 2. JDK、JRE、JVM之间的关系 JDK(Java Development Kit):Java开发工具包&#xff0c;提供给Java程序员使用&#xff0c;包含了JRE&#xff0c;同时还…

使用Pycharm画图展示在窗口的侧栏Plots中无图像问题

使用Pycharm画图展示在窗口的侧栏Plots中无图像问题 在运行一个python文件时&#xff0c;突然出现侧栏Plots处提供预览的哪里没有出现图片&#xff0c;只有空白。解决方法如下&#xff1a; 找到Tools -> Python Plots&#xff0c;下图&#xff0c;取消勾选use interactive…

django报错(二):NotSupportedError:MySQL 8 or later is required (found 5.7.43)

执行python manage.py runserver命令时报版本不支持错误&#xff0c;显示“MySQL 8 or later is required (found 5.7.43)”。如图&#xff1a; 即要MySQL 8或更高版本。但是企业大所数用的还是mysql5.7相关版本。因为5.7之后的8.x版本是付费版本&#xff0c;贸然更新数据库肯定…

WEB前端07-DOM对象

DOM模型 1.DOM概念 文档对象模型属于BOM的一 部分&#xff0c;用于对BOM中的核心对象document进行操作&#xff0c;它是一种与平台、语言无关的接口&#xff0c;允许程序和脚本动态地访问或更新HTML、XML文档的内容、结构和样式&#xff0c;且提供了一系列的函数和对象来实现…

Vue从零到实战基础篇

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

C语言丢失精度 如何实现高精度计算

&#xff08;1&#xff09;int 类型举例 int &#xff1a;占4个字节&#xff0c;也就是32位&#xff0c;及最大值是2^32-11024*1024*1024*4-14294967295 以上说法错误&#xff0c;因为Int是有符号类型整数&#xff0c;所以最高位是符号位&#xff0c;及int的最大值应该是2^31…

spring是如何解决循环依赖的,为什么不是两级

1. Spring使用三级缓存来解决循环依赖问题 Spring使用三级缓存来解决循环依赖问题&#xff0c;‌而不是使用两级缓存。‌ 在Spring框架中&#xff0c;‌解决循环依赖的关键在于正确地管理Bean的生命周期和依赖关系。‌循环依赖指的是两个或多个Bean相互依赖&#xff0c;‌如果…

VC运营指南:提升亚马逊VC账户销量的策略——WAYLI威利跨境助力商家

亚马逊VC作为供应商中心账户&#xff0c;其运营策略与普通的第三方卖家账户有所不同。想要在此平台上取得卓越的销售业绩&#xff0c;需要深入理解和运用一系列策略。 1、产品策略是基石 深入市场研究&#xff0c;了解消费者的真实需求&#xff0c;是选择产品的关键。只有选对…

vue echarts 柱状图表,点击柱子,路由代参数(X轴坐标)跳转

一 myChart.on(click, (params) > {if (params.componentType series && params.dataIndex ! undefined) {const months this.month_htqd[params.dataIndex]; // 获取点击柱状图的 X 轴坐标值alert(点击了柱状图&#xff0c;值为: ${months});// 根据点击的柱状图…

7.SpringBoot整合Neo4j

1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-neo4j</artifactId> </dependency> 说明&#xff1a;这里引入neo4j的版本跟spring框架的版本有关系。需要注意不同的版本在neo…

poi库简单使用(java如何实现动态替换模板Word内容)

目录 Blue留言&#xff1a; Blue的推荐&#xff1a; 什么是poi库&#xff1f; 实现动态替换 第一步&#xff1a;依赖 第二步&#xff1a;实现word模板中替换文字 模板word&#xff1a; 通过以下代码&#xff1a;&#xff08;自己建一个类&#xff0c;随意取名&#xf…

Qt 制作安装包

记录使用Qt工具制作一个安装包的过程 目录 1.准备工作 1.1检查Qt Installer Frameworks是否安装 1.2.安装Qt Installer Frameworks 1.3准备release出来的exe dll等文件 2.创建打包工程所需要的文件及目录 2.1创建子目录 2.2 创建工程文件 2.3 创建config/config.xml …

C语言 ——— 打印水仙花数

目录 何为水仙花数 题目要求 代码实现 何为水仙花数 “水仙花数”是指一个n位数&#xff0c;其各位数字的n次方之和等于该数本身 如&#xff1a;153 1^3 5^3 3^3&#xff0c;则153就是一个“水仙花数” 题目要求 求出0~100000的所有“水仙花数”并输出 代码实现 #i…

华为机试HJ97记负均正

华为机试HJ97记负均正 题目&#xff1a; 想法&#xff1a; 遍历输入的列表&#xff0c;记录所有负数的个数&#xff0c;记录所有正数的个数&#xff0c;并累加所有正数&#xff0c;最终获得所有负数的个数和正数的平均值 input_number input() input_number_list input().…