侵权投诉

认真读完这21句话你的机器学习就算是入门了

新机器视觉 2021-07-06 17:42 次阅读

【编者按】这是一篇关于机器学习工具包Scikit-learn的入门级读物。对于程序员来说,机器学习的重要性毋庸赘言。也许你还没有开始,也许曾经失败过,都没有关系,你将在这里找到或者重拾自信。只要粗通Python,略知NumPy,认真读完这21句话,逐行敲完示例代码,就可以由此进入自由的王国。

1机器学习有四种用途:分类、聚类、回归和降维。

理解了这句话,就意味着学会了机器学习。迷茫的时候,在心里默念这句话,就会找到前进的方向。更严格一点,计算器学习的目的只有三个:分类、聚类和回归,降维不过是达成目标的手段之一。

2

分类和聚类都是对个体样本归类,看起来很相似,实则相去甚远——前者属于有监督的学习,后者属于无监督的学习。

分类是基于经验的,而经验来自过往的数据,这意味着分类需要训练;聚类则是基于当前全部样本的特征,不依赖经验,自然也就无需训练。举个例子:让你从一堆水果中挑出苹果、橘子和香蕉,这是分类;让你将画在纸上的若干个图案分组,分组规则由你决定,这是聚类。

3

从字面上看,分类和回归看上去风马牛不相及,其实二者是亲兄弟,使用的算法几乎完全重合。

分类是对个体样本做出定性判定,回归是对个体样本做出定量判定,二者同属于有监督的学习,都是基于经验的。举个例子:有经验的老师预测某学生考试及格或不及格,这是分类;预测某学生能考多少分,这是回归;不管是预测是否及格还是预测考多少分,老师的经验数据和思考方法是相同的,只是最后的表述不同而已。

4

传统的软件开发,代码是重点,而对于机器学习,数据是重点。

在训练机器学习模型时,数据的质量和数量都会影响训练结果的准确性和有效性。因此,无论是学习还是应用机器学习模型解决问题,前提都是要有足够多且足够好的数据集。

5

数据集通常是指由若干个样本数据组成的二维数组,数组的每一行表示一个样本的数据。

举个例子:用性别、年龄、身高(米)、体重(千克)、职业、年薪(万元)、不动产(万元)、有价证券(万元)等信息组成的一维数组表示一位征婚者的数据,下面的二维数组就是一个婚介机构收集到的征婚者数据集。

》》》 import numpy as np》》》 members = np.array([ [‘男’, ‘25’, 185, 80, ‘程序员’, 35, 200, 30], [‘女’, ‘23’, 170, 55, ‘公务员’, 15, 0, 80], [‘男’, ‘30’, 180, 82, ‘律师’, 60, 260, 300], [‘女’, ‘27’, 168, 52, ‘记者’, 20, 180, 150]])

6

数据集的列,也被成为特征维或特征列。

上面的征婚者数据集共有性别、年龄、身高(米)、体重(千克)、职业、年薪(万元)、不动产(万元)、有价证券(万元)等8列,也可以说这个数据集有8个特征维或特征列。

7

所谓降维,并非是将数据集从二维变成一维,而是减少数据集的特征维。

征婚者的个人信息远不止上面所列出的这8项,还可以加上生日、业余爱好、喜欢的颜色、爱吃的食物等等。不过,要是将所有的个人信息都加入到数据集中,不但会增加数据保存和处理的难度和成本,对于择偶者来说,也会因为信息量太多而分散了注意力,以至于忽略了最重要的信息。降维就是从数据集中剔除对结果无影响或影响甚微的特征列。

8

标准化是对样本集的每个特征列减去该特征列的平均值进行中心化,再除以标准差进行缩放。

满分为100分的考试中,你如果得了90分,这自然是一个好成绩。不过要是和其他同学比的话,就未必是了:假如其他同学都是满分,那90分就是最差的一个。数据标准化的意义在于反映个体数据偏离所有样本平均值的程度。下面是对征婚者数据集中有价证券特征列标准化后的结果。

》》》 security = np.float32((members[:,-1])) # 提取有价证券特征列数据》》》 securityarray([ 30., 80., 300., 150.], dtype=float32)》》》 (security - security.mean())/security.std() # 减去均值再除以标准差array([-1.081241, -0.5897678, 1.5727142, 0.09829464], dtype=float32)

9

归一化是对样本集的每个特征列减去该特征列的最小值进行中心化,再除以极差(最大值最小值之差)进行缩放。

归一化处理类似于标准化,结果收敛于[0,1]区间内。下面是对征婚者数据集中有价证券特征列归一化后的结果。

》》》 security = np.float32((members[:,-1])) # 提取有价证券特征列数据》》》 securityarray([ 30., 80., 300., 150.], dtype=float32)》》》 (security - security.min())/(security.max() - security.min()) # 减去最小值再除以极差array([0., 0.18518518, 1., 0.44444445], dtype=float32)

10

机器学习模型只能处理数值数据,因此需要将性别、职业等非数值数据变成整数,这个过程被称为特征编码。

征婚者数据集中,对于性别特征列,可以用0表示女性,用1表示男性,或者反过来也没有问题。不过这个方法不适用于职业特征列的编码,因为不同职业之间原本是无序的,如果用这个方法编码,就会产生2比1更接近3的问题。此时通行的做法是使用独热码(one-of-K):若有n个不同的职业,就用n位二进制数字表示,每个数字只有1位为1其余为0。此时,职业特征列将从1个扩展为n个。下面使用Scikit-learn的独热码编码器对性别和职业两列做特征编码,生成6个特征列(性别2列,职业4列)。该编码器位于preprocessing子模块中。

