scikit-learn点滴

scikit-learn点滴

scikit-learn是非常漂亮的一个机器学习库,在某些时候,使用这些库能够大量的节省你的时间,至少,我们用Python,应该是很难写出速度快如斯的代码的.

scikit-learn官方出了一些文档,但是个人觉得,它的文档很多东西都没有讲清楚,它说算法原理的时候,只是描述一下,除非你对这种算法已经烂熟于心,才会对它的描述会心一笑,它描述API的时候,很多时候只是讲了一些常见用法,一些比较高级的用法就语焉不详,虽然有很多人说,这玩意的文档写得不错,但是我觉得特坑.所以这篇博文,会记录一些我使用这个库的时候碰到的一些坑,以及如何跨过这些坑.慢慢来更新吧,当然,以后如果不用了,文章估计也不会更新了,当然,我也没有打算说,这篇文章有多少人能看.就这样吧.

聚类

坑1: 如何自定义距离函数?

虽然说scikit-learn这个库实现了很多的聚类函数,但是这些算法使用的距离大部分都是欧氏距离或者明科夫斯基距离,事实上,根据我们教材上的描述,所谓的距离,可不单单仅有这两种,为了不同的目的,我们可以用不同的距离来度量两个向量之间的距离,但是很遗憾,我并没有看见scikit-learn中提供自定义距离的选项,网上搜了一大圈也没有见到.

但是不用担心,我们可以间接实现这个东西.以DBSCAN算法为例,下面是类的一个构造函数:

class sklearn.cluster.DBSCAN(eps=0.5, min_samples=5, metric='euclidean', algorithm='auto', leaf_size=30, p=None, n_jobs=1) # eps表示两个向量可以被视作为同一个类的最大的距离 # min_samples表示一个类中至少要包含的元素数量,如果小于这个数量,那么不构成一个类

 

 

我们要特别注意一下metric这个选项,我们来看一下选项:

metric : string, or callableThe metric to use when calculating distance between instances in a feature array. If metric is a string or callable, it must be one of the options allowed by metrics.pairwise.calculate_distance for its metric parameter. If metric is “precomputed”, X is assumed to be a distance matrix and must be square. X may be a sparse matrix, in which case only “nonzero” elements may be considered neighbors for DBSCAN. New in version 0.17: metric precomputed to accept precomputed sparse matrix.

 

 

这段描述其实透露了一个很重要的信息,那就是其实你可以自己提前计算各个向量的相似度,构成一个相似度的矩阵,只要你设置metric='precomputedd'就行,那么如何调用呢?

我们来看一下fit函数.

fit(X, y=None, sample_weight=None)
# X : array or sparse (CSR) matrix of shape (n_samples, n_features), or array of shape (n_samples, n_samples)
# A feature array, or array of distances between samples if metric='precomputed'.

 

 

上面的注释是什么意思呢,我翻译一下,如果你将metric设置成了precomputed的话,那么传入的X参数应该为各个向量之间的相似度矩阵,然后fit函数会直接用你这个矩阵来进行计算.否则的话,你还是要乖乖地传入(n_samples, n_features)形式的向量.

这意味着什么,同志们.这意味着我们可以用我们自定义的距离事先计算好各个向量的相似度,然后调用这个函数来获得结果,是不是很爽.

具体怎么来编程,我给个例子,抛个砖.

import numpy as np
from sklearn.cluster import DBSCAN
if __name__ == '__main__': Y = np.array([[0, 1, 2], [1, 0, 3], [2, 3, 0]]) # 相似度矩阵,距离越小代表两个向量距离越近 # N = Y.shape[0] db = DBSCAN(eps=0.13, metric='precomputed', min_samples=3).fit(Y) labels = db.labels_ # 然后来看一下分类的结果吧! n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0) # 类的数目 print('类的数目是:%d'%(n_clusters_))

 

 

我们继续来看一下AP聚类,其实也很类似:

class sklearn.cluster.AffinityPropagation(damping=0.5, max_iter=200, convergence_iter=15, copy=True, preference=None, affinity='euclidean', verbose=False)

 

 

关键在这个affinity参数上:

