hjr-ID3决策树算法

信息熵

一件事知道的越多信息熵越小,知道的越少信息熵越大,或者说越出乎意料越不确定信息熵越大。

目的

构造决策树的基本想法是随着树深度的增加,节点的熵迅速地降低。熵降低的速度越快越好,这样我们有望得到一棵高度最矮的决策树。

步骤

1、根据训练数据中已知的分类结果,求先验概率并通过先验概率求分类信息熵。
比如,猜拳我出了3次石头2次布,那么3/5和2/5是前验概率,把前验概率带入E(分类) = -∑p(xi)log(2,p(xi)) (i=1,2,..n) 计算出信息熵。
比如让你预测我接下来出什么,你当前的不确定度就是刚才得到的信息熵,因此,不确定度或者说是信息熵当然越小越好,而构造决策树就是为了降熵。
2、为了降熵,先求各个属性信息熵,先求出
{
E(属性A) =
累加(0到j) count(Aj)/count(A)* (-(p1j*log2(p1j)+p2j*log2(p2j)+p3j*log2(p3j) ))

n=分裂区间数目
count(Aj)=属性A在第j分裂区间出现的次数
count(A)=属性A总记录数(训练数据数)
p1j =count(A1j)/count(Aj) :属性A第j分裂区间中并且是分类1的个数占属性A在第j分裂区间个数的比例
p2j =count(A2j)/count(Aj) :属性A第j分裂区间中并且是分类2的个数占属性A在第j分裂区间个数的比例
p3j =count(A3j)/count(Aj) :属性A第j分裂区间中并且是分类3的个数占属性A在第j分裂区间个数的比例
}
同理求属性B,C,D…
3、分类信息熵与每个属性信息熵相减得信息增益,信息增益大的属性作为树根,即该属性作为树根会使系统的总信息熵下降最快,该属性的分裂区间作为树枝,接下来需要确定剩下的i-1个属性分别在哪个树枝上。
4、根据Ni分裂区间(i=分裂区间数目),统计训练数据中,树根属性处于N1分裂区间的记录,重复之前的1,2,3,4步骤,求其余属性中信息增益最大的属性作为N1节点,再统计训练数据中,树根属性处于N2分裂区间的记录,方法不变,求出N2,N2…节点。
5、每个节点分别以其分裂区间作为树枝,统计训练数据中,同时满足树根树枝与节点树枝的记录,再从去除树根属性与该节点属性之外的属性中求信息增益最大的作为下一层节点,其余的树枝同理,第二层其余的节点也同理,直到在训练数据中,同时满足从树根到一条线上的树枝只有一条记录后,那么这条记录的分类结果就作为该条线上的树枝的树叶。

