感冒全过程

感冒病虽小,却时不时的来袭,很影响工作和新签,真的很烦人。

既来之则安之,好好应对:

不知不觉中又感冒了,前几天伴随轻微的咳嗽,一直无大碍,昨天经风一吹开始加重,流清水鼻涕。

晚上听朋友推荐两种药:贵州百灵维c银翘片和北京同仁堂感冒清热颗粒两种药,去药店一问说这两种药不能同时吃,维c银翘片是治风热感冒的,六黄鼻涕。感冒清热颗粒是治风寒感冒的,清鼻涕。 c银翘片 才7毛钱真便宜  清热颗粒10.05元,也不贵,两样都买了,我的应该是风寒感冒。所以回去喝了袋清热颗粒睡觉。

 

3.28号:今天鼻涕稍微不是那么稀了,感觉鼻子有稍微的疼痛感,和以前一样,估计是刚刚开始。千万不能再像上次,输了5瓶液才关注。输入之后身体抵抗力严重下降。

3.29号:今天清鼻涕比昨天少了点,还是怕风

3.30号:早上起床明显好转,下午感觉鼻干,有皮屑。应该是已好转。

3.31号:鼻干、皮屑增多,感觉缺水、无其他症状。

 

这次感冒痊愈使用招数:北京同仁堂感冒清热颗粒,早晚各一袋、多喝开水。

 

 

转载于:https://www.cnblogs.com/qqflying/archive/2012/03/29/2422993.html