affinity : string, optional, default=``euclidean``Which affinity to use. At the moment precomputed and euclidean are supported. euclidean uses the negative squared euclidean distance between points.

 

 

这个东西也支持precomputed参数.再来看一下fit函数:

fit(X, y=None)
# Create affinity matrix from negative euclidean distances, then apply affinity propagation clustering.
# Parameters:   
#   X: array-like, shape (n_samples, n_features) or (n_samples, n_samples) :
# Data matrix or, if affinity is precomputed, matrix of similarities / affinities.

 

这里的X和前面是类似的,如果你将metric设置成了precomputed的话,那么传入的X参数应该为各个向量之间的相似度矩阵,然后fit函数会直接用你这个矩阵来进行计算.否则的话,你还是要乖乖地传入(n_samples, n_features)形式的向量.

例子1

"""目标:~~~~~~~~~~~~~~~~在这个文件里面,我最想测试一下的是,我前面的那些聚类算法是否是正确的.首先要测试的是AP聚类.
"""
from sklearn.cluster import AffinityPropagation
from sklearn import metrics from sklearn.datasets.samples_generator import make_blobs from sklearn.metrics.pairwise import euclidean_distances import matplotlib.pyplot as plt from itertools import cycle def draw_pic(n_clusters, cluster_centers_indices, labels, X): ''' 口说无凭,绘制一张图就一目了然. ''' colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk') for k, col in zip(range(n_clusters), colors): class_members = labels == k cluster_center = X[cluster_centers_indices[k]] # 得到聚类的中心 plt.plot(X[class_members, 0], X[class_members, 1], col + '.') plt.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col, markeredgecolor='k', markersize=14) for x in X[class_members]: plt.plot([cluster_center[0], x[0]], [cluster_center[1], x[1]], col) plt.title('Estimated number of clusters: %d' % n_clusters) plt.show() if __name__ == '__main__': centers = [[1, 1], [-1, -1], [1, -1]] # 接下来要生成300个点,并且每个点属于哪一个中心都要标记下来,记录到labels_true中. X, labels_true = make_blobs(n_samples=300, centers=centers, cluster_std=0.5, random_state=0) af = AffinityPropagation(preference=-50).fit(X) # 开始用AP聚类 cluster_centers_indices = af.cluster_centers_indices_ # 得到聚类的中心点 labels = af.labels_ # 得到label n_clusters = len(cluster_centers_indices) # 类的数目 draw_pic(n_clusters, cluster_centers_indices, labels, X) #===========接下来的话提前计算好距离=================# distance_matrix = -euclidean_distances(X, squared=True) # 提前计算好欧几里德距离,需要注意的是,这里使用的是欧几里德距离的平方 af1 = AffinityPropagation(affinity='precomputed', preference=-50).fit(distance_matrix) cluster_centers_indices1 = af1.cluster_centers_indices_ # 得到聚类的中心 labels1 = af1.labels_ # 得到label n_clusters1 = len(cluster_centers_indices1) # 类的数目 draw_pic(n_clusters1, cluster_centers_indices1, labels1, X)

 

两种方法都将产生这样的图:

AP聚类

例子2

既然都到这里了,我们索性来测试一下DBSCAN算法好了.

