python3机器学习经典算法与应用之scikit-learn中的机器学习算法封装

python机器学习算法应用

    • KNN算法封装

KNN算法封装

断言——assert()函数: Python的断言就是检测一个条件,如果条件为真,它什么都不做;反之它触发一个带可选错误信息的AssertionError。

KNN算法

import numpy as np
from math import sqrt
from collections import Counter
#KNN算法
#k->k邻近算法的选择数  X_train->训练集特征集  Y_train->训练集标签  x->新数据
def KNN_classify(k,X_train,Y_train,x):
    assert 1 <= k <= X_train.shape[0],"k must be vaild" #K必须大于等于0,并且小于等于记录数
    # 数据集的行数和标签的行数必须相等
    assert X_train.shape[0] == Y_train.shape[0],"the size of X_train must equal to the size of Y_train"
    # 新数据x的特征数量必须和训练集数据的特征数量相同
    assert X_train.shape[1] == x.shape[0], "the feature number of x must be equal to X_train"

    distances = [sqrt(np.sum((x_train-x)**2)) for x_train in X_train]
    nearest = np.argsort(distances)
    topK_y = [Y_train[i] for i in nearest[:k]]
    votes = Counter(topK_y)
    return votes.most_common(1)[0][0]

可以近乎理解为KNN算法是一个不需要训练过程的算法。也可以认为训练集数据本身就是KNN算法的模型。

使用scikit-learn算法中的kNN

  1. 首先导入KNeighborsClassifier
  2. 创建分类器对象
  3. 使用分类器对象对训练数据进行拟合(fit()函数)
  4. 使用分类器对象对新数据进行预测(predict()函数)

python3机器学习经典算法与应用之scikit-learn中的机器学习算法封装_第1张图片

from sklearn.neighbors import KNeighborsClassifier
kNN_classifier = KNeighborsClassifier(n_neighbors=6) #n_neighbors就是k
X_train = np.random.random(size=(10,2))*10
Y_train = [0,0,0,0,0,1,1,1,1,1]
x = np.random.random((1,2))*10 #注意这里x是二维矩阵
kNN_classifier.fit(X_train,Y_train)   #返回值为KNeighborsClassifier对象(进行拟合)
y_predict = kNN_classifier.predict(x)
y_predict[0]

最终结果:

1

使用pycharm封装

import numpy as np
from math import sqrt
from collections import Counter
#KNN算法
#k->k邻近算法的选择数  X_train->训练集特征集  Y_train->训练集标签  x->新数据
class KNNClassifier:
    def __init__(self,k):
        """初始化KNN分类器"""
        assert k>=1,"k must be valid"
        self.k = k;
        self._x_train = None
        self._y_train = None

    def fit(self,x_train,y_train):
        """根据训练数据集x_train和y_train训练KNN分类器"""
        #样本数等于标签数
        assert x_train.shape[0] == y_train.shape[0], "the size of X_train must equal to the size of Y_train."
        #k小于等于样本数
        assert self.k <= x_train.shape[0] ,"the size of x_train must be at least k."
        self._x_train = x_train
        self._y_train = y_train
        return self

    def predict(self,x_predict):  #x_predict是一个预测数据集,二维数组
        """给定待预测数据集x_predict,返回表示x_predict的结果向量"""
        assert self._x_train is not None and self._y_train is not None,"must fit before predict!"
        #训练集的特征数等于待预测数据集的特征数
        assert x_predict.shape[1] == self._x_train.shape[1],"the feature number of x_predict must be equal to x_tarin"
        y_predict = [self._predict(x) for x in x_predict]
        return np.array(y_predict)

    def _predict(self,x):
        """给定单个待遇测数据x,返回x_predict的预测结果值"""
        #预测数据的特征数等于训练集的特征数(此时x是一维数组)
        assert x.shape[0]==self._x_train.shape[1],"the feature number of x must be equal to x_tarin"
        distance = [sqrt(np.sum(x_train - x) ** 2) for x_train in self._x_train]
        nearest = np.argsort(distance)
        topK_y = [self._y_train[i] for i in nearest[:self.k]]
        votes = Counter(topK_y)
        return votes.most_common(1)[0][0]  #只取排名前1个的第一个列表的键(预测标签)

    # Python有一个内置的函数叫repr,它能把一个对象用字符串的形式表达出来以便辨认,
    # 这就是“字符串表示形式”。repr就是通过repr这个特殊方法来得到一个对象的字符串表示形式的。
    #在老的使用% 符号的字符串格式中,这个函数返回的结果用来代替 %r 所代表的对象
    #相当于java中Object类的toString()方法
    def __repr__(self):
        return "KNN(k = %d)" % self.k

if "__main__" == __name__:
    X_train = np.random.random(size=(10, 2)) * 10
    print("----------x_train----------")
    print(X_train)
    Y_train = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1])
    print("----------y_train----------")
    print(Y_train)
    print("----------x----------")
    x = np.random.random((1, 2)) * 10
    print(x)
    knn_clf  = KNNClassifier(k=6)
    knn_clf.fit(X_train,Y_train)
    y_predict = knn_clf.predict(x)
    print("----------the result of predict----------")
    print(y_predict)

python3机器学习经典算法与应用之scikit-learn中的机器学习算法封装_第2张图片
预测结果显示,模型预测x的标签为0.

你可能感兴趣的:(Machine,Learning,KNN,k邻近算法,python)