如何用Python基于概率聚类(模糊聚类)生成三类温度隶属度特征?
用Python实现温度数据的模糊K均值(概率聚类)
完全可以通过Python实现你的需求,我们可以借助scikit-fuzzy库完成模糊C均值(即软K均值)聚类,生成每个温度点对应冷、适中、热三类的隶属概率,且保证每一行的隶属度之和为1。
实现步骤与代码示例
1. 安装依赖库
首先安装模糊聚类及数据处理所需的库:
pip install scikit-fuzzy numpy pandas
2. 数据准备与聚类实现
import numpy as np import pandas as pd import skfuzzy as fuzz # 替换为你的实际温度数据(这里模拟10万条0-130°F的样本) np.random.seed(42) temperatures = np.random.uniform(low=0, high=130, size=100000) # 转换为scikit-fuzzy要求的输入格式:(特征数, 样本数) temp_data = temperatures.reshape(1, -1) # 根据给定区间设置初始聚类中心(取每个区间中点) init_centers = np.array([[15], [65], [115]]) # 冷:0-30中点15,适中:50-80中点65,热:100-130中点115 # 执行模糊C均值聚类 # 参数说明:c=3聚类数,m=2模糊指数(控制隶属度模糊程度),error=收敛阈值,maxiter=最大迭代次数 cluster_centers, memberships, _, _, _, _, _ = fuzz.cluster.cmeans( temp_data, c=3, m=2, error=0.005, maxiter=1000, init=init_centers ) # 将隶属度转换为DataFrame,对应冷、适中、热三类 membership_df = pd.DataFrame(memberships.T, columns=['冷', '适中', '热']) # 添加原始温度列(可选) membership_df['温度(°F)'] = temperatures
3. 结果验证
以接近39°F的样本为例,查看隶属度情况:
# 找到最接近39°F的样本索引 target_idx = np.argmin(np.abs(temperatures - 39)) sample_temp = round(temperatures[target_idx], 1) cold = round(membership_df['冷'][target_idx], 2) moderate = round(membership_df['适中'][target_idx], 2) hot = round(membership_df['热'][target_idx], 2) print(f"温度{sample_temp}°F的隶属度:") print(f"冷: {cold}, 适中: {moderate}, 热: {hot}") print(f"隶属度之和:{round(cold + moderate + hot, 2)}")
关键参数说明
- 模糊指数m:通常取2,值越大,不同类别的隶属度越平均;值越小,越接近硬聚类(隶属度趋近于0或1)。
- 初始聚类中心:手动设置为给定区间的中点,能让聚类结果更贴合你的需求,避免算法随机初始化偏离预期。
- 性能:10万条数据的计算在普通电脑上仅需几秒,效率完全满足需求。
内容的提问来源于stack exchange,提问作者bluered_earth
相关产品推荐
相关产品推荐

