Kalzn
文章20
标签13
分类7
机器学习算法实现

机器学习算法实现

仓库地址

MachineLearningImpl

这里是一些经典机器学习算法的实现。实现基于C++或者python基本库(python使用numpy和pandas,不使用任何机器学习框架),初学学习之用。

当前更新:

ANN
朴素bayes
CART决策树
ID3决策树
随机森林
kNN
Kmeans
SVM

ANN(基于C++)

https://github.com/Kalzncc/SimpleANNModel

朴素bayes(基于C++)

https://github.com/Kalzncc/SimpleBayesClassifier

ID3决策树和kNN算法

https://github.com/Kalzncc/ID3AndKNNImpl

CART决策树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from random_forest.model.decision_tree import Decision_Tree

model = Decision_Tree(gini_threshold=0.01, rf_atr_num=-1)
# gini_threshold 基尼指数阈值,小于此阈值终止划分
# rf_atr_num 默认是-1,每次随机选取的属性数目,(用于随机森林)


model.train(data, label, dtype)
# data, label 分别是numpy数组格式的数据和对应的label,
# 而dtype是一个列表,其对应了每一维属性是离散值还是连续值
# 例如数据的数据为:(年龄,分数,性别)。其中年龄,分数为连续值,性别为离散值,则传入的dtype则为:[1,1,0]

out_label = model.query(sample)
# 输入一个样例,输出预测标签

随机森林

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from random_forest.model.random_forest import Random_Forest

model = Random_Forest(tree_num=10, random_atr_num=3, batch=100, gini_threshold=0.3)
# tree_num 决策树数量
# random_atr_num 每次随机选取的属性个数
# batch 每次训练随机选取的样例个数

model.train(data=data, label=label, dtype=dtype)
# data, label 分别是numpy数组格式的数据和对应的label,
# 而dtype是一个列表,其对应了每一维属性是离散值还是连续值
# 例如数据的数据为:(年龄,分数,性别)。其中年龄,分数为连续值,性别为离散值,则传入的dtype则为:[1,1,0]

out_label = model.query(sample)
# 输入一个样例,输出预测标签

Kmeans算法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from model.kmeans import Kmeans
from utils.draw import draw_scatter
from model.kmeans import get_data_div

model = Kmeans(k=4)
# K为分簇个数

bel, means = model.train(data)
# bel为每个数据的所属类
# means为每个簇的中心


draw_scatter(get_data_div(bel, data, 4), means)
#画散点图示例

这里演示聚簇示例

SVM 基于SMO算法

公式推定:https://kalzncc.github.io/2022/11/19/smo/

这里吐槽一下,这个东西是真的难啊。一度想要放弃,不过最后还是推出来并实现出来了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from model.support_vector_machine import Support_Vector_Machine
from utils.utils import read_data
import model.kernel_func as kf
from utils.draw import draw_div_line

svm = Support_Vector_Machine(max_round, delta_alpha_threshold, c, kkt_tolerance, kernel_func)
# max_round 最大优化轮次
# delta_alpha_threshold 优化alpha时的最小变化阈值(变化小于此阈值时视为优化失败)
# c 软间隔松弛参数,默认极大值
# kkt_tolerance kkt条件容忍程度阈值(辨别时依据此阈值判定一变量是否满足kkt)
# kernel_func 核函数, 在model.kernel_func.py中定义了一些核函数示例,可以参考。默认为线性核

svm.train(data, label)
# data, label 分别是numpy数组格式的数据和对应的label,应为二分类,label只有0,1两种标签

out_f = svm.query(sample)
# 询问样例标签,输出为一个数值,为原f函数输出,如果值小于0应划分至-1,如果值大于0应划分至1

label = np.array([-1 if i == 0 else 1 for i in label])
draw_div_line(data, label, min_x=-5, max_x=15, min_y=-5, max_y=15, query=svm.query, sv=svm.sv)
# 画分割线图表

有关核函数,在model.kernel_func.py有示例,核函数需要定义run方法,传入两个等维度numpy向量,输出一个标量值。这里示例创建一个sigma为1.0的高斯核函数。

1
2
3
4
5
6
7
8
9
10
11
# main.py
from svm.model.kernel_func import Gauss_Kernel
svm = Support_Vector_Machine(max_round=10, kernel_func=Gauss_Kernel(sigma=1.0))

# svm.model.kernel_func.py
class Gauss_Kernel:
def __init__(self, sigma):
self.sigma = sigma

def run(self, x, y):
return math.exp(-sum((x - y) * (x - y)) / (2 * self.sigma * self.sigma))
下面是示例,这里带有红色x的样本是支持向量

本文作者:Kalzn
本文链接:http://kalzncc.github.io/2022/12/10/ML-impl/
版权声明:除文章中特别注明外,本站所有文章采用 CC BY 3.0 CN 协议进行许可
即在署明文章作者及来源的情况下,您可以将本文用于包括商业目在内的任何用途。
除此之外,本文不做正确性担保,本人不对产生的问题负责。
×