首页 > 编程知识 正文

python numpy教程,knn算法应用实例matlab

时间:2023-05-04 09:47:42 阅读:119823 作者:1996

k最近邻(k-Nearest Neighbors,KNN )分类是一种监控性分类方法,首先基于标记的数据训练模型,然后基于模型预测新的数据点,然后标记新的数据点(label ),即数据

一. knn算法逻辑

knn算法的核心思想是,如果一个数据属于特征空间中最相邻的k个数据中大多数属于某一类别,则该样本也属于该类别,具有该类别上样本的特性。 一般而言,针对给定测试样本和基于特定测量距离的方案,从最近的k个训练样本预测当前样本的分类结果。 例如,借用百度的图来说明knn算法的过程,要预测图中Xu的分类结果,首先要预设距离值,只考虑以Xu为中心、以该距离值为半径的圆内已知的训练样本,根据这些样本的投票结果Xu属于w1类别,进行投票

knn算法在分类确定中仅基于一个或多个最近的样本的类别来确定分类对象样本所属的类别。 knn算法在确定类别时只涉及极少量的相邻样本。 knn算法主要依赖周围有限邻域中的样本来确定所属类,而不是判别类域的方法,因此对于具有较多交叉和重叠的类域的被分类样本集,knn方法比其他方法更适合。

1,knn算法的计算步骤

knn算法是根据与分类对象样本a最接近的k个样本数据的分类来预测a可能所属的类,基本的计算步骤如下。

要标准化数据,通常要进行规范化,以避免维对计算距离的影响

计算分类对象数据与训练集各样本间的距离;

找到最接近要分类样本的k个样本;

观测这k个样品的分类情况

将出现次数最多的类别作为分类对象数据的类别。

knn算法的计算步骤很简单,使用knn算法时,必须确定两个问题。 第一个问题是如何计算距离,第二个问题是确定k的值。

2,knn算法如何计算距离?

在计算距离之前,必须将每个数字属性规范化。 这有助于防止较大初始值域的属性比较小初始值域的属性权重过大。

对于数值属性,knn算法利用距离公式计算任意两个样本数据之间的距离。

对于类别等公称属性,knn算法使用比较法,如果两个样本数据相等,则距离为0; 如果两个样本数据不同,则距离为1。

对于缺少的值,通常取最大的差。 假设每个属性都已经映射到[ 0,1 ]区间,对于公称属性,将差值设置为1。 对于数字属性,如果两个元组都缺少值,则将差值设置为1。 如果只缺少一个值,而另一个规范化值为v,则采用1-v和v之间的较大差值。

3,knn算法如何确定k的值?

k的最佳值需要通过实验来确定。 根据k=1,用检验数据集估计分类器的错误率。 重复这个过程,允许每次k增加1时增加一个邻居,并选择产生最小错误率的k。 通常,训练数据集越多,k的值越大,因而分类预测可以基于较大比例的训练数据集。 在应用中,一般选择小k,k为奇数。 通常,适当的k值是通过交叉检查的方法选择的。

二. sklearn中的knn分类函数

要使用KNeighborsClassifier创建k邻居分类器:

klearn.neighbors.kneighborsclassifier (n _ neighbors=5,weights=’uniform’,algorithm=’auto’,leaf_size

p=2,metric=’勤洒糖’,metric_params=None,n_jobs=None,**kwargs )

参数注释:

1,n_neighbors,相邻节点数,默认值为5

2,weights,权重,默认值为统一,

统一:表示各数据点权重相同;

距离两个集群中心越近的点权重越高

callable :表示每个数据点权重的用户定义函数

3,algorithm,算法

自动:根据值选择最佳算法

ball _ tree :使用ball tree

kd_tree:KDTree

brute :在brute-force中搜索

4,p,metric,metric_paras,距离测量

p参数用于设置thdbq距离的功率参数,如果p=1,则等效于manhattan距离。 p=2与euclidean距离等价,p2时为thdbq距离。

公制参数:设定距离的计算方法

metric_paras :传递给计算距离方法的参数

三.观察数据

knn分类是一种监控性分类方法,因此在建立复杂的分类模型之前,首先需要标记的数据集,即训练数据集。 可以从sklearn数据集加载和学习现有数据。

froms klearn.datasetsimportload _ iris

iris_dataset=load_iris (

显示iris_dataset的数据、该对象的结构和词典

非常类型:

>>>iris_dataset.keys()

dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])

1,样本数据

data 是样本数据,共4列150行,列名是由feature_names来确定的,每一列都叫做矩阵的一个特征(属性),前4行的数据是:

>>> iris_dataset.data[0:4]

array([[5.1, 3.5, 1.4, 0.2],

[4.9, 3. , 1.4, 0.2],

[4.7, 3.2, 1.3, 0.2],

[4.6, 3.1, 1.5, 0.2]])

2,标签