以下是使用Java加载私钥字符串的示例代码: ```java import java.io.IOException; import java.io.StringReader; import java.security.KeyFactory; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import org.apache.commons.codec.binary.Base64; import org.bouncycastle.openssl.PEMReader; public class LoadPrivateKeyFromString { public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, IOException { // 私钥字符串 String privateKeyString = "-----BEGIN PRIVATE KEY-----\n" + "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCzOn8XlPzG2J/W\n" + "C2mMfBd6CQcF0CvzZ8BnL3L2J8M6rVq8EHXv5Tc1zRlWbR9z5O3DZwVcGlYs+J2w\n" + "wGJYX1LjEjK1gNlRqZyUzJH7v+7zCzqLQxTnB0nZ3g1e5Hq9QhJ6tQJjB8e9Ih6m\n" + "oRtYK4VJ2jN7+3L5KdWLr1+PzGdJxXK5+Qn0yK0nJ+Vf7+Q1fZ8sK56uNwK7L6Gq\n" + "P9LZVg4w8OrG9JDhQqR7jpmN0nJ2mVQ4iZgRsd/FZ2xG4rXV4GyNeL2T3gmmKqL9\n" + "hjR2w+G2Z0tN+Zd9HNmJ6MD9y2e2FPO3JHaKZqL1xu3U6O9zJNJP6r8o+qgHkDOa\n" + "YSmOD7o3AgMBAAECggEAMOv5y5vTfjQXz1Kx5uJIwDYyqk7tZJU7yeKsX+5fCQwK\n" + "C0pPp7g6b1q5O1mVNTVgkZ9+FcJ9LZLdG7CvE1Zt/D5fHj5rD7v7G7d3+TZnN3Qe\n" + "7vTQhx1r9QX3C8z+7Vr1EVnZKkY5hk9T4E5+o6j6+g5n3Jq8+7v+8VTPdXhBb0L6\n" + "EI6jQe5uGqsy0ajZq4Fv/9lV8hZrZ6jQzpJiWQjUo3u2s0Zu6oW8N5a+8FZQ5JtN\n" + "jnv+3rJ9I5dJxwveZb+VJZLJ6AQRblRiO0U2I2LxWw9+8yN4y5nUx4LEZL0rBEq2\n" + "ZplL7s0k7gG5H6bqZ8jT6ZfpJd5p8rI4r+0cTg4c4QKBgQD9vBl2YtQOYxZ9Mm8A\n" + "6bQXwWz8z3Cx2yQieSg4fIjx2U9L9R5zQrM6GtTJ9zCv8u8N0JQc9+GJ7Za7rp+P\n" + "WzCpJl7qPMAFQ1ZoeW6e3f+ZIvQ3uQBtZ7J9jO+xu4c8H+YXu4XNqOlg8LqWgY8C\n" + "Jm1o7yPbK1/0t+7BwT8L/OSzVQKBgQDG4aJxGKyjyIe2Mv7Kf0wGwQrM7WUuVwQ\n" + "x6B1CJqJpXj0fWV/6qz8xj0VfL8Bw8A8Ck5dPQjxYXVE7Ovz7vX4qX5c4TQ3n/3Y\n" + "oN3o4ZG6Z1Bz4i8/aq4Z3+8UJ9vEmo4c5qEfFb2m3b2b+8p7FkRbXbLwyfP0r+9E\n" + "Hcl8GJ2jN8BsqL9Zt+qJNyHnNQKBgQDvRrQ6oL7E6KoJLwZQMzI1w22s5TQeJ3G\n" + "uN7mVXy9yJ4NCoajZoG6uG1YJj+2FjLj9xTf5g7G2aJX6GtZ0UrZy7Lq4lUlzJQq\n" + "v5nY6CpJz6OiKuV6hXnoV4c3pC0yHq+7yKgFv3y1wM4/5oL/jiAsiHIAP5gN8Cq\n" + "pWl2wW6OuQKBgQDpVWbGcBbT3ul8cUu4sfqCgG1EzZjyVbA1PbZTfzvRnW/wbLj9\n" + "d6Rv0zSgGfLWVfQg7QpuK1CJpRdYlDZn+KXnUoH/m9qY+9Gd4XjQHbJdKo+9OAjS\n" + "1LwRbGZ7F8LXVJ8ZJhQDh7ZnnSvQxnq0L6Lyaq1b3S3h4fpQ+3X6E3b7NQKBgQCU\n" + "jy8LpRcFh6OJ8XeQ9f9vJt7zA7Y3PJa0JzjRc9aCfRwsB1fVpJgOj1ZsKZx4sE2H\n" + "wWwCjT2nWFT7N5X/gHc+Qj4Ggf2gKz0uZc3E4eNNLfh9zqSkkx+H9KtV5N25OvG6\n" + "QJmQjH4ZloX7N+2yjv6C9Xs3KQKBgBn54Y8AYmJb1K0yRz5ZlX1vP8RJZ2pGzL6/\n" + "l2fgk/3aiIrsZKm5tTfJ7M4Xz3sA5wL/5IaGFS3NwEzKjrYQk0P7XQVXVbK5jN6h\n" + "ZKvJmduZP0KAzUyqg6Yg9j3ZZAnuZAzYtX4sB8wU8/qRQfD0h/7IG5lzAoGBAKcM\n" + "mPVzD7jyYJ7lqEj4jmP0ZzFfMYcUQJ5z9H4LQ9KJ5SCVxGXoW8XvqGxV63RvIyUu\n" + "z3JfZxwZvK2GmsCUZfQkqQoYZ0DGLSsJ4P6C9R6Rfz3I2YmZdY0qC0xFl4m9YfFp\n" + "wQJY9LZp2tI27Bz8HGK3KJzX\n" + "-----END PRIVATE KEY-----"; // 将PEM格式的私钥字符串转换为PKCS8EncodedKeySpec格式 PEMReader pemReader = new PEMReader(new StringReader(privateKeyString)); byte[] privateKeyBytes = pemReader.readPemObject().getContent(); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes); // 使用KeyFactory加载私钥 KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); System.out.println("Loaded private key: " + privateKey); } } ``` 需要注意的是,上述示例代码使用了Bouncy Castle库,因此需要将其添加到项目依赖中。同时,示例代码还使用了Apache Commons Codec库,用于Base64编解码。如果您的项目中已经包含这些库,则可以直接在代码中使用它们。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

架构师小侯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值