》》》 from sklearn import preprocessing as pp》》》 X = [ [‘男’, ‘程序员’], [‘女’, ‘公务员’], [‘男’, ‘律师’, ], [‘女’, ‘记者’, ]]》》》 ohe = pp.OneHotEncoder().fit(X)》》》 ohe.transform(X).toarray()array([[0., 1., 0., 0., 1., 0.], [1., 0., 1., 0., 0., 0.], [0., 1., 0., 1., 0., 0.], [1., 0., 0., 0., 0., 1.]])

11

Scikit-learn的数据集子模块datasets提供了若干数据集:函数名以load 开头的是模块内置的小型数据集;函数名以fetch开头,是需要从外部数据源下载的大型数据集。

datasets.load_boston([return_X_y]) :加载波士顿房价数据集

datasets.load_breast_cancer([return_X_y]) :加载威斯康星州乳腺癌数据集

datasets.load_diabetes([return_X_y]) :加载糖尿病数据集

datasets.load_digits([n_class, return_X_y]) :加载数字数据集

datasets.load_iris([return_X_y]) :加载鸢尾花数据集。

datasets.load_linnerud([return_X_y]) :加载体能训练数据集

datasets.load_wine([return_X_y]) :加载葡萄酒数据集

datasets.fetch_20newsgroups([data_home, …]) :加载新闻文本分类数据集

datasets.fetch_20newsgroups_vectorized([…]) :加载新闻文本向量化数据集

datasets.fetch_california_housing([…]) :加载加利福尼亚住房数据集

datasets.fetch_covtype([data_home, …]) :加载森林植被数据集

datasets.fetch_kddcup99([subset, data_home, …]) :加载网络入侵检测数据集

datasets.fetch_lfw_pairs([subset, …]) :加载人脸(成对)数据集

datasets.fetch_lfw_people([data_home, …]) :加载人脸(带标签)数据集

datasets.fetch_olivetti_faces([data_home, …]) :加载 Olivetti 人脸数据集

datasets.fetch_rcv1([data_home, subset, …]):加载路透社英文新闻文本分类数据集

datasets.fetch_species_distributions([…]) :加载物种分布数据集

12

每个二维的数据集对应着一个一维的标签集,用于标识每个样本的所属类别或属性值。通常数据集用大写字母X表示,标签集用小写字母y表示。

下面的代码从数据集子模块datasets中提取了鸢尾花数据集——这是用来演示分类模型的最常用的数据集。鸢尾花数据集X共有150个样本,每个样本有4个特征列,分别使花萼的长度和宽度、花瓣的长度和宽度。这些样本共有3种类型,分别用整数0、1、2表示,所有样本的类型标签组成标签集y,这是一个一维数组。

》》》 from sklearn.datasets import load_iris》》》 X, y = load_iris(return_X_y=True)》》》 X.shape # 数据集X有150个样本,4个特征列(150, 4)》》》 y.shape # 标签集y的每一个标签和数据集X的每一个样本一一对应(150,)》》》 X[0], y[0](array([5.1, 3.5, 1.4, 0.2]), 0)

加载数据时,如果指定return_X_y参数为False(默认值),则可以查看标签的名字。

》》》 iris = load_iris()》》》 iris.target_names # 查看标签的名字array([‘setosa’, ‘versicolor’, ‘virginica’], dtype=‘《U10’)》》》 X = iris.data》》》 y = iris.target

13

模型训练时,通常会将数据集和标签集分成两部分:一部分用于训练,一部分用于测试

分割数据集是一项非常重要的工作,不同的分割方法对于模型训练的结果有不同的影响。Scikit-learn提供了很多种数据集分割方法,train_test_split是其中最简单的一种,可以根据指定的比例随机抽取测试集。train_test_split函数位于模型选择子模块model_selection中。

》》》 from sklearn.datasets import load_iris》》》 from sklearn.model_selection import train_test_split as tsplit》》》 X, y = load_iris(return_X_y=True)》》》 X_train, X_test, y_train, y_test = tsplit(X, y, test_size=0.1)》》》 X_train.shape, X_test.shape((135, 4), (15, 4))》》》 y_train.shape, y_test.shape((135,), (15,))

上面的代码按照10%的比例随机从数据集中抽取样本作为测试集,剩余样本作为训练集。分割完成后,训练集有135个样本,测试集有15个样本。

14

近朱者赤,近墨者黑,距离谁最近,就和谁同类——这就是k-近邻分类。

k-近邻分类是最简单、最容易的分类方法。对于待分类的样本,从训练集中找出k个和它距离最近的样本,考察这些样本中哪一个标签最多,就给待分类样本贴上该标签。k值的最佳选择高度依赖数据,较大的k值会抑制噪声的影响,但同时也会使分类界限不明显。通常k值选择不大于20的整数。

》》》 from sklearn.datasets import load_iris》》》 from sklearn.model_selection import train_test_split as tsplit》》》 from sklearn.neighbors import KNeighborsClassifier # 导入k-近邻分类模型》》》 X, y = load_iris(return_X_y=True) # 获取鸢尾花数据集,返回样本集和标签集》》》 X_train, X_test, y_train, y_test = tsplit(X, y, test_size=0.1) # 拆分为训练集和测试集》》》 m = KNeighborsClassifier(n_neighbors=10) # 模型实例化,n_neighbors参数指定k值,默认k=5》》》 m.fit(X_train, y_train) # 模型训练KNeighborsClassifier()》》》 m.predict(X_test) # 对测试集分类array([2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 0, 1, 0, 0, 2])》》》 y_test # 这是实际的分类情况,上面的预测只错了一个array([2, 1, 2, 2, 2, 2, 1, 2, 2, 1, 0, 1, 0, 0, 2])》》》 m.score(X_test, y_test) # 模型测试精度(介于0~1)0.9333333333333333

应用分类模型对15个测试样本分类,结果只有1个是错误的,准确率约为93%。在分类算法中,score是最常用的评估函数,返回分类正确的样本数与测试样本总数之比。

15

一辆开了八年的大切诺基可以卖多少钱?最简单的方法是参考k辆同款车型且使用年限相近的二手车售价的均值——这就是k-近邻回归。