"""目标:~~~~~~~~~~~~~~前面已经测试过了ap聚类,接下来测试DBSACN.
"""
import numpy as np
from sklearn.cluster import DBSCAN from sklearn import metrics from sklearn.datasets.samples_generator import make_blobs from sklearn.preprocessing import StandardScaler import matplotlib.pyplot as plt from sklearn.metrics.pairwise import euclidean_distances def draw_pic(n_clusters, core_samples_mask, labels, X): ''' 开始绘制图片 ''' # Black removed and is used for noise instead. unique_labels = set(labels) colors = plt.cm.Spectral(np.linspace(0, 1, len(unique_labels))) for k, col in zip(unique_labels, colors): if k == -1: # Black used for noise. col = 'k' class_member_mask = (labels == k) xy = X[class_member_mask & core_samples_mask] plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col, markeredgecolor='k', markersize=14) xy = X[class_member_mask & ~core_samples_mask] plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=col, markeredgecolor='k', markersize=6) plt.title('Estimated number of clusters: %d' % n_clusters) plt.show() if __name__ == '__main__': #=========首先产生数据===========# centers = [[1, 1], [-1, -1], [1, -1]] X, labels_true = make_blobs(n_samples=750, centers=centers, cluster_std=0.4, random_state=0) X = StandardScaler().fit_transform(X) #=========接下来开始聚类==========# db = DBSCAN(eps=0.3, min_samples=10).fit(X) labels = db.labels_ # 每个点的标签 core_samples_mask = np.zeros_like(db.labels_, dtype=bool) core_samples_mask[db.core_sample_indices_] = True n_clusters = len(set(labels)) - (1 if -1 in labels else 0) # 类的数目 draw_pic(n_clusters, core_samples_mask, labels, X) #==========接下来我们提前计算好距离============# distance_matrix = euclidean_distances(X) db1 = DBSCAN(eps=0.3, min_samples=10, metric='precomputed').fit(distance_matrix) labels1 = db1.labels_ # 每个点的标签 core_samples_mask1 = np.zeros_like(db1.labels_, dtype=bool) core_samples_mask1[db1.core_sample_indices_] = True n_clusters1 = len(set(labels1)) - (1 if -1 in labels1 else 0) # 类的数目 draw_pic(n_clusters1, core_samples_mask1, labels1, X)

 

两种方法都将产生这样的图:

DBSCAN聚类

好吧,暂时介绍到这里吧,但是有意思的是,最简单的KMeans算法倒是不支持这样的干活.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259760.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎样搭建Android开发平台(转)

