SMOTE算法原理及Python代码实现
文章目录
预备知识
- 向量代数的知识:对于点 x 1 \mathbf{x}_1 x1和 x 2 \mathbf{x}_2 x2,如果 λ ∈ [ 0 , 1 ] \lambda \in [0,1] λ∈[0,1], λ x 1 + ( 1 − λ ) x 2 \lambda \mathbf{x}_1 + (1-\lambda) \mathbf{x}_2 λx1+(1−λ)x2肯定在点 x 1 \mathbf{x}_1 x1和 x 2 \mathbf{x}_2 x2的连线上。
2. 面向对象的设计思想就是抽象出一个类(Class),用的时候对类具体化成实例(Instance)。
-
类和实例
首先,尝试创建一个Student类,代码如下:
class Student(object): def __init__(self, name, score): self.name = name self.score = score
说明:
class
:定义类的关键字,创建类必须先写上;Student
:类名,根据需要填写,类名首字母通常大写;(object)
:表示该类是从哪个类继承来的,如果没有合适的继承类,就使用object
类,这是所有类最终都会继承的类。__init__
:类的一个特殊方法,创建实例时,会强制填写我们定义的属性,这里定义的属性是name
和score
。注意
__init__
前后分别有两个下划线。另外,
__init__
的第一个参数永远是self
,表示创建的实例本身。因此,在__init__
方法内部,就可以把各种属性绑定到self
,因为self
就指向创建的实例本身。定义好了
Student
类,就可以根据Student
类创建出Student
的实例,创建实例通过类名+()实现:bart = Student('Bart Simpson', 59) print(bart.name) print(bart.score)
结果如下:
Bart Simpson 59
-
访问限制
Class内部有属性(数据)和方法(函数),外部代码可以直接调用实例变量的方法来操作数据,这样就隐藏了内部的复杂逻辑。
class Student(object): def __init__(self, name, score): self.name = name self.score = score def lost_points(self): return 100 - self.score def print_score(self): print(' name : %s \n score : %s \n lost points : %s ' % (self.name, self.score, self.lost_points()))
上面的代码创建了lost_points方法用于计算失分、print_score方法来输出结果,用以下代码测试效果:
bart = Student('Bart Simpson', 59) bart.score = 99 print(bart.lost_points()) bart.print_score()
结果如下:
1 name : Bart Simpson score : 99 lost points : 1
但是,外部代码可以自由地修改实例的属性
name
和score
,为了不让外部访问内部属性,可以在属性名称前加上两个下划线__
,使其变成私有变量(private),只有内部可以访问,外部无法访问。class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def lost_points(self): return 100 - self.__score def print_score(self): print('name : %s \nscore : %s \nlost points : %s ' % (self.__name, self.__score, self.lost_points()))
bart = Student('Bart Simpson', 59) print(bart.__score)
结果报错:
AttributeError: 'Student' object has no attribute '__score'
两个下划线
__
设置私有对方法(函数)同样有效,将lost_points设置为私有:class Student(object): def __init__(self, name, score): self.__name = name self.__score = score def __lost_points(self): return 100 - self.__score def print_score(self): print('name : %s \nscore : %s \nlost points : %s ' % (self.__name, self.__score, self.__lost_points()))
测试代码:
bart = Student