k-近邻算法不仅可以用来解决分类问题,也可以用来解决回归问题。k-近邻回归预测样本的标签由它最近邻标签的均值计算而来。下面的代码以波士顿房价数据集为例,演示了k-近邻回归模型的用法。波士顿房价数据集统计的是20世纪70年代中期波士顿郊区房价的中位数,一共有506条不同的数据,每条数据包含区域的人文环境、自然环境、商业环境、交通状况等13个属性,标签是区域房价的平均值。

》》》 from sklearn.datasets import load_boston》》》 from sklearn.model_selection import train_test_split as tsplit》》》 from sklearn.neighbors import KNeighborsRegressor》》》 X, y = load_boston(return_X_y=True) # 加载波士顿房价数据集》》》 X.shape, y.shape, y.dtype # 该数据集共有506个样本,13个特征列,标签集为浮点型,适用于回归模型((506, 13), (506,), dtype(‘float64’))》》》 X_train, X_test, y_train, y_test = tsplit(X, y, test_size=0.01) # 拆分为训练集和测试集》》》 m = KNeighborsRegressor(n_neighbors=10) # 模型实例化,n_neighbors参数指定k值,默认k=5》》》 m.fit(X_train, y_train) # 模型训练KNeighborsRegressor(n_neighbors=10)》》》 m.predict(X_test) # 预测6个测试样本的房价array([27.15, 31.97, 12.68, 28.52, 20.59, 21.47])》》》 y_test # 这是测试样本的实际价格,除了第2个(索引为1)样本偏差较大,其他样本偏差还算差强人意array([29.1, 50. , 12.7, 22.8, 20.4, 21.5])

16

常用的回归模型的评价方法有均方误差、中位数绝对误差和复相关系数等。

评价一个回归结果的优劣,比评价一个分类结果要困难得多——前者需要考虑偏离程度,而后者只考虑对错。常用的回归评价函数是均方误差函数、中位数绝对误差函数和复相关系数函数等,这几个函数均被包含在模型评估指标子模块metrics中。均方误差和中位数绝对误差越小,说明模型精确度越高;复相关系数则相反,越接近1说明模型精确度越高,越接近0说明模型越不可用。

以上一段代码为例,模型评估结果如下。

》》》 from sklearn import metrics》》》 y_pred = m.predict(X_test)》》》 metrics.mean_squared_error(y_test, y_pred) # 均方误差60.27319999999995》》》 metrics.median_absolute_error(y_test, y_pred) # 中位数绝对误差1.0700000000000003》》》 metrics.r2_score(y_test, y_pred) # 复相关系数0.5612816401629652

复相关系数只有0.56,显然,用k-近邻算法预测波士顿房价不是一个好的选择。下面的代码尝试用决策树算法预测波士顿房价,得到了较好的效果,复相关系数达到0.98,预测房价非常接近实际价格,误差极小。

》》》 from sklearn.datasets import load_boston》》》 from sklearn.model_selection import train_test_split as tsplit》》》 from sklearn.tree import DecisionTreeRegressor》》》 X, y = load_boston(return_X_y=True) # 加载波士顿房价数据集》》》 X_train, X_test, y_train, y_test = tsplit(X, y, test_size=0.01) # 拆分为训练集和测试集》》》 m = DecisionTreeRegressor(max_depth=10) # 实例化模型,决策树深度为10》》》 m.fit(X, y) # 训练DecisionTreeRegressor(max_depth=10)》》》 y_pred = m.predict(X_test) # 预测》》》 y_test # 这是测试样本的实际价格,除了第2个(索引为1)样本偏差略大,其他样本偏差较小array([20.4, 21.9, 13.8, 22.4, 13.1, 7. ])》》》 y_pred # 这是6个测试样本的预测房价,非常接近实际价格array([20.14, 22.33, 14.34, 22.4, 14.62, 7. ])》》》 metrics.r2_score(y_test, y_pred) # 复相关系数0.9848774474870712》》》 metrics.mean_squared_error(y_test, y_pred) # 均方误差0.4744784865112032》》》 metrics.median_absolute_error(y_test, y_pred) # 中位数绝对误差0.3462962962962983

17

决策树、支持向量机(SVM)、贝叶斯等算法,既可以解决分类问题,也可以解决回归问题。

应用这些算法解决分类和回归问题的流程,与使用k-近邻算法基本相同,不同之处在于不同的算法提供了不同的参数。我们需要仔细阅读算法文档,搞清楚这些参数的含义,选择正确的参数,才有可能得到正确的结果。比如,支持向量机(SVM)的回归模型参数中,比较重要的有kernel参数和C参数。

kernel参数用来选择内核算法;C是误差项的惩罚参数,取值一般为10的整数次幂,如 0.001、0.1、1000 等。通常,C值越大,对误差项的惩罚越大,因此训练集测试时准确率就越高,但泛化能力越弱;C值越小,对误差项的惩罚越小,因此容错能力越强,泛化能力也相对越强。

下面的例子以糖尿病数据集为例,演示了支持向量机(SVM)回归模型中不同的C参数对回归结果的影响。糖尿病数据集收集了442 例糖尿病患者的10 个指标(年龄、性别、体重指数、平均血压和6 个血清测量值),标签是一年后疾病进展的定量测值。需要特别指出,糖尿病数据集并不适用于SVM算法,此处仅是为了演示参数选择如何影响训练结果。

