import csv
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
from datetime import datetime
from sklearn.metrics import explained_variance_score
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
from sklearn.metrics import explained_variance_score
from sklearn import metrics
from sklearn.metrics import mean_absolute_error # 平方绝对误差
import random
import pandas as pd
class PSO:
def __init__(self, parameters):
"""
particle swarm optimization
parameter: a list type, like [NGEN, pop_size, var_num_min, var_num_max]
"""
# 初始化
self.NGEN = parameters[0] # 迭代的代数
self.pop_size = parameters[1] # 种群大小
self.var_num = len(parameters[2]) # 变量个数
self.bound = [] # 变量的约束范围
self.bound.append(parameters[2])
self.bound.append(parameters[3])
self.pop_x = np.zeros((self.pop_size, self.var_num)) # 所有粒子的位置
self.pop_v = np.zeros((self.pop_size, self.var_num)) # 所有粒子的速度
self.p_best = np.zeros((self.pop_size, self.var_num)) # 每个粒子最优的位置
self.g_best = np.zeros((1, self.var_num)) # 全局最优的位置
# 初始化第0代初始全局最优解
temp = -1
for i in range(self.pop_size):
for j in range(self.var_num):
self.pop_x[i][j] = random.uniform(self.bound[0][j], self.bound[1][j])
self.pop_v[i][j] = random.uniform(0, 1)
self.p_best[i] = self.pop_x[i] # 储存最优的个体
fit = self.fitness(self.p_best[i])
if fit > temp:
self.g_best = self.p_best[i]
temp = fit
def fitness(self, ind_var):
data = pd.read_excel('C:/Users/孙海涛/Desktop/x.xlsx', sheet_name='Sheet1') # 读取数据
target = pd.read_excel('C:/Users/孙海涛/Desktop/y.xlsx', sheet_name='Sheet1') # 读取数据
x_train, x_test, y_train, y_test = train_test_split(data, target, random_state=22, test_size=0.25)
std_x = StandardScaler()
x_train = std_x.fit_transform(x_train)
x_test = std_x.transform(x_test)
std_y = StandardScaler()
y_train = std_y.fit_transform(y_train)
y_test = std_y.transform(y_test)
y_test = std_y.inverse_transform(y_test)
"""
个体适应值计算
"""
x1 = ind_var[0]
x2 = ind_var[1]
x3 = ind_var[2]
if x1 == 0: x1 = 0.001
if x2 == 0: x2 = 0.001
if x3 == 0: x3 = 0.001
model_svr = SVR(C=x1, epsilon=x2, gamma=x3)
model_svr.fit(x_train, y_train)
predict_results = std_y.inverse_transform(model_svr.predict(x_test)) # 预测结果
print("R2 = ", metrics.r2_score(y_test, predict_results)) # R2
return metrics.r2_score(y_test, predict_results)
def update_operator(self, pop_size):
"""
更新算子:更新下一时刻的位置和速度
"""
c1 = 2 # 学习因子,一般为2
c2 = 2
w = 0.4 # 自身权重因子
for i in range(pop_size):
# 更新速度
self.pop_v[i] = w * self.pop_v[i] + c1 * random.uniform(0, 1) * (
self.p_best[i] - self.pop_x[i]) + c2 * random.uniform(0, 1) * (self.g_best - self.pop_x[i])
# 更新位置
self.pop_x[i] = self.pop_x[i] + self.pop_v[i]
# 越界保护
for j in range(self.var_num):
if self.pop_x[i][j] < self.bound[0][j]:
self.pop_x[i][j] = self.bound[0][j]
if self.pop_x[i][j] > self.bound[1][j]:
self.pop_x[i][j] = self.bound[1][j]
# 更新p_best和g_best
if self.fitness(self.pop_x[i]) > self.fitness(self.p_best[i]):
self.p_best[i] = self.pop_x[i]
if self.fitness(self.pop_x[i]) > self.fitness(self.g_best):
self.g_best = self.pop_x[i]
def main(self):
popobj = []
self.ng_best = np.zeros((1, self.var_num))[0]
for gen in range(self.NGEN):
self.update_operator(self.pop_size)
popobj.append(self.fitness(self.g_best))
print('############ Generation {} ############'.format(str(gen + 1)))
if self.fitness(self.g_best) > self.fitness(self.ng_best):
self.ng_best = self.g_best.copy()
print('最好的位置:{}'.format(self.ng_best))
print('最大的函数值:{}'.format(self.fitness(self.ng_best)))
print("---- End of (successful) Searching ----")
# plt.figure()
# fig = plt.gcf()
# fig.set_size_inches(18.5, 10.5)
# plt.title("Figure1")
# plt.xlabel("iterators", size=14)
# plt.ylabel("fitness", size=14)
# t = [t for t in range(self.NGEN)]
# plt.plot(t, popobj, color='b', linewidth=2)
# plt.show()
plt.figure()
plt.title("PSO-SVM")
plt.xlabel("GENS", size=14)
plt.ylabel("R2", size=14)
t = [t for t in range(self.NGEN)]
plt.plot(t, popobj, 'b', linewidth=2)
plt.show()
# R2 = 0.999597635768267
# 最好的位置:[7.09454400e+01 1.00000000e-02 4.68724001e-01]
# R2 = 0.999597635768267
# 最大的函数值:0.999597635768267
if __name__ == '__main__':
NGEN = 100
popsize = 20
low = [0,0.01,0]
up = [200,0.01,50]
parameters = [NGEN, popsize, low, up]
pso = PSO(parameters)
pso.main()
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
pso带数据集.zip (3个子文件)
x.xlsx 21KB
PSO.py 6KB
y.xlsx 14KB
共 3 条
- 1
资源评论
- 咖啡碎冰冰2023-07-25这个文件的编写方式很实用,没有过多的花哨技巧,使得算法思路更加清晰易懂。
- 袁大岛2023-07-25在使用这个文件时,我们可以充分利用自带的数据集,不需要额外的数据准备工作。
- 白小俗2023-07-25这个文件很有用,通过粒子群算法PSO优化支持向量机回归算法SVR,可以更好地预测数据趋势。
- 大头蚊香蛙2023-07-25这个文件提供了一个简洁高效的方法,帮助我们用Python实现支持向量机回归算法SVR的优化。
- Unique先森2023-07-25使用这个文件可以极大地提高模型的准确性和预测精度,对于数据分析和预测任务非常有帮助。
傻傻虎虎
- 粉丝: 3816
- 资源: 34
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++前馈神经网络.zip
- PCB灯光画(哆啦A梦)DIY制作.rar
- 基于c语言-文档+程序 简单潮流计算,这个压缩包包含两种方法
- 基于粒子群优化随机森林的数据分类预测.zip
- 基于matlab实现AR法模拟脉动风场风速.rar
- 基于matlab实现cpp电力系统的牛顿-拉夫逊潮流计算 有程序和PPT.rar
- 基于matlab实现的对电力系统进行交流潮流计算,计算方法为极坐标系下的牛顿拉夫逊法.rar
- 基于matlab实现的蒙特卡洛仿真8psk的蒙特卡洛仿真.rar
- 基于matlab实现的牛顿拉夫逊潮流计算.rar
- 基于matlab实现的牛顿-拉夫逊法的潮流计算程序,并提供9节点、30节点的算例 .rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功