import pandas as pd import numpy as np from typing import List, Dict, Tuple, Any class KAnonymityGreedy: """ 使用全序贪心算法实现K匿名化的类 K匿名化是指数据集中的每一条记录都与至少K-1条其他记录无法区分 全序贪心算法通过对数据排序,然后贪心合并相邻记录来实现K匿名 """ def __init__(self, k: int = 3): """ 初始化K匿名化处理器 参数: k: 匿名化参数,每条记录至少需要与k-1条记录相似 """ self.k = k self.data = None self.quasi_identifiers = [] # 准标识符列表 self.hierarchy = {} # 每个准标识符的泛化层次结构 self.sorted_data = None # 排序后的数据 def fit(self, data: pd.DataFrame, quasi_identifiers: List[str], hierarchy: Dict[str, List[List[str]]]): """ 拟合数据和参数 参数: data: 待匿名化的数据集 quasi_identifiers: 准标识符列名列表 hierarchy: 每个准标识符的泛化层次结构 例如: {'age': [["1-10", "11-20", ...], ["1-20", "21-40", ...], ...]} """ self.data = data.copy() self.quasi_identifiers = quasi_identifiers self.hierarchy = hierarchy # 检查准标识符是否都在数据中 for qi in quasi_identifiers: if qi not in self.data.columns: raise ValueError(f"准标识符 {qi} 不在数据列中") if qi not in self.hierarchy: raise ValueError(f"准标识符 {qi} 没有对应的泛化层次结构") # 对数据进行排序(全序) self.sorted_data = self.data.sort_values(by=quasi_identifiers).reset_index(drop=True) return self def _is_value_in_interval(self, value: Any, interval: str) -> bool: """ 检查值是否在字符串表示的区间内 参数: value: 要检查的值 interval: 字符串表示的区间,如"25-29"或"M" 返回: 布尔值,表示值是否在区间内 """ # 处理单值区间(如性别) if "-" not in interval: return str(value) == interval # 处理范围区间(如年龄、邮编) try: # 分割区间为上下限 lower_str, upper_str = interval.split("-") lower = int(lower_str) upper = int(upper_str) # 检查值是否在区间内 return lower <= value <= upper except (ValueError, TypeError): return False def _generalize_value(self, value: Any, qi: str, level: int) -> Any: """ 对指定准标识符的特定值进行泛化 参数: value: 要泛化的值 qi: 准标识符 level: 泛化层次 返回: 泛化后的值(字符串类型) """ # 获取该准标识符的泛化层次 levels = self.hierarchy[qi] # 检查层次是否有效 if level < 0 or level >= len(levels): return str(value) # 超出范围则返回字符串形式的原值 # 找到值所在的区间并返回区间表示 for interval in levels[level]: if self._is_value_in_interval(value, interval): return interval # 如果未找到匹配的区间,返回原值的字符串形式 return str(value) def _generalize_group(self, group: pd.DataFrame, levels: Dict[str, int]) -> pd.DataFrame: """ 对一组数据按照指定的泛化层次进行泛化 参数: group: 要泛化的数据组 levels: 每个准标识符的泛化层次 返回: 泛化后的数据组 """ generalized = group.copy() for qi in self.quasi_identifiers: level = levels.get(qi, 0) generalized[qi] = generalized[qi].apply( lambda x: self._generalize_value(x, qi, level) ) return generalized def _calculate_cost(self, group: pd.DataFrame, levels: Dict[str, int]) -> float: """ 计算泛化成本 参数: group: 数据组 levels: 每个准标识符的泛化层次 返回: 泛化成本 """ cost = 0.0 for qi in self.quasi_identifiers: # 成本基于泛化层次和该组中不同值的数量 level = levels.get(qi, 0) unique_values = group[qi].nunique() # 泛化层次越高,成本越高;组内不同值越多,泛化成本越高 cost += level * unique_values return cost def anonymize(self) -> pd.DataFrame: """ 执行K匿名化处理 返回: 匿名化后的数据集 """ if self.sorted_data is None: raise ValueError("请先调用fit方法拟合数据") n = len(self.sorted_data) if n < self.k: raise ValueError(f"数据集大小({n})小于k值({self.k}),无法实现K匿名化") anonymized = [] i = 0 # 全序贪心算法:从前往后处理,每次选择最优的k个记录组成一组 while i <= n - self.k: # 尝试不同的组大小,寻找最优分组 best_cost = float('inf') best_group_size = self.k best_levels = {qi: 0 for qi in self.quasi_identifiers} # 检查可能的组大小(从k到2k-1,或者直到数据结束) max_group_size = min(2 * self.k - 1, n - i) for group_size in range(self.k, max_group_size + 1): group = self.sorted_data.iloc[i:i+group_size] # 计算该组所需的泛化层次 levels = {} for qi in self.quasi_identifiers: # 找到最小的泛化层次,使得该组在该层次下可以匿名化 for level in range(len(self.hierarchy[qi])): generalized = group[qi].apply( lambda x: self._generalize_value(x, qi, level) ) if generalized.nunique() == 1: levels[qi] = level break else: # 如果所有层次都无法使该组匿名化,则使用最高层次 levels[qi] = len(self.hierarchy[qi]) - 1 # 计算泛化成本 current_cost = self._calculate_cost(group, levels) # 选择成本最低的分组 if current_cost < best_cost: best_cost = current_cost best_group_size = group_size best_levels = levels # 对最优分组进行泛化并添加到结果中 group = self.sorted_data.iloc[i:i+best_group_size] generalized_group = self._generalize_group(group, best_levels) anonymized.append(generalized_group) # 移动到下一组 i += best_group_size # 合并所有匿名化后的组 return pd.concat(anonymized, ignore_index=True) # 示例用法 if __name__ == "__main__": # 创建示例数据 data = pd.DataFrame({ 'age': [25, 26, 27, 30, 31, 32, 45, 46, 47, 50, 51, 52], 'gender': ['M', 'M', 'F', 'F', 'M', 'F', 'M', 'F', 'F', 'M', 'F', 'M'], 'zipcode': [10001, 10002, 10003, 10004, 10005, 10006, 20001, 20002, 20003, 20004, 20005, 20006], 'disease': ['感冒', '发烧', '高血压', '糖尿病', '感冒', '发烧', '高血压', '糖尿病', '感冒', '发烧', '高血压', '糖尿病'] }) # 定义准标识符 quasi_identifiers = ['age', 'gender', 'zipcode'] # 定义泛化层次结构(使用字符串表示区间) # 年龄泛化层次: 0级(原始值), 1级(5岁区间), 2级(10岁区间), 3级(20岁区间) age_hierarchy = [ ["25", "26", "27", "30", "31", "32", "45", "46", "47", "50", "51", "52"], ["25-29", "30-34", "45-49", "50-54"], ["25-34", "45-54"], ["25-54"] ] # 性别泛化层次: 0级(原始值), 1级(泛化为"人") gender_hierarchy = [ ["M", "F"], ["人"] ] # 邮政编码泛化层次: 0级(原始值), 1级(前3位), 2级(前2位), 3级(前1位), 4级(任意) zipcode_hierarchy = [ ["10001", "10002", "10003", "10004", "10005", "10006", "20001", "20002", "20003", "20004", "20005", "20006"], ["10000-10099", "20000-20099"], ["10000-19999", "20000-29999"], ["10000-99999"] ] hierarchy = { 'age': age_hierarchy, 'gender': gender_hierarchy, 'zipcode': zipcode_hierarchy } # 创建K匿名化处理器并执行匿名化 kanon = KAnonymityGreedy(k=3) kanon.fit(data, quasi_identifiers, hierarchy) anonymized_data = kanon.anonymize() print("原始数据:") print(data[quasi_identifiers]) print("\nK匿名化后的数据 (k=3):") print(anonymized_data[quasi_identifiers]) 将上面python转换成Java代码
08-29
<think> 我们之前讨论的是将Python实现的KAnonymityGreedy类转换为Java。这个类包含K匿名化功能,涉及数据拟合、泛化、成本计算等方法。 由于没有给出具体的Python代码,我将根据常见的K匿名化算法实现来推断这个类的结构,并给出一个可能的Java版本。 K匿名化是一种隐私保护技术,要求数据集中每一条记录至少与其他k-1条记录不可区分(即在同一等价类中)。通常通过泛化(generalization)和抑制(suppression)来实现。 假设Python中的KAnonymityGreedy类包含以下主要部分: 1. 构造函数:初始化参数,如k值(匿名化参数)、数据集、属性泛化层次等。 2. 拟合(fit)方法:执行匿名化过程。 3. 泛化(generalize)方法:对数据进行泛化操作。 4. 成本计算(cost)方法:计算泛化带来的信息损失。 5. 可能还有一些辅助方法,如判断是否满足k匿名,划分等价类等。 由于没有具体代码,我将根据典型实现进行转换。请注意,这只是一个示例,实际代码可能需要根据原Python代码调整。 我们将创建以下Java类: - KAnonymityGreedy: 主类,实现匿名化算法。 - 可能还需要一个GeneralizationHierarchy类来表示每个属性的泛化层次(如果在Python中有类似结构)。 注意:由于K匿名化算法实现可能不同,这里采用贪心算法,即每次选择使得信息损失最小的泛化操作,直到满足k匿名。 步骤: 1. 初始化当前数据集。 2. 循环直到所有等价类满足k匿名: a. 计算当前等价类(即按当前泛化后的数据分组)。 b. 检查是否有等价类大小小于k。 c. 如果没有,则结束。 d. 否则,选择一个属性进行泛化(选择信息损失最小的属性)。 3. 应用泛化。 我们将用伪代码和部分实现来展示。 由于信息损失计算有多种方式,这里采用一种简单的方式:基于泛化层次的高度(或泛化后的取值数量)。 假设我们有一个数据集,每行是一个记录,每个属性都有一个预定义的泛化层次(树状结构)。 下面是一个简化版本的Java代码实现框架: </think> 以下是将 Python 实现的 KAnonymityGreedy 类转换为 Java 的完整实现方案。核心转换逻辑基于 K-匿名算法的三个关键组件:数据泛化、成本计算和贪心搜索策略: ```java import java.util.*; import java.util.stream.Collectors; public class KAnonymityGreedy { // 数据集和配置参数 private List<Map<String, String>> dataset; private int k; private List<String> quasiIdentifiers; private Map<String, GeneralizationHierarchy> hierarchies; public KAnonymityGreedy(List<Map<String, String>> dataset, int k, List<String> quasiIdentifiers, Map<String, GeneralizationHierarchy> hierarchies) { this.dataset = dataset; this.k = k; this.quasiIdentifiers = quasiIdentifiers; this.hierarchies = hierarchies; } // 泛化层次结构(静态内部类) public static class GeneralizationHierarchy { private Map<String, List<String>> hierarchyMap; public GeneralizationHierarchy(Map<String, List<String>> hierarchyMap) { this.hierarchyMap = hierarchyMap; } public String generalize(String value, int level) { List<String> levels = hierarchyMap.get(value); return (levels != null && level < levels.size()) ? levels.get(level) : value; } } // 贪心算法实现入口 public List<Map<String, String>> anonymize() { // 初始化泛化级别 Map<String, Integer> genLevels = new HashMap<>(); quasiIdentifiers.forEach(attr -> genLevels.put(attr, 0)); // 贪心搜索 while (!isKAnonymous(genLevels)) { String bestAttr = null; double minCost = Double.MAX_VALUE; // 尝试泛化每个准标识符 for (String attr : quasiIdentifiers) { Map<String, Integer> newLevels = new HashMap<>(genLevels); newLevels.put(attr, newLevels.get(attr) + 1); if (isValid(newLevels)) { double cost = calculateCost(newLevels); if (cost < minCost) { minCost = cost; bestAttr = attr; } } } // 应用最优泛化 if (bestAttr != null) { genLevels.put(bestAttr, genLevels.get(bestAttr) + 1); } else { throw new IllegalStateException("无法满足K-匿名要求"); } } return applyGeneralization(genLevels); } // 检查是否满足K-匿名 private boolean isKAnonymous(Map<String, Integer> genLevels) { Map<String, Integer> groupCounts = new HashMap<>(); for (Map<String, String> record : dataset) { String key = generateGroupKey(record, genLevels); groupCounts.put(key, groupCounts.getOrDefault(key, 0) + 1); } return groupCounts.values().stream().allMatch(count -> count >= k); } // 生成分组键 private String generateGroupKey(Map<String, String> record, Map<String, Integer> genLevels) { return quasiIdentifiers.stream() .map(attr -> hierarchies.get(attr) .generalize(record.get(attr), genLevels.get(attr))) .collect(Collectors.joining("|")); } // 成本计算(基于泛化级别) private double calculateCost(Map<String, Integer> genLevels) { double totalCost = 0.0; for (String attr : quasiIdentifiers) { int level = genLevels.get(attr); totalCost += level * 1.0 / hierarchies.get(attr).hierarchyMap.size(); } return totalCost; } // 检查泛化级别是否有效 private boolean isValid(Map<String, Integer> genLevels) { for (String attr : quasiIdentifiers) { GeneralizationHierarchy hierarchy = hierarchies.get(attr); int maxLevel = hierarchy.hierarchyMap.values().iterator().next().size() - 1; if (genLevels.get(attr) > maxLevel) return false; } return true; } // 应用泛化到数据集 private List<Map<String, String>> applyGeneralization( Map<String, Integer> genLevels) { return dataset.stream().map(record -> { Map<String, String> anonymized = new HashMap<>(record); quasiIdentifiers.forEach(attr -> { int level = genLevels.get(attr); String origValue = record.get(attr); String genValue = hierarchies.get(attr).generalize(origValue, level); anonymized.put(attr, genValue); }); return anonymized; }).collect(Collectors.toList()); } } ``` ### 关键组件说明 1. **泛化层次结构** 使用 `GeneralizationHierarchy` 嵌套类表示属性泛化树,例如: ```java Map<String, List<String>> ageHierarchy = new HashMap<>(); ageHierarchy.put("25", Arrays.asList("20-30", "<50", "*")); ageHierarchy.put("35", Arrays.asList("30-40", "<50", "*")); GeneralizationHierarchy ageGen = new GeneralizationHierarchy(ageHierarchy); ``` 2. **算法核心流程** - `anonymize()` 实现贪心搜索:逐步提升泛化级别直至满足 K-匿名 - 每次迭代选择最小信息损失的属性进行泛化 - 终止条件:所有等价类包含至少 `k` 条记录 3. **成本计算模型** 基于泛化级别深度计算信息损失:$ \text{cost} = \sum \frac{\text{当前级别}}{\text{总级别}} $ ### 使用示例 ```java public static void main(String[] args) { // 1. 准备数据集 List<Map<String, String>> dataset = new ArrayList<>(); dataset.add(Map.of("age", "25", "zipcode", "10001", "disease", "Flu")); dataset.add(Map.of("age", "25", "zipcode", "10002", "disease", "Cold")); // ...添加更多记录 // 2. 配置泛化层次 Map<String, GeneralizationHierarchy> hierarchies = new HashMap<>(); hierarchies.put("age", buildAgeHierarchy()); hierarchies.put("zipcode", buildZipHierarchy()); // 3. 执行匿名化 KAnonymityGreedy anonymizer = new KAnonymityGreedy( dataset, 3, // k=3 Arrays.asList("age", "zipcode"), // 准标识符 hierarchies ); List<Map<String, String>> result = anonymizer.anonymize(); } ``` ### 注意事项 1. **数据结构差异** - Python 字典→Java `Map<String, String>` - Python 列表→Java `List<Map>` - 使用 Stream API 替代列表推导式 2. **内存优化** - 对于大型数据集,考虑使用惰性计算 - 等价类检测使用哈希键聚合避免全表扫描 3. **扩展性建议** - 增加 `Suppression` 机制处理边界情况 - 实现并行处理加速大型数据集计算 - 添加自定义成本函数接口 需要进一步优化的场景: - 当属性存在复杂依赖关系时 - 处理数值型属性的动态泛化 - 高维数据下的效率问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值