》》》 from sklearn.datasets import load_diabetes》》》 from sklearn.model_selection import train_test_split as tsplit》》》 from sklearn.svm import SVR》》》 from sklearn import metrics》》》 X, y = load_diabetes(return_X_y=True)》》》 X.shape, y.shape, y.dtype((442, 10), (442,), dtype(‘float64’))》》》 X_train, X_test, y_train, y_test = tsplit(X, y, test_size=0.02)》》》 svr_1 = SVR(kernel=‘rbf’, C=0.1) # 实例化SVR模型,rbf核函数,C=0.1》》》 svr_2 = SVR(kernel=‘rbf’, C=100) # 实例化SVR模型,rbf核函数,C=100》》》 svr_1.fit(X_train, y_train) # 模型训练SVR(C=0.1)》》》 svr_2.fit(X_train, y_train) # 模型训练SVR(C=100)》》》 z_1 = svr_1.predict(X_test) # 模型预测》》》 z_2 = svr_2.predict(X_test) # 模型预测》》》 y_test # 这是测试集的实际值array([ 49., 317., 84., 181., 281., 198., 84., 52., 129.])》》》 z_1 # 这是C=0.1的预测值,偏差很大array([138.10720127, 142.1545034 , 141.25165838, 142.28652449, 143.19648143, 143.24670732, 137.57932272, 140.51891989, 143.24486911])》》》 z_2 # 这是C=100的预测值,偏差明显变小array([ 54.38891948, 264.1433666 , 169.71195204, 177.28782561, 283.65199575, 196.53405477, 61.31486045, 199.30275061, 184.94923477])》》》 metrics.mean_squared_error(y_test, z_1) # C=0.01的均方误差8464.946517460194》》》 metrics.mean_squared_error(y_test, z_2) # C=100的均方误差3948.37754995066》》》 metrics.r2_score(y_test, z_1) # C=0.01的复相关系数0.013199351909129464》》》 metrics.r2_score(y_test, z_2) # C=100的复相关系数0.5397181166871942》》》 metrics.median_absolute_error(y_test, z_1) # C=0.01的中位数绝对误差57.25165837797314》》》 metrics.median_absolute_error(y_test, z_2) # C=100的中位数绝对误差22.68513954888364

18

随机森林是将多棵分类决策树或者回归决策树集成在一起的算法,是机器学习的一个分支——集成学习的方法。

以随机森林分类为例,随机森林包含的每棵决策树都是一个分类模型,对于一个输入样本,每个分类模型都会产生一个分类结果,类似投票表决。随机森林集成了所有的投票分类结果,并将被投票次数最多的类别指定为最终的输出类别。随机森林每颗决策树的训练样本都是随机的,决策树中训练集的特征列也是随机选择确定的。正是因为这两个随机性的存在,使得随机森林不容易陷入过拟合,并且具有很好的抗噪能力。

考虑到随机森林的每一棵决策树中训练集的特征列是随机选择确定的,更适合处理具有多特征列的数据,这里选择 Scikit-learn内置的威斯康星州乳腺癌数据集来演示随机森林分类模型的使用。该数据集有 569 个乳腺癌样本,每个样本包含半径、纹理、周长、面积、是否平滑、是否紧凑、是否凹凸等 30 个特征列。

》》》 from sklearn.datasets import load_breast_cancer # 导入数据加载函数》》》 from sklearn.tree import DecisionTreeClassifier # 导入随机树》》》 from sklearn.ensemble import RandomForestClassifier # 导入随机森林》》》 from sklearn.model_selection import cross_val_score # 导入交叉验证》》》 ds = load_breast_cancer() # 加载威斯康星州乳腺癌数据集》》》 ds.data.shape # 569个乳腺癌样本,每个样本包含30个特征(569, 30)》》》 dtc = DecisionTreeClassifier() # 实例化决策树分类模型》》》 rfc = RandomForestClassifier() # 实例化随机森林分类模型》》》 dtc_scroe = cross_val_score(dtc, ds.data, ds.target, cv=10) # 交叉验证》》》 dtc_scroe # 决策树分类模型交叉验证10次的结果array([0.92982456, 0.85964912, 0.92982456, 0.89473684, 0.92982456, 0.89473684, 0.87719298, 0.94736842, 0.92982456, 0.92857143])》》》 dtc_scroe.mean() # 决策树分类模型交叉验证10次的平均精度0.9121553884711779》》》 rfc_scroe = cross_val_score(rfc, ds.data, ds.target, cv=10) # 交叉验证》》》 rfc_scroe # 随机森林分类模型交叉验证10次的结果array([0.98245614, 0.89473684, 0.94736842, 0.94736842, 0.98245614, 0.98245614, 0.94736842, 0.98245614, 0.94736842, 1. ])》》》 rfc_scroe.mean()# 随机森林分类模型交叉验证10次的平均精度0.9614035087719298

上面的代码使用了交叉验证法,其原理是将样本分成n份,每次用其中的n-1份作训练集,剩余1份作测试集,训练n次,返回每次的训练结果。结果显示,同样交叉验证10次,96%对91%,随机森林的分类准确率明显高于随机树。

19

基于质心的聚类,无论是k均值聚类还是均值漂移聚类,其局限性都是显而易见的:无法处理细长条、环形或者交叉的不规则的样本分布。

k均值(k-means)聚类通常被视为聚类的“入门算法”,其算法原理非常简单。首先从X数据集中选择k个样本作为质心,然后重复以下两个步骤来更新质心,直到质心不再显著移动为止:第一步将每个样本分配到距离最近的质心,第二步根据每个质心所有样本的平均值来创建新的质心。

基于质心的聚类是通过把样本分离成多个具有相同方差的类的方式来聚集数据的,因此总是希望簇是凸(convex)的和各向同性(isotropic)的,但这并非总是能够得到满足。例如,对细长、环形或交叉等具有不规则形状的簇,其聚类效果不佳。