target是标签,用数字表示,target_names是标签的文本表示

>>> iris_dataset.target[0:4]

array([0, 0, 0, 0])>>>iris_dataset.target_names

array(['setosa', 'versicolor', 'virginica'], dtype='

3,查看数据的散点图

查看数据的散点图矩阵,按照数据的类别进行着色,观察数据的分布:

importpandas as pdimportmglearn

iris_df=pd.DataFrame(x_train,columns=iris_dataset.feature_names)

pd.plotting.scatter_matrix(iris_df,c=y_train,figsize=(15,15),marker='o',hist_kwds={'bins':20}

,s=60,alpha=.8,cmap=mglearn.cm3)

四,创建模型

我们使用sklearn数据集中的鸢尾花测量数据来构建一个复杂的分类模型,并根据输入的数据点来预测鸢尾花的类别。

1,拆分数据

把鸢尾花数据拆分为训练集和测试集:

from sklearn.model_selection importtrain_test_splitx_train,x_test,y_train,y_test=train_test_split(iris_dataset['data'],iris_dataset['target'],random_state=0)

使用函数把已标记的数据拆分成训练集和测试集:

sklearn.model_selection.train_test_split(*arrays, test_size ,train_size ,random_state ,shuffle ,stratify )

函数的参数注释:

test_size:拆分的测试集数据所占的百分比,如果test_size和train_size都是none,那么默认值是test_size=0.25

train_size:拆分的训练集数据所占的百分比,

random_state:如果是int,那么参数用于指定随机数产生的种子;如果是None,使用np.random作为随机数产生器

shuffle:布尔值,默认值是True,表示在拆分之前对数据进行洗牌;如果shuffle = False,则分层必须为None。

stratify:如果不是None,则数据以分层方式拆分,使用此作为类标签。

2,创建分类器

使用KNeighborsClassifier创建分类器,设置参数n_neighbors为1:

from sklearn.neighbors importKNeighborsClassifier

knn= KNeighborsClassifier(n_neighbors=1)

3,使用训练集来构建模型

对于监督学习,训练数据集包括两部分:输入和结果(Lable),每一行输入都对应一行结果,结果是输入的正确分类(标签)。

通常,记X_train是训练的输入数据集,X_train对应的结果是y_train,是训练数据集的输出,通过fit()函数来训练模型,构建模型:

knn.fit(x_train, y_train)

4,预测新数据

对于训练之后的模型,使用predict()函数来预测数据的结果。

x_new=np.array([[5, 2.9, 1, 0.2]])

prediction=knn.predict(x_new)print("prediction :{0} ,classifier:{1}".format(prediction,iris_dataset["target_names"][prediction]))

五,模型评估

knn分类有2个重要的参数:邻居个数和数据点之间距离的度量方法。在实践中,使用较小的奇数个邻居,比如,3和5,往往可以得到比较好的结果,但是,这是经验之谈,你应该根据数据来调节这个参数。

1,模型的正确率

在使用模型之前,应该使用测试集来评估模型,所谓模型的正确率,就是使用已标记的数据,根据数据预测的结果和标记的结果进行比对,计算比对成功的占比:

assess_model_socre=knn.score(x_test,y_test)print('Test set score:{:2f}'.format(assess_model_socre))

使用模型的score()函数,使用测试集进行评分,分数越高,模型越好。

2,邻居个数

如何确定邻居的个数,下面使用枚举法,逐个测试邻居的个数,并根据模型的score()函数查看模型的正确率。

importmglearn

importmatplotlib.pyplot as plt

from sklearn.datasets importload_breast_cancer

from sklearn.model_selection importtrain_test_split

from sklearn.neighbors importKNeighborsClassifier

cancer=load_breast_cancer()

x_train,x_test,y_train,y_test=train_test_split(cancer.data,cancer.target,random_state=66)

training_accuracy=[]

test_accuracy=[]

neighbors_settings=range(1,11)

for n_neighbors inneighbors_settings:

knn=KNeighborsClassifier(n_neighbors)

knn.fit(x_train,y_train)

training_accuracy.append(knn.score(x_train,y_train))

test_accuracy.append(knn.score(x_test,y_test))

plt.plot(neighbors_settings,training_accuracy,label='Training Accuracy')

plt.plot(neighbors_settings,test_accuracy,label='Test Accuracy')

plt.ylabel('Accuracy')

plt.xlabel('n_neighbors')

plt.legend()

3,距离选择

数据点之间的距离,计算距离的方法有:"euclidean"(从容的招牌距离),”勤恳的跳跳糖”(土豪的橘子距离), "maximum"(jddmn距离), "manhattan"(绝对值距离),"canberra"(兰式距离), 或 "勤恳的跳跳糖"(优美的帽子距离)等。

4,预测结果的确信概率

查看分类的不确定度估计,使用模型的predict_prob()函数来查看模型预测的概率。

参考文档:

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。