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.pswp.cn/news/259760.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259760.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259760.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

background image

http://www.ajaxblender.com/bgstretcher-2-jquery-stretch-background-plugin-updated.html http://blog.dvxj.com/pandola/jQuery_bgStretcher.html 轉載于:https://www.cnblogs.com/eebb/p/4077231.html

怎樣搭建Android開發平臺(轉)

Android是基于Linux內核的軟件平臺和操作系統,是Google在2007年11月5日公布的手機系統平臺,早期由Google開發,后由開放手機聯盟(Open Handset Alliance)開發。 它采用了軟件堆層(software stack&#xff0c…

mvn deploy 推送到私有倉庫,注意當前日期

由于更改了本機系統時間到過去的一個時間,導致mvn deploy推送到私有倉庫后,該更新的jar包時間戳比較舊,客戶端不能更新得到新的jar包。轉載于:https://www.cnblogs.com/silva/p/6264458.html

我的世界1.7.10java32位_我的世界1.7.10中文版

不知道怎么下載?點我游戲介紹《我的世界1.7.10》中整個世界由各種方塊構成,玩家可以破壞它們,也可以用自己的方塊隨意建造東西。為了在游戲里生存和發展,玩家需要通過伐木、挖礦、捕獵等方式獲取資源,并通過合成系統打…

python程序在函數內執行得更快

http://www.cnblogs.com/nepaul/archive/2012/07/15/2592179.html 為什么Python程序在函數內執行得更快?(來源StackOverflow) 考慮下面的代碼,一個在函數體內,一個是全局的代碼。 函數內的代碼執行效率為 1.8s 1234def…

USER_EXIT

1、md04的用戶出口 M61X0002 2、me21n/me22n的用戶出口 MM06E005 MBCF0002 3、migo 的用戶出口: MBCF0009 MBCF0002-> EXIT_SAPMM07M_001 4、co11n 的用戶出口,發料不足不允許報工時 EXIT_SAPLCORF_104 查找用戶出口的函數: MODX_FUNCTION…

subject.login(token)是如何確認賬號密碼的_教你如何刪除、關閉、注銷微信小程序...

微信小程序是我們日常生活中經常會接觸到的工具,打開小程序后,它就會留在我們微信的”“發現-小程序”欄。很多人并不知道該如何刪除、關閉小程序,所以今天就跟大家科普下相關問題。1.如何刪除小程序首先,打開微信界面&#xff0c…

上海交通大學2006年數學分析考研試題

轉載于:https://www.cnblogs.com/zhangzujin/p/4078900.html

saltstack 基礎入門文檔

saltstack 和 Puppet Chef 一樣可以讓你同時在多臺服務器上執行命令也包括安裝和配置軟件。Salt 有兩個主要的功能:配置管理和遠程執行。這里講述了saltstack的基本使用方法。 saltstack 簡述 Salt 和 Puppet Chef 一樣可以讓你同時在多臺服務器上執行命令也包括安裝…

出現的是亂碼_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 "…

mysql創建數據庫指定字符集

mysql 創建 數據庫時指定編碼很重要,很多開發者都使用了默認編碼,但是我使用的經驗來看,制定數據庫的編碼可以很大程度上避免倒入導出帶來的亂碼問題。 我們遵循的標準是,數據庫,表,字段和頁面或文本的編碼…

onclick實現超鏈接_給超鏈接加onclick事件

在動態網頁中,常常需要在單擊超鏈接時處理一些數據,而不是跳轉一個網頁。在這種情況下,通常有以下三種處理方式:不設置標簽的href屬性,只設置onclick屬性。在這種處理方式下,通常超鏈接文本會和正文的文本以…

Android 布局以及優化資料匯總

2019獨角獸企業重金招聘Python工程師標準>>> 1.性能優化之布局優化 2.Android 開源庫 V - Layout 轉載于:https://my.oschina.net/zhugenqiang/blog/822942

AS3容易被忽略的一些特性

1.給sprite設置背景色 給sprite設置背景色,spr.opaqueBackground 0xFFCC33, 在尺寸變化的時候自動重繪背景。需要注意的是背景不能接受鼠標事件,接受鼠標事件的話,需要用graphics繪制背景。 2.在ByteArray里writeUTF("中方漢字")&…

每天一個JavaScript實例-canvas繪圖

<!DOCTYPE html> <html> <head> <meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /> <title>每天一個JavaScript實例-canvas繪圖</title> <style>.canvas{width:600px;height:500px;} </s…

mysql字符集排序規則_Mysql 字符集及排序規則

一、字符集字符集&#xff1a;就是用來定義字符在數據庫中的編碼的集合。常見的字符集&#xff1a;utf8、Unicode、GBK、GB2312(支持中文)、ASCCI(不支持中文)二、字符集排序規則作者本人用的是utf8_general_ci后綴ci (case insensitive)意味不區分大小寫(大小寫不敏感)&#x…

驅動06.觸摸屏驅動程序

1.觸摸屏的簡介 觸摸屏是標準的輸入設備&#xff0c;在寫驅動程序時采用的之前講過的輸入子系統那套框架。我們無需關心對設備文件的操作&#xff0c;只需關心對硬件寄存器的操作和上報事件即可。 觸摸屏是附在LCD上的一層薄膜&#xff0c;并不是我們平時認識的觸摸屏&#xff…

編碼文件AndroidStudio初體驗:解決Execution failed for task ':TestAndroid:compileDebug'.

最近研究編碼文件&#xff0c;稍微總結一下&#xff0c;以后繼續補充&#xff1a; Execution failed for task :TestAndroid:compileDebug.有各種各樣原因&#xff0c;具體就請自己進cmd編譯看什么地方出錯 進入項目的gradle文件地點目錄打 gradlew compileDebug --stacktrace來…

我的大二

一不小心就已經大二了&#xff0c;時間真的過的很快&#xff0c;不知不覺和學長大大一起走過了7個多月~我是個很幸運的人&#xff0c;對此我感激所有人&#xff0c;尤其是那些愛我的&#xff0c;以及教會我做人&#xff0c;指引我許多的人們&#xff01; 不得不承認&#xff0c…