
基于Copula理论与K-means的考虑风光出力相关性的风光场景生成与削减
风速和光照强度的相关性处理一直是新能源场景生成的痛点。传统蒙特卡洛方法生成的风光出力
场景经常出现"风速高时光照也强"这种明显违背物理规律的情况——毕竟刮大风的日子往往乌云密布。最
近在复现论文时发现个有意思的解决方案:用Copula函数刻画风光相关性,配合K-means做场景削减,效果
意外地好。
先看核心代码片段,这里用Frank-Copula构建联合分布:
```python
from scipy.stats import frankcopula
# 风速和光照的边缘分布参数
wind_params = {'a': 2.3, 'loc': 5.2, 'scale': 7.8}
solar_params = {'c': 0.85, 'loc': 0.1, 'scale': 0.4}
# 估计Copula参数
empirical_corr = df[['wind','solar']].corr().values[0,1]
theta = frankcopula.fit(theta0=5, dim=2, corr=empirical_corr)
# 生成联合分布样本
copula = frankcopula(theta, dim=2)
samples = copula.rvs(size=10000)
```
这里有个骚操作:先假设风速服从威布尔分布,光照用Beta分布(毕竟光照强度有0-1的天然界限)。
Frank-Copula的优势在于能捕捉非对称相关性,比如风光出力在极端情况下的相关性强弱变化。参数估
计时用经验相关系数作为初始值迭代,避免了复杂的极大似然估计。
生成场景后进入削减小剧场。传统方法直接聚类可能破坏相关性结构,得把风光出力作为联合特征
:
```python
from sklearn.cluster import KMeans
# 将风光出力标准化后拼接
X = np.hstack([wind_scaled, solar_scaled])
kmeans = KMeans(n_clusters=5, random_state=42).fit(X)
# 计算场景概率
_, counts = np.unique(kmeans.labels_, return_counts=True)