》》》 from sklearn import datasets as dss # 导入样本生成器》》》 from sklearn.cluster import KMeans # 从聚类子模块导入聚类模型》》》 import matplotlib.pyplot as plt》》》 plt.rcParams[‘font.sans-serif’] = [‘FangSong’]》》》 plt.rcParams[‘axes.unicode_minus’] = False》》》 X_blob, y_blob = dss.make_blobs(n_samples=[300,400,300], n_features=2)》》》 X_circle, y_circle = dss.make_circles(n_samples=1000, noise=0.05, factor=0.5)》》》 X_moon, y_moon = dss.make_moons(n_samples=1000, noise=0.05)》》》 y_blob_pred = KMeans(init=‘k-means++’, n_clusters=3).fit_predict(X_blob)》》》 y_circle_pred = KMeans(init=‘k-means++’, n_clusters=2).fit_predict(X_circle)》》》 y_moon_pred = KMeans(init=‘k-means++’, n_clusters=2).fit_predict(X_moon)》》》 plt.subplot(131)《matplotlib.axes._subplots.AxesSubplot object at 0x00000180AFDECB88》》》》 plt.title(‘团状簇’)Text(0.5, 1.0, ‘团状簇’)》》》 plt.scatter(X_blob[:,0], X_blob[:,1], c=y_blob_pred)《matplotlib.collections.PathCollection object at 0x00000180C495DF08》》》》 plt.subplot(132)《matplotlib.axes._subplots.AxesSubplot object at 0x00000180C493FA08》》》》 plt.title(‘环状簇’)Text(0.5, 1.0, ‘环状簇’)》》》 plt.scatter(X_circle[:,0], X_circle[:,1], c=y_circle_pred)《matplotlib.collections.PathCollection object at 0x00000180C499B888》》》》 plt.subplot(133)《matplotlib.axes._subplots.AxesSubplot object at 0x00000180C4981188》》》》 plt.title(‘新月簇’)Text(0.5, 1.0, ‘新月簇’)》》》 plt.scatter(X_moon[:,0], X_moon[:,1], c=y_moon_pred)《matplotlib.collections.PathCollection object at 0x00000180C49DD1C8》》》》 plt.show()

上面的代码首先使用样本生成器生成团状簇、环状簇和新月簇,然后使用k均值聚类分别对其实施聚类操作。结果表明,k均值聚类仅适用于团状簇,对于环状簇、新月簇无能为力。

20

基于密度的空间聚类具有更好的适应性,可以发现任何形状的簇。

基于密度的空间聚类,全称是基于密度的带噪声的空间聚类应用算法(英文简写为DBSCAN)。该聚类算法将簇视为被低密度区域分隔的高密度区域,这与K均值聚类假设簇总是凸的这一条件完全不同,因此可以发现任何形状的簇。

DBSCAN类是Scikit-learn聚类子模块cluster提供的基于密度的空间聚类算法,该类有两个重要参数eps和min_samples。要理解DBSCAN 类的参数,需要先理解核心样本。如果一个样本的eps距离范围内存在不少于min_sample个样本(包括这个样本),则该样本称为核心样本。可见,参数eps和min_samples 定义了簇的稠密度。

》》》 from sklearn import datasets as dss》》》 from sklearn.cluster import DBSCAN》》》 import matplotlib.pyplot as plt》》》 plt.rcParams[‘font.sans-serif’] = [‘FangSong’]》》》 plt.rcParams[‘axes.unicode_minus’] = False》》》 X, y = dss.make_moons(n_samples=1000, noise=0.05)》》》 dbs_1 = DBSCAN() # 默认核心样本半径0.5,核心样本邻居5个》》》 dbs_2 = DBSCAN(eps=0.2) # 核心样本半径0.2,核心样本邻居5个》》》 dbs_3 = DBSCAN(eps=0.1) # 核心样本半径0.1,核心样本邻居5个》》》 dbs_1.fit(X)DBSCAN(algorithm=‘auto’, eps=0.5, leaf_size=30, metric=‘euclidean’, metric_params=None, min_samples=5, n_jobs=None, p=None)》》》 dbs_2.fit(X)DBSCAN(algorithm=‘auto’, eps=0.2, leaf_size=30, metric=‘euclidean’, metric_params=None, min_samples=5, n_jobs=None, p=None)》》》 dbs_3.fit(X)DBSCAN(algorithm=‘auto’, eps=0.1, leaf_size=30, metric=‘euclidean’, metric_params=None, min_samples=5, n_jobs=None, p=None)》》》 plt.subplot(131)《matplotlib.axes._subplots.AxesSubplot object at 0x00000180C4C5D708》》》》 plt.title(‘eps=0.5’)Text(0.5, 1.0, ‘eps=0.5’)》》》 plt.scatter(X[:,0], X[:,1], c=dbs_1.labels_)《matplotlib.collections.PathCollection object at 0x00000180C4C46348》》》》 plt.subplot(132)《matplotlib.axes._subplots.AxesSubplot object at 0x00000180C4C462C8》》》》 plt.title(‘eps=0.2’)Text(0.5, 1.0, ‘eps=0.2’)》》》 plt.scatter(X[:,0], X[:,1], c=dbs_2.labels_)《matplotlib.collections.PathCollection object at 0x00000180C49FC8C8》》》》 plt.subplot(133)《matplotlib.axes._subplots.AxesSubplot object at 0x00000180C49FCC08》》》》 plt.title(‘eps=0.1’)Text(0.5, 1.0, ‘eps=0.1’)》》》 plt.scatter(X[:,0], X[:,1], c=dbs_3.labels_)《matplotlib.collections.PathCollection object at 0x00000180C49FC4C8》》》》 plt.show()

以上代码使用DBSCAN,配合适当的参数,最终将新月数据集的上弦月和下弦月分开,效果如下图所示。

21

主成分分析(PCA)是一种统计方法,也是最常用的降维方法。

主成分分析通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。显然,主成分分析的降维并不是简单地丢掉一些特征,而是通过正交变换,把具有相关性的高维变量合并为线性无关的低维变量,从而达到降维的目的。

以下代码以鸢尾花数据集为例演示了如何使用 PCA 类来实现主成分分析和降维。已知鸢尾花数据集有 4 个特征列,分别是花萼的长度、宽度和花瓣的长度、宽度。

