KNN--K近邻算法

在二维平面上,分别定义中心点(均值)和离散程度(方差)不同,且符合正态分布的两个集合(5000个离散点),利用K-近邻算法进行分类。

设两个集合的中心点分别为p0和p1表示二元组,方差分别为v0和v1(开方得到标准差),借助于numpy的随机化抽样子模块random很容易得到两个集合,合并为一个样本集。与之对应的标签集也不难制作。之后按10%的比例抽取测试集,其余作为训练集(事实上,k-近邻分类无需训练,训练集仅作为经验数据)。演示代码如下。

>>> import numpy as np
>>> from sklearn.neighbors import KNeighborsClassifier # 导入K-近邻分类器
>>> from sklearn.model_selection import train_test_split as tsplit
>>> p0, p1 = (-1,-1), (1,1)
>>> v0, v1 = 0.8, 1.2
>>> xs_0 = np.random.normal(loc=p0[0], scale=pow(v0,0.5), size=5000)
>>> ys_0 = np.random.normal(loc=p0[1], scale=pow(v0,0.5), size=5000)
>>> label_0 = np.zeros(5000, dtype=np.int32)
>>> xs_1 = np.random.normal(loc=p1[0], scale=pow(v1,0.5), size=5000)
>>> ys_1 = np.random.normal(loc=p1[1], scale=pow(v1,0.5), size=5000)
>>> label_1 = np.ones(5000, dtype=np.int32)
>>> X = np.vstack((np.stack((xs_0, ys_0), axis=1), np.stack((xs_1, ys_1), axis=1)))
>>> y = np.hstack((label_0, label_0))
>>> X.shape, y.shape
((10000, 2), (10000,))
>>> X_train, X_test, y_train, y_test = tsplit(X, y, test_size=0.1) # 拆分
>>> m = KNeighborsClassifier() # 实例化模型。n_neighbors参数指定k值,默认k=5
>>> m.fit(X_train, y_train) # 模型训练
KNeighborsClassifier()
>>> score = m.score(X_test, y_test) # 模型测试精度(介于0~1之间)
>>> score
1.0

 

两个集合距离远,方差小,没有重合区域,所以测试结果100%正确。题主可以选择不同的中心点和方差,让数据点适度重合,就可以看到模型精度不会是100%。

使用sklearn可以完成