在没有接触机器学习之前,我就听说过CNN,KNN。本以为这两者是孪生兄弟来着,然后我就打算先了解CNN,谁知智商限制了我的想象,刚开始的我对CNN完成不能理解,导致我对KNN也存在一种畏惧感。
其实KNN是很通俗易懂。
想象你把所有的样本散开在一个空间内。如下图分为两类:白色和橙色。
现在有一个新来的蓝色数据,请问它属于白色类呢?还是橙色类呢?
一般性的,如果蓝色和白色相似性高,那就是白色类,相反地,那就是橙色组。
这里的相似性,可以用距离来衡量。距离越近,那相似性越高。
这是我对KNN的理解,如果有什么不对的,请大家指出。
下面我们用scikit来实现knn分类。
这里的数据来源University of California, Irvine机器学习数据资源
我使用的是很常见的Breast Cancer Data Set
其实scikit learn 里面也有自带这个数据,可以通过
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
步骤一:下载数据
步骤二:给数据加上列名称,因为下载的数据没有列名呢。
id
clump_thickness
unif_cell_size
unif_cell_shape
marg_adhession
single_epith_cell
bare_nuclei
bland_chrom
norm_nucleoli
mitoses
class
步骤三:开始代码之旅
from sklearn import neighbors,cross_validation,preprocessing
import pandas as pd
import numpy as np
#用pandas读取数据
df = pd.read_csv('breast-cancer-wisconsin.data.txt')
#因为有数据缺失的情况,并且是用"?"代替,所以我这里用-99999来替代"?"
df.replace('?',-99999,inplace= True)
#因为id对分类结果没有任务关系,所以这里我删掉了id列
df.drop('id',axis=1,inplace =True)
#将特征放入到X,分类结果放入到y
X = np.array(df.drop('class',axis = 1))
y = np.array(df['class'])
X_train,X_test,y_train,y_test = cross_validation.train_test_split(X,y,test_size = 0.2)
clf = neighbors.KNeighborsClassifier()
clf.fit(X_train,y_train)
#打印出模型的准确率
print(clf.score(X_test,y_test))
步骤四:运行代码
步骤五:使用模型预测分类结果
example = np.array([7,7,7,6,4,10,4,1,2])
example = example.reshape(1,-1)
result= clf.predict(example)
print (result)
感谢scikit,让我们可以直接使用这个黑盒子,但是为了更好地理解KNN,接下来我会分享如何自己从零开始写KNN算法。