》》》 from sklearn import datasets as dss》》》 from sklearn.decomposition import PCA》》》 ds = dss.load_iris()》》》 ds.data.shape # 150个样本,4个特征维(150, 4)》》》 m = PCA() # 使用默认参数实例化PCA类,n_components=None》》》 m.fit(ds.data)PCA(copy=True, iterated_power=‘auto’, n_components=None, random_state=None, svd_solver=‘auto’, tol=0.0, whiten=False)》》》 m.explained_variance_ # 正交变换后各成分的方差值array([4.22824171, 0.24267075, 0.0782095 , 0.02383509])》》》 m.explained_variance_ratio_ # 正交变换后各成分的方差值占总方差值的比例array([0.92461872, 0.05306648, 0.01710261, 0.00521218])

对鸢尾花数据集的主成分分析结果显示:存在一个明显的成分,其方差值占总方差值的比例超过92% ;存在一个方差值很小的成分,其方差值占总方差值的比例只有0.52% ;前两个成分贡献的方差占比超过97.7%,数据集特征列可以从4个降至2个而不至于损失太多有效信息。

》》》 m = PCA(n_components=0.97)》》》 m.fit(ds.data)PCA(copy=True, iterated_power=‘auto’, n_components=0.97, random_state=None, svd_solver=‘auto’, tol=0.0, whiten=False)》》》 m.explained_variance_array([4.22824171, 0.24267075])》》》 m.explained_variance_ratio_array([0.92461872, 0.05306648])》》》 d = m.transform(ds.data)》》》 d.shape(150, 2)

指定参数n_components不小于0.97,即可得到原数据集的降维结果:同样是150个样本,但特征列只有2个。若将2个特征列视为平面直角坐标系中的x和y坐标,就可以直观地画出全部样本数据。

》》》 import matplotlib.pyplot as plt》》》 plt.scatter(d[:,0], d[:,1], c=ds.target)《matplotlib.collections.PathCollection object at 0x0000016FBF243CC8》》》》 plt.show()

—版权声明—

仅用于学术分享,版权属于原作者。

若有侵权,请联系删除或修改!

编辑:jq

原文标题:21 句话入门机器学习

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

什么是不可变对象 不可变对象存储可以抵御哪些威胁

什么是不可变对象? 属性变更时必须新建对象的对象,如String,已有“String str=‘ab....
的头像 Les 发表于 09-19 11:44 32次 阅读

景区生态环境监测站的特点

景区生态环境监测站的系统组成介绍FT-FYLZ【风途】负氧离子不仅是衡量大气环境质量的天平,而且本身....
发表于 09-18 16:38 10次 阅读

油脂酸价测定仪有什么优势

油脂酸价测定仪【莱恩德】为集成化油品快速检测分析设备,能够快速检测食用植物油、食用猪油、花生油、葵花....
发表于 09-18 14:21 35次 阅读

蔬菜农药残留快速检测仪使用

蔬菜农药残留快速检测仪【莱恩德】守卫顾客的消费安全性。蔬菜的产品质量是否关联到顾客的就餐安全性,以往....
发表于 09-18 14:12 36次 阅读

MSK调制解调器的matlab仿真

继续讲解程序!MSK也能进行相干解调?是的!同样是采用锁相环!先来看看MSK的优点,这是由于下面的这....
的头像 通信工程师专辑 发表于 09-18 11:43 102次 阅读
MSK调制解调器的matlab仿真

介绍3种方法跨时钟域处理方法

跨时钟域处理是FPGA设计中经常遇到的问题,而如何处理好跨时钟域间的数据,可以说是每个FPGA初学者....
的头像 FPGA设计论坛 发表于 09-18 11:33 623次 阅读
介绍3种方法跨时钟域处理方法

机智云追踪外卖骑手保温箱硬件开发和项目演示

01 本章实现功能介绍 追踪外卖骑手的保温箱的GPS定位信息以及外卖箱是否被人打开,以防止骑手在送餐....
的头像 机智云开发者 发表于 09-18 11:03 103次 阅读

深入探究Linux系统噪音统计(osnoise tracer)

在Linux系统中作为一个普通线程是非常苦逼的。不仅NMI 、硬中断、软中断可以打断它,甚至其它普通....
的头像 Linux阅码场 发表于 09-18 10:53 143次 阅读
深入探究Linux系统噪音统计(osnoise tracer)

是德科技与联发科技实现6Gbps数据吞吐速度

密切协作助力移动运营商以独立模式高效部署先进的5G 服务。 2021年9月6日,北京――是德科技公司....
的头像 是德科技快讯 发表于 09-18 10:42 783次 阅读

如何解决企业的数据之痛

企业的数据之痛 企业的数据之痛源⾃于企业的数据处理能⼒和数据增⻓速度的不匹配。根据知名分析机构的估算....
的头像 IBM中国 发表于 09-18 09:53 93次 阅读

avr单片机INT0是如何去模拟代码的

avr单片机INT0是如何去模拟代码的?怎样去编写其代码?...
发表于 09-18 06:49 0次 阅读

名片全能王,帮助职场人士轻松社交

在职场中,人与人之间的交际是最基本的环节。如何在初次见面时就给对方留下一个好的印象,这是一个需要考量....
的头像 话说科技 发表于 09-17 18:30 73次 阅读

蔬菜农药残留检测仪多少钱一台

蔬菜农药残留检测仪多少钱一台FT-WLK2【风途】幼儿园里的食材农药超标,对于孩子可能造成的伤害就更....
发表于 09-17 15:40 48次 阅读

家庭用的蔬菜农药残留检测仪的功能有哪些?

家庭用的蔬菜农药残留检测仪的功能有哪些?FT-WLK1【风途】农药残留是影响农产品质量安全的重要因素....
发表于 09-17 14:27 22次 阅读

提升企业数字化水平 这套信息化管理方案值得