Android是基于Linux内核的软件平台和操作系统,是Google在2007年11月5日公布的手机系统平台,早期由Google开发,后由开放手机联盟(Open Handset Alliance)开发。 它采用了软件堆层(software stack&#xff0c…

subject.login(token)是如何确认账号密码的_教你如何删除、关闭、注销微信小程序...

微信小程序是我们日常生活中经常会接触到的工具,打开小程序后,它就会留在我们微信的”“发现-小程序”栏。很多人并不知道该如何删除、关闭小程序,所以今天就跟大家科普下相关问题。1.如何删除小程序首先,打开微信界面&#xff0c…

上海交通大学2006年数学分析考研试题

转载于:https://www.cnblogs.com/zhangzujin/p/4078900.html

出现的是乱码_cad状态栏出现了方框乱码怎么办?

左下角阅读原文看CAD视频好课推荐:1、CAD2014:点击查看 2、室内&全屋:点击查看 3、CAD2019:点击查看4、CAD2018:点击查看5、Bim教程:点击查看6、室内手绘:点击查看7、CAD三维:点…

UILabel 详解

UILabel 多行文字自动换行 (自动折行)1.UIView *footerView [[UIView alloc] initWithFrame:CGRectMake(10, 100, 300, 180)]; 2. UILabel *label [[UILabel alloc] initWithFrame:CGRectMake(10, 100, 300, 150)]; 3. label.text "…

onclick实现超链接_给超链接加onclick事件

在动态网页中,常常需要在单击超链接时处理一些数据,而不是跳转一个网页。在这种情况下,通常有以下三种处理方式:不设置标签的href属性,只设置onclick属性。在这种处理方式下,通常超链接文本会和正文的文本以…

Android 布局以及优化资料汇总

2019独角兽企业重金招聘Python工程师标准>>> 1.性能优化之布局优化 2.Android 开源库 V - Layout 转载于:https://my.oschina.net/zhugenqiang/blog/822942

mysql字符集排序规则_Mysql 字符集及排序规则

一、字符集字符集:就是用来定义字符在数据库中的编码的集合。常见的字符集:utf8、Unicode、GBK、GB2312(支持中文)、ASCCI(不支持中文)二、字符集排序规则作者本人用的是utf8_general_ci后缀ci (case insensitive)意味不区分大小写(大小写不敏感)&#x…

驱动06.触摸屏驱动程序

1.触摸屏的简介 触摸屏是标准的输入设备,在写驱动程序时采用的之前讲过的输入子系统那套框架。我们无需关心对设备文件的操作,只需关心对硬件寄存器的操作和上报事件即可。 触摸屏是附在LCD上的一层薄膜,并不是我们平时认识的触摸屏&#xff…

2016国产开源软件Top100(Q1)

2016国产开源软件Top100(Q1) 随着互联网的发展、开放标准的普及和虚拟化技术的应用等诸多IT新领域的创新及拓展,开源技术凭借其开放性、低成本、稳定性、灵活性、安全性和技术创新性等特点迅速走向成熟,逐步发展成为一种主流模式,日益改变着全…

mysql lenenc int_MySQL-NonMySQL同步工具源码解读——确定同步位置

经过上一节的鉴权过后,程序已经受主库认可,并且可以像主库发起同步请求。在发起请求之前,还有一个可选的步骤:确认同步时间点。同步时间点由两个属性进行标识:Binlog文件名、偏移量。工具支持自定义时间点,…

DancingLinks刷题集

HDU 3663 Power Stations 精确覆盖 题意&#xff1a;每个城市i有xi->yi天可以成为发射站&#xff0c;发射站覆盖范围为与该站有一条边链接的城市。 同时&#xff0c;每个每天城市必须且只能被一个发射站覆盖 天数D<5。 每个城市的发射站关闭后就不再开启。即只能选择一段…

【web前端优化】前端无优化,庸人自扰之!

前言 我发现一个人厉害不只是他厉害&#xff0c;他的名字也一定要跟着厉害才行&#xff0c;比如我刀狂剑痴叶小钗了&#xff0c;若是老夫叫做刀狂剑痴叶小草&#xff0c;估计就缺少气势了&#xff01;&#xff01;&#xff01; 又如百世经纶一页书&#xff0c;如果叫做百世经纶…

sourceTree添加git密钥步骤

给多个远程服务器比如https://github.com/wangjian2014/wjtest/blob/master/wj.txt添加public密钥 本地服务器添加private密钥 SSH Client 选择PuTTY/Plink 选择Generate&#xff0c;生成public 和private密钥&#xff0c;将public密钥数据复制到远程服务器上面 保存private…

background-size

background-size:contain;contain:包含 按比例调整图片&#xff0c;使得图片的宽度自适应容器的宽度。 相当于在ps中&#xff0c;约束比例设置原始图片的宽度值等于容器的宽度值。 如果图片过大&#xff0c;等比压缩后容器的高度方向上可能会有空白。 background-size:cover;co…

MySQL5.6免安装配置与“系统找不到指定的文件”错误

1.下载免安装版本的mysql-5.6.11-winx64 (本机 win7 64位)2.将文件解压到任意&#xff0c;不要有中文&#xff08;有中文的情况没试过&#xff0c;不过最好避免这种情况&#xff09;3.配置mysql 环境变量&#xff0c;在 path后面加上D:\Program Files\mysql-5.6.11-winx64\bin…

Source Insight基本使用和快捷键

为什么要用Source Insight呢&#xff1f;貌似是因为比完整的IDE要更快一些&#xff0c;比较利于查看大量的代码。 软件的安装很简单&#xff0c;设置好安装目录。 配置好文档路径&#xff0c;当然这个也可以在Options里面改&#xff0c;选Options->Preferences…里面的Folde…

powerquery mysql数据库_window 10 下 --excel | power query 通过 ODBC链接 mysql 数据库

excel链接到mysql的方法有几种&#xff0c;今天主要介绍如何通过ODBC链接odbc是 “开放数据库连接”&#xff0c;你可以通过下载插件使得自己的excel可以连接到不同的数据库。关于版本的选择&#xff0c;就是excel版本obdc版本mysql obdc版本(需要一样)第一步 下载mysql odbc…

table样式

一直以来&#xff0c;css和JS都是软肋&#xff0c;因为需要不得不重新温故。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style type"text/css">table.hover…

MAC和XCODE常用快捷键

摘自&#xff1a;http://www.cnblogs.com/yjmyzz/archive/2011/01/25/1944325.html 1. 文件CMD N: 新文件CMD SHIFT N: 新项目CMD O: 打开CMD S: 保存CMD SHIFT S: 另存为CMD W: 关闭窗口CMD SHIFT W: 关闭文件2. 编辑CMD [: 左缩进CMD ]: 右缩进CMD CTRL LEFT: …