网站域名购买后能修改吗,自己做的网站只能用谷歌浏览器打开,百度主页入口,西安网站建设案例k-近邻算法采用测量不同特征值之间的距离来进行分类优点#xff1a;精度高、对异常值不敏感、无数据输入假定缺点#xff1a;计算复杂度高、空间复杂度高使用数据范围#xff1a;数值型和标称型一个例子弄懂k-近邻
电影可以按照题材分类#xff0c;每个题材又是如何定义的呢…k-近邻算法采用测量不同特征值之间的距离来进行分类
优点精度高、对异常值不敏感、无数据输入假定缺点计算复杂度高、空间复杂度高使用数据范围数值型和标称型一个例子弄懂k-近邻
电影可以按照题材分类每个题材又是如何定义的呢那么假如两种类型的电影动作片和爱情片。动作片有哪些公共的特征那么爱情片又存在哪些明显的差别呢我们发现动作片中打斗镜头的次数较多而爱情片中接吻镜头相对更多。当然动作片中也有一些接吻镜头爱情片中也会有一些打斗镜头。所以不能单纯通过是否存在打斗镜头或者接吻镜头来判断影片的类别。那么现在我们有6部影片已经明确了类别也有打斗镜头和接吻镜头的次数还有一部电影类型未知。
电影名称打斗镜头接吻镜头电影类型California Man3104爱情片Hes not Really into dues2100爱情片Beautiful Woman181爱情片Kevin Longblade10110动作片Robo Slayer 3000995动作片Amped II982动作片?1890未知
那么我们使用K-近邻算法来分类爱情片和动作片存在一个样本数据集合也叫训练样本集样本个数M个知道每一个数据特征与类别对应关系然后存在未知类型数据集合1个那么我们要选择一个测试样本数据中与训练样本中M个的距离排序过后选出最近的K个这个取值一般不大于20个。选择K个最相近数据中次数最多的分类。那么我们根据这个原则去判断未知电影的分类
电影名称与未知电影的距离California Man20.5Hes not Really into dues18.7Beautiful Woman19.2Kevin Longblade115.3Robo Slayer 3000117.4Amped II118.9
我们假设K为3那么排名前三个电影的类型都是爱情片所以我们判定这个未知电影也是一个爱情片。那么计算距离是怎样计算的呢
欧氏距离那么对于两个向量点$$a{1}$$和$$a{2}$$之间的距离,可以通过该公式表示
$$\sqrt{\left({x{1}-x{2}}\right)^{2}\left({y{1}-y{2}}\right)^{2}}$$
如果说输入变量有四个特征例如1352和7694之间的距离计算为
$$\sqrt{\left({1-7}\right)^{2}\left({3-6}\right)^{2}\left({5-9}\right)^{2}\left({2-4}\right)^{2}}$$
sklearn.neighbors
sklearn.neighbors提供监督的基于邻居的学习方法的功能sklearn.neighbors.KNeighborsClassifier是一个最近邻居分类器。那么KNeighborsClassifier是一个类我们看一下实例化时候的参数
class sklearn.neighbors.KNeighborsClassifier(n_neighbors5, weightsuniform, algorithmauto, leaf_size30, p2, metricminkowski, metric_paramsNone, n_jobs1, **kwargs)**:param n_neighborsint可选默认 5k_neighbors查询默认使用的邻居数:param algorithm{autoball_treekd_treebrute}可选用于计算最近邻居的算法ball_tree将会使用 BallTreekd_tree将使用 KDTree“野兽”将使用强力搜索。auto将尝试根据传递给fit方法的值来决定最合适的算法。:param n_jobsint可选默认 1),用于邻居搜索的并行作业数。如果-1则将作业数设置为CPU内核数。不影响fit方法。import numpy as np
from sklearn.neighbors import KNeighborsClassifierneigh KNeighborsClassifier(n_neighbors3)Method
fit(X, y)
使用X作为训练数据拟合模型y作为X的类别值。Xy为数组或者矩阵
X np.array([[1,1],[1,1.1],[0,0],[0,0.1]])
y np.array([1,1,0,0])
neigh.fit(X,y)kneighbors(XNone, n_neighborsNone, return_distanceTrue)
找到指定点集X的n_neighbors个邻居return_distance为False的话不返回距离
neigh.kneighbors(np.array([[1.1,1.1]]),return_distance False)neigh.kneighbors(np.array([[1.1,1.1]]),return_distance False,an_neighbors2)predict(X)
预测提供的数据的类标签
neigh.predict(np.array([[0.1,0.1],[1.1,1.1]]))predict_proba(X)
返回测试数据X属于某一类别的概率估计
neigh.predict_proba(np.array([[1.1,1.1]]))本案例使用最著名的”鸢尾“数据集
该数据集曾经被Fisher用在经典论文中目前作为教科书般的数据样本预存在Scikit-learn的工具包中。
读入Iris数据集细节资料
from sklearn.datasets import load_iris
# 使用加载器读取数据并且存入变量iris
iris load_iris()# 查验数据规模
iris.data.shape# 查看数据说明这是一个好习惯
print iris.DESCR通过上述代码对数据的查验以及数据本身的描述我们了解到Iris数据集共有150朵鸢尾数据样本并且均匀分布在3个不同的亚种每个数据样本有总共4个不同的关于花瓣、花萼的形状特征所描述。由于没有制定的测试集合因此按照惯例我们需要对数据进行随即分割25%的样本用于测试其余75%的样本用于模型的训练。
由于不清楚数据集的排列是否随机可能会有按照类别去进行依次排列这样训练样本的不均衡的所以我们需要分割数据已经默认有随机采样的功能。
对Iris数据集进行分割
from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test train_test_split(iris.data,iris.target,test_size0.25,random_state42)对特征数据进行标准化
from sklearn.preprocessing import StandardScalerss StandardScaler()
X_train ss.fit_transform(X_train)
X_test ss.fit_transform(X_test)K近邻算法是非常直观的机器学习模型我们可以发现K近邻算法没有参数训练过程也就是说我们没有通过任何学习算法分析训练数据而只是根据测试样本训练数据的分布直接作出分类决策。因此K近邻属于无参数模型中非常简单一种。
from sklearn.datasets import load_iris
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import GridSearchCVdef knniris():鸢尾花分类:return: None# 数据集获取和分割lr load_iris()x_train, x_test, y_train, y_test train_test_split(lr.data, lr.target, test_size0.25)# 进行标准化std StandardScaler()x_train std.fit_transform(x_train)x_test std.transform(x_test)# estimator流程knn KNeighborsClassifier()# # 得出模型# knn.fit(x_train,y_train)## # 进行预测或者得出精度# y_predict knn.predict(x_test)## # score knn.score(x_test,y_test)# 通过网格搜索,n_neighbors为参数列表param {n_neighbors: [3, 5, 7]}gs GridSearchCV(knn, param_gridparam, cv10)# 建立模型gs.fit(x_train,y_train)# print(gs)# 预测数据print(gs.score(x_test,y_test))# 分类模型的精确率和召回率# print(每个类别的精确率与召回率,classification_report(y_test, y_predict,target_nameslr.target_names))return Noneif __name__ __main__:knniris()