相信大家对于HR既熟悉又陌生,熟悉是因为每个人入职、日常工作都会有所交集,陌生是因为大家对人力资源管....
发表于 09-17 12:27 33次 阅读

低压数据监测终端的设计特点是什么

随着科技的不断进步,我国进入新型工业化时代,用电需求量也越来越大,用电分为高压用电和低压用电。安全用....
发表于 09-17 11:12 12次 阅读

科研级全项目土壤肥料养分检测仪参数及特点

科研级全项目土壤肥料养分检测仪参数及特点JD-GT5,顾名思义,是用来检测土壤肥料的专业仪器。随着科....
发表于 09-17 11:07 21次 阅读

计算机硬盘维修与数据恢复

计算机硬盘维修与数据恢复语音编辑锁定讨论上传视频《计算机硬盘维修与数据恢复》是2006年高等教育出版社出版的图书。书名计算机...
发表于 09-17 08:54 0次 阅读

强弱电机房位置大小及布置

[导读]【机房】强弱电机房位置大小及布置(附案例)变电所机房位置选择1、接近负荷中心;2、进出线方便;3、考虑防水,不应设在厕所、...
发表于 09-17 08:54 0次 阅读

三菱交流伺服系统伺服故障和报警代码

伺服故障和报警代码大全,超实用!使用三菱交流伺服系统主要由三个系列:MR-ES、MR-J2S、MR-J3。通常故障情况可由伺服...
发表于 09-17 08:54 0次 阅读

如何利用51单片机制作从左至右再从右制作的流水灯呢

如何利用51单片机制作从左至右再从右制作的流水灯呢?如何编写其代码程序?...
发表于 09-17 06:52 0次 阅读

Hadoop MapperReduce编程

一、前言 以微博为例,每个用户会发很多微博,其中包含了很多关键词信息。而这些关键词就是用户可能感兴趣的事物。我们需要用Ha...
发表于 09-17 06:51 0次 阅读

松下伺服报警代码保护功能

《松下伺服故障报警代码分析及处理》由会员分享,可在线阅读,更多相关《松下伺服故障报警代码分析及处理(2页珍藏版)》请在人人文...
发表于 09-17 06:20 0次 阅读

​开发板上玩GTA RISC-V多项移植项目成功运作中

电子发烧友网报道(文/周凯扬)RISC-V近期再度掀起了不小的热度,苹果招募RISC-V程序员负责其....
的头像 电子发烧友网 发表于 09-16 11:59 140次 阅读
​开发板上玩GTA RISC-V多项移植项目成功运作中

嵌入式开发中实用的宏打印函数

宏打印函数在我们的嵌入式开发中,使用printf打印一些信息是一种常用的调试手段。但是,在打印的信息....
的头像 FPGA之家 发表于 09-16 10:05 98次 阅读
嵌入式开发中实用的宏打印函数

海量数据存储的需求越来越强烈

在今天的智能社会,数据成为了最为重要的资源。根据Statista 的统计和预测,2020年全球数据产....
的头像 贸泽电子 发表于 09-16 09:45 75次 阅读

使用Kotlin替代Java重构AOSP应用

两年前,Android 开源项目 (AOSP) 应用团队开始使用 Kotlin 替代 Java 重构....
的头像 谷歌开发者 发表于 09-16 09:26 101次 阅读
使用Kotlin替代Java重构AOSP应用

魔方网表,无代码开发平台NCDP的无冕之王

NCDP也就是No-code development platform,无代码开发平台,我第一次听到....
的头像 话说科技 发表于 09-15 14:34 85次 阅读

基于i.MX 8M Plus的康佳特模块使Qseven的设计在未来获得巨大的性能提升

功能强大的新型Qseven模块基于i.MX 8M Plus应用处理器,具有1.8 GHz ARM C....
发表于 09-15 11:35 2000次 阅读
基于i.MX 8M Plus的康佳特模块使Qseven的设计在未来获得巨大的性能提升

C语言中struct的用法有哪些

定义结构体变量       下面举一个例子来说明怎样定义结构体变量。                ....
的头像 STM32嵌入式开发 发表于 09-15 09:41 669次 阅读

iphone13起售价为5999元,A15的机器学习能力提升了50%

苹果在发布会上自豪的表示“采用A15仿生芯片,进一步拉开与业界的差距”。强大的机器学习能力贯穿在芯片....
的头像 倩倩 发表于 09-15 09:34 212次 阅读

51单片机的启动文件作用是什么

在我们使用kei c51创建一个51单片机项目时,会有如下图所示的提示: 一般情况下,需要选择“是”....
的头像 嵌入式ARM 发表于 09-15 09:12 181次 阅读
51单片机的启动文件作用是什么

苹果发布会:十三真的香,你心动了没有

iPhone 13系列外观设计几乎没有什么变化,最大的变化就是摄像头的部分排布以及摄像头的模组的尺寸....
的头像 倩倩 发表于 09-15 09:10 1175次 阅读

如何充分利用Heroku CI

ci/cd heroku 持续集成和持续交付(CI / CD)是当今软件工程开发过程中的最佳实践。  持续集成 (CI)允许开发人...
发表于 09-15 08:43 0次 阅读

代码生成有哪些用途

代码生成有许多用途:  我们可以从模式或现有信息源中生成重复代码。 例如,我们可以从数据库模式文件生成数据访问对象...
发表于 09-15 08:04 0次 阅读

3200故障代码服务器显示说明

3200故障代码 服务器显示 说 明AT400门机随机文件受控文件编号: AT400-OIM-ZH更 改 记 录序号更改文件号更 改 内 容 描...
发表于 09-15 07:51 0次 阅读

自由在云上构建全新未来——亚马逊云科技

就像亚马逊创始人Jeff Bezos所说的,“在当今动荡的时代,我们能做的就是重塑。你能拥有的可持续....
的头像 科讯视点 发表于 09-14 11:42 130次 阅读
自由在云上构建全新未来——亚马逊云科技

Linux系统中图形显示方案

Linux系统中图形显示方案   1 FBDEV Framebuffer device 社区参与度不....
的头像 Linux爱好者 发表于 09-14 10:43 178次 阅读
Linux系统中图形显示方案

新思科技PrimeSim可靠性分析解决方案加速任务关键型IC设计超收敛

经晶圆厂认证的全生命周期可靠性签核有助于预防汽车、医疗和5G芯片设计中的过度设计和昂贵的后期ECO(....
发表于 09-14 10:22 1447次 阅读

人工智能和机器学习带来新一代物联网解决方案

自动化应用、前沿、视频监控、智慧城市、医疗、汽车及交易活跃的市场。 人工智能和机器学习将为各行各业带....
的头像 易络盟电子 发表于 09-14 10:04 898次 阅读

八种常见的数据分析方法介绍

不能度量,就无法增长。 数据分析对于企业商业价值的提升起到了至关重要的作用。在具体的业务场景中,一般....
的头像 数据分析与开发 发表于 09-14 09:44 101次 阅读

MySQL中的redo log是什么

前言 说到MySQL,有两块日志一定绕不开,一个是InnoDB存储引擎的redo log(重做日志)....
的头像 数据分析与开发 发表于 09-14 09:40 85次 阅读

气象墒情监测站是什么

气象墒情监测站FT-TDR由于比表面积不同,导致粒径大小有差异的矿物颗粒的储水能力及储水后再供水的能....
发表于 09-13 16:30 44次 阅读

符合IEPE标准的CbM机器学习赋能平台

CbM需要捕获全带宽数据,以确保时域和频域中的所有谐波、混叠及其他机械相互作用都得到考虑。这种数据收....
发表于 09-13 12:45 3373次 阅读
符合IEPE标准的CbM机器学习赋能平台

蛋白质快速检测仪的功能

随着发展,食品行业在不断的扩大生产,与此同时一些不法现象也开始出现,很多食品中蛋白质含量不合标,通过....
发表于 09-13 10:27 57次 阅读

FastThreadLocal快在哪里

blog.csdn.net/mycs2012/article/details/90898128 1 ....
的头像 Android编程精选 发表于 09-13 09:17 132次 阅读

C++基础语法友元类和友元函数

本期是C++基础语法分享的第五节,今天给大家来分享一下: (1)explicit(显式)关键字; (....
的头像 C语言编程学习基地 发表于 09-12 09:52 190次 阅读

一条SQL语句是怎么被执行的

一直是想知道一条SQL语句是怎么被执行的,它执行的顺序是怎样的,然后查看总结各方资料,就有了下面这一....
的头像 Linux爱好者 发表于 09-12 09:44 168次 阅读
一条SQL语句是怎么被执行的

虽迟但到!Facebook正在为机器学习和视频转码开发自研芯片

近日,外媒The Information报道称,有两位消息人士透露,Facebook正在开发一种机器....
的头像 Hobby观察 发表于 09-12 07:28 1670次 阅读

北鲲云超算平台为药物研发提供哪些帮助

近日,恒瑞医药发布 2021 年半年报发布,面对自 2003 年以来净利增长率最低的数据,董事长孙飘....
发表于 09-11 17:12 56次 阅读

用诸葛孔明的智慧,读懂新型数据中心的“四新”机遇与产业逻辑

新型数据中心中“新计算、新网络”的能力建设,意味着社会中的算力将被进一步中心化。
的头像 脑极体 发表于 09-11 11:14 1766次 阅读
用诸葛孔明的智慧,读懂新型数据中心的“四新”机遇与产业逻辑

如何通过Python脚本实现WIFI密码的暴力破解

前言 本文将记录学习下如何通过 Python 脚本实现 WIFI 密码的暴力破解,从而实现免费蹭网。....
的头像 马哥Linux运维 发表于 09-10 17:09 323次 阅读
如何通过Python脚本实现WIFI密码的暴力破解

NVIDIA医疗大数据解决方案助力医疗数据处理效率突破百倍提升

在NVIDIA A100 Tensor Core GPU和NVIDIA TensorRT强大的AI算....
的头像 NVIDIA英伟达企业解决方案 发表于 09-10 15:11 1685次 阅读

你们知道FIFO最小深度计算吗

FIFO 最小深度计算 例子 - 1:f_wr 》 f_rd,连续读写 写时钟80MHz。 读时钟5....
的头像 FPGA设计论坛 发表于 09-10 09:23 149次 阅读
你们知道FIFO最小深度计算吗

USB数据抓包软件程序下载

USB数据抓包软件程序下载
发表于 09-09 16:01 21次 阅读

软件工程师为什么要写文档

在大多数软件工程师对编写、使用和维护代码的抱怨中,一个常见的问题是缺乏高质量的文档。缺乏文档有什么副....
的头像 Linux阅码场 发表于 09-09 11:26 251次 阅读

使用deepstream-test的范例代码修改车牌识别与遮盖

前一篇文章提到使用deepstream-test的范例代码,修改成“车牌识别”与“遮盖(redact....
的头像 NVIDIA英伟达企业解决方案 发表于 09-09 10:04 176次 阅读
使用deepstream-test的范例代码修改车牌识别与遮盖

在STM32G4片内不同存储空间运行的速度差异

最近有人问起程序在STM32G4片内不同存储空间运行的速度差异。说实在的,这个很难说死或说出个绝对的....
的头像 茶话MCU 发表于 09-09 09:57 235次 阅读
在STM32G4片内不同存储空间运行的速度差异

骑手保温箱追踪及温湿度监测4G设备接入机智云教程

01 前言 利用机智云提供的通用版App即使不懂云和App开发,也可以在不用写任何代码的情况下,轻松....
的头像 机智云开发者 发表于 09-09 09:16 147次 阅读
骑手保温箱追踪及温湿度监测4G设备接入机智云教程