Ⅰ python 怎麼可視化聚類的結果
、K均值聚類
K-Means演算法思想簡單,效果卻很好,是最有名的聚類演算法。聚類演算法的步驟如下:
1:初始化K個樣本野灶櫻作為初始聚類中心;
2:計算每個樣本點到K個中心的距離,選擇最近的中心作為其分類,直到所有樣本點分類完畢;
3:分別計算K個類中所有樣本的質心頌叢,作為新的中心點,完成一辯尺輪迭代。
通常的迭代結束條件為新的質心與之前的質心偏移值小於一
Ⅱ 121 11 個案例掌握 Python 數據可視化--星際探索
星空是無數人夢寐以求想了解的一個領域,遠古的人們通過肉眼觀察星空,並制定了太陰歷,指導農業發展。隨著現代科技發展,有了更先進的設備進行星空的探索。本實驗獲取了美國國家航空航天局(NASA)官網發布的地外行星數據,研究及可視化了地外行星各參數、尋找到了一顆類地行星並研究了天體參數的相關關系。
輸入並執行魔法命令 %matplotlib inline, 設置全局字型大小,去除圖例邊框,去除右側和頂部坐標軸。
本數據集來自 NASA,行星發現是 NASA 的重要工作之一,本數據集搜集了 NASA 官網發布的 4296 顆行星的數據,本數據集欄位包括:
導入數據並查看前 5 行。
截至 2020 年 10 月 22 日 全球共發現 4296 顆行星,按年聚合並繪制年度行星發現數,並在左上角繪制 NASA 的官方 LOGO 。
從運行結果可以看出,2005 年以前全球行星發現數是非常少的,經計算總計 173 顆,2014 和 2016 是行星發現成果最多的年份,2016 年度發現行星 1505 顆。
對不同機構/項目/計劃進行聚合並降序排列,繪制發現行星數目的前 20 。
2009 年至 2013 年,開普勒太空望遠鏡成為有史以來最成功的系外行星發現者。在一片天空中至少找到了 1030 顆系外行星以及超過 4600 顆疑似行星。當機械故障剝奪了該探測器對於恆星的精確定位功能後,地球上的工程師們於 2014 年對其進行了徹底改造,並以 K2 計劃命名,後者將在更短的時間內搜尋宇宙的另一片區域。
對發現行星的方式進行聚合並降序排列,繪制各種方法發現行星的比例,由於排名靠後的幾種方式發現行星數較少,因此不顯示其標簽。
行星在宇宙中並不會發光,因此無法直接觀察,行星發現的方式多為間接方式。從輸出結果可以看出,發現行星主要有以下 3 種方式,其原理如下:
針對不同的行星質量,繪制比其質量大(或者小)的行星比例,由於行星質量量綱分布跨度較大,因此採用對數坐標。
從輸出結果可以看出,在已發現的行星中,96.25% 行星的質量大於地球。(圖中橫坐標小於 e 的紅色面積非常小)
通過 sns.distplot 介面繪制全部行星的質量分布圖。
從輸出結果可以看出,所有行星質量分布呈雙峰分布,第一個峰在 1.8 左右(此處用了對數單位,表示大約 6 個地球質量),第二個峰在 6.2 左右(大概 493 個地球質量)。
針對不同發現方式發現的行星,繪制各行星的公轉周期和質量的關系。
從輸出結果可以看出:徑向速度(Radial Velocity)方法發現的行星在公轉周期和質量上分布更寬,而凌日(Transit)似乎只能發現公轉周期相對較短的行星,這是因為兩種方法的原理差異造成的。對於公轉周期很長的行星,其運行到恆星和觀察者之間的時間也較長,因此凌日發現此類行星會相對較少。而徑向速度與其說是在發現行星,不如說是在觀察恆星,由於恆星自身發光,因此其觀察機會更多,發現各類行星的可能性更大。
針對不同發現方式發現的行星,繪制各行星的距離和質量的關系。
從輸出結果可以看出,凌日和徑向速度對距離較為敏感,遠距離的行星大多是通過凌日發現的,而近距離的行星大多數通過徑向速度發現的。原因是:近距離的行星其引力對恆星造成的擺動更為明顯,因此更容易觀察;當距離較遠時,引力作用變弱,擺動效應減弱,因此很難藉助此方法觀察到行星。同時,可以觀察到當行星質量更大時,其距離分布相對較寬,這是因為雖然相對恆星的距離變長了,但是由於行星質量的增加,相對引力也同步增加,恆星擺動效應會變得明顯。
將所有行星的質量和半徑對數化處理,繪制其分布並擬合其分布。
由於:
因此,從原理上質量對數與半徑對數應該是線性關系,且斜率為定值 3 ,截距的大小與密度相關。
從輸出結果可以看出:行星質量和行星半徑在對數變換下,具有較好的線性關系。輸出 fix_xy 數值可知,其關系可以擬合出如下公式:
擬合出曲線對應的行星平均密度為:
同樣的方式繪制恆星質量與半徑的關系。
從輸出結果可以看出,恆星與行星的規律不同,其質量與半徑在對數下呈二次曲線關系,其關系符合以下公式:
同樣的方式研究恆星表面重力加速度與半徑的關系。
從輸出結果可以看出,恆星表面對數重力加速度與其對數半徑呈現較好的線性關系:
以上我們分別探索了各變數的分布和部分變數的相關關系,當數據較多時,可以通過 pd.plotting.scatter_matrix 介面,直接繪制各變數的分布和任意兩個變數的散點圖分布,對於數據的初步探索,該介面可以讓我們迅速對數據全貌有較為清晰的認識。
通過行星的半徑和質量,恆星的半徑和質量,以及行星的公轉周期等指標與地球的相似性,尋找諸多行星中最類似地球的行星。
從輸出結果可以看出,在 0.6 附近的位置出現了一個最大的圓圈,那就是我們找到的類地行星 Kepler - 452 b ,讓我們了解一下這顆行星:
數據顯示,Kepler - 452 b 行星公轉周期為 384.84 天,半徑為 1.63 地球半徑,質量為 3.29 地球質量;它的恆星為 Kepler - 452 半徑為太陽的 1.11 倍,質量為 1.04 倍,恆星方面數據與太陽相似度極高。
以下內容來自網路。 開普勒452b(Kepler 452b) ,是美國國家航空航天局(NASA)發現的外行星, 直徑是地球的 1.6 倍,地球相似指數( ESI )為 0.83,距離地球1400光年,位於為天鵝座。
2015 年 7 月 24 日 0:00,美國國家航空航天局 NASA 舉辦媒體電話會議宣稱,他們在天鵝座發現了一顆與地球相似指數達到 0.98 的類地行星開普勒 - 452 b。這個類地行星距離地球 1400 光年,繞著一顆與太陽非常相似的恆星運行。開普勒 452 b 到恆星的距離,跟地球到太陽的距離相同。NASA 稱,由於缺乏關鍵數據,現在不能說 Kepler - 452 b 究竟是不是「另外一個地球」,只能說它是「迄今最接近另外一個地球」的系外行星。
在銀河系經緯度坐標下繪制所有行星,並標記地球和 Kepler - 452 b 行星的位置。
類地行星,是人類寄希望移民的第二故鄉,但即使最近的 Kepler-452 b ,也與地球相聚 1400 光年。
以下通過行星的公轉周期和質量兩個特徵將所有行星聚為兩類,即通過訓練獲得兩個簇心。
定義函數-計算距離
聚類距離採用歐式距離:
定義函數-訓練簇心
訓練簇心的原理是:根據上一次的簇心計算所有點與所有簇心的距離,任一點的分類以其距離最近的簇心確定。依此原理計算出所有點的分類後,對每個分類計算新的簇心。
定義函數預測分類
根據訓練得到的簇心,預測輸入新的數據特徵的分類。
開始訓練
隨機生成一個簇心,並訓練 15 次。
繪制聚類結果
以最後一次訓練得到的簇心為基礎,進行行星的分類,並以等高面的形式繪制各類的邊界。
從運行結果可以看出,所有行星被分成了兩類。並通過上三角和下三角標注了每個類別的簇心位置。
聚類前
以下輸出了聚類前原始數據繪制的圖像。
Ⅲ 如何使用python.plot畫簡單的聚類結果圖
Ⅳ python數據做聚類分析,結果的圖怎麼在二維平面表示出來
python中用pdf_multivariate求解多維密度分布,然後用plot_surface畫三維曲面圖;
另外用matlab也!
Ⅳ python對數據進行聚類怎麼顯示數據分類
將其整理成數據集為:
[ [1,0,"yes"],[1,1,"yes"],[0,1,"yes"],[0,0,"no"],[1,0,"no"] ]
演算法過程:
1、計算原始的信息熵。
2、依次計算數據集中每個樣本的每個特徵的信息熵。
3、比較不同特徵信息熵的大小,選出信息熵最大的特徵值並輸出。
運行結果:
col : 0 curInfoGain : 2.37744375108 baseInfoGain : 0.0
col : 1 curInfoGain : 1.37744375108 baseInfoGain : 2.37744375108
bestInfoGain : 2.37744375108 bestFeature: 0
結果分析:
說明按照第一列,即有無喉結這個特徵來進行分類的效果更好。
思考:
1、能否利用決策樹演算法,將樣本最終的分類結果進行輸出?如樣本1,2,3屬於男性,4屬於女性。
2、示常式序生成的決策樹只有一層,當特徵量增多的時候,如何生成具有多層結構的決策樹?
3、如何評判分類結果的好壞?
在下一篇文章中,我將主要對以上三個問題進行分析和解答。如果您也感興趣,歡迎您訂閱我的文章,也可以在下方進行評論,如果有疑問或認為不對的地方,您也可以留言,我將積極與您進行解答。
完整代碼如下:
from math import log
"""
計算信息熵
"""
def calcEntropy(dataset):
diclabel = {} ## 標簽字典,用於記錄每個分類標簽出現的次數
for record in dataset:
label = record[-1]
if label not in diclabel.keys():
diclabel[label] = 0
diclabel[label] += 1
### 計算熵
entropy = 0.0
cnt = len(dataset)
for label in diclabel.keys():
prob = float(1.0 * diclabel[label]/cnt)
entropy -= prob * log(prob,2)
return entropy
def initDataSet():
dataset = [[1,0,"yes"],[1,1,"yes"],[0,1,"yes"],[0,0,"no"],[1,0,"no"]]
label = ["male","female"]
return dataset,label
#### 拆分dataset ,根據指定的過濾選項值,去掉指定的列形成一個新的數據集
def splitDataset(dataset , col, value):
retset = [] ## 拆分後的數據集
for record in dataset:
if record[col] == value :
recedFeatVec = record[:col]
recedFeatVec.extend(record[col+1:]) ### 將指定的列剔除
retset.append(recedFeatVec) ### 將新形成的特徵值列表追加到返回的列表中
return retset
### 找出信息熵增益最大的特徵值
### 參數:
### dataset : 原始的數據集
def findBestFeature(dataset):
numFeatures = len(dataset[0]) - 1 ### 特徵值的個數
baseEntropy = calcEntropy(dataset) ### 計算原始數據集的熵
baseInfoGain = 0.0 ### 初始信息增益
bestFeature = -1 ### 初始的最優分類特徵值索引
### 計算每個特徵值的熵
for col in range(numFeatures):
features = [record[col] for record in dataset] ### 提取每一列的特徵向量 如此處col= 0 ,則features = [1,1,0,0]
uniqueFeat = set(features)
curInfoGain = 0 ### 根據每一列進行拆分,所獲得的信息增益
for featVal in uniqueFeat:
subDataset = splitDataset(dataset,col,featVal) ### 根據col列的featVal特徵值來對數據集進行劃分
prob = 1.0 * len(subDataset)/numFeatures ### 計運算元特徵數據集所佔比例
curInfoGain += prob * calcEntropy(subDataset) ### 計算col列的特徵值featVal所產生的信息增益
# print "col : " ,col , " featVal : " , featVal , " curInfoGain :" ,curInfoGain ," baseInfoGain : " ,baseInfoGain
print "col : " ,col , " curInfoGain :" ,curInfoGain ," baseInfoGain : " ,baseInfoGain
if curInfoGain > baseInfoGain:
baseInfoGain = curInfoGain
bestFeature = col
return baseInfoGain,bestFeature ### 輸出最大的信息增益,以獲得該增益的列
dataset,label = initDataSet()
infogain , bestFeature = findBestFeature(dataset)
print "bestInfoGain :" , infogain, " bestFeature:",bestFeature
Ⅵ [譯] 高斯混合模型 --- python教程
本文翻譯自 https://jakevdp.github.io/PythonDataScienceHandbook/05.12-gaussian-mixtures.html
上一節中探討的k-means聚類模型簡單易懂,但其簡單性導致其應用中存在實際挑戰。具體而言,k-means的非概率特性及簡單地計算點與類蔟中心的歐式距離來判定歸屬,會導致其在許多真實的場景中性能較差。本節,我們將探討高斯混合模型(GMMs),其可以看成k-means的延伸,更可以看成一個強有力的估計工具,而不僅僅是聚類。
我們將以一個標準的import開始
我們看下k-means的缺陷,思考下如何提高聚類模型。正如上一節所示,給定簡單,易於分類的數據,k-means能找到合適的聚類結果。
舉例而言,假設我們有些簡單的數據點,k-means演算法能以某種方式很快地將它們聚類,跟我們肉眼分辨的結果很接近:
從直觀的角度來看,我可能期望聚類分配時,某些點比其他的更確定:舉例而言,中間兩個聚類之間似乎存在非常輕微的重疊,這樣我們可能對這些數據點的分配沒有完全的信心。不幸的是,k-means模型沒有聚類分配的概率或不確定性的內在度量(盡管可能使用bootstrap 的方式來估計這種不確定性)。為此,我們必須考慮泛化這種模型。
k-means模型的一種理解思路是,它在每個類蔟的中心放置了一個圈(或者,更高維度超球面),其半徑由聚類中最遠的點確定。該半徑充當訓練集中聚類分配的一個硬截斷:任何圈外的數據點不被視為該類的成員。我們可以使用以下函數可視化這個聚類模型:
觀察k-means的一個重要發現,這些聚類模式必須是圓形的。k-means沒有內置的方法來計算橢圓形或橢圓形的簇。因此,舉例而言,假設我們將相同的數據點作變換,這種聚類分配方式最終變得混亂:
高斯混合模型(GMM)試圖找到一個多維高斯概率分布的混合,以模擬任何輸入數據集。在最簡單的情況下,GMM可用於以與k-means相同的方式聚類。
但因為GMM包含概率模型,因此可以找到聚類分配的概率方式 - 在Scikit-Learn中,通過調用predict_proba方法實現。它將返回一個大小為[n_samples, n_clusters]的矩陣,用於衡量每個點屬於給定類別的概率:
我們可以可視化這種不確定性,比如每個點的大小與預測的確定性成比例;如下圖,我們可以看到正是群集之間邊界處的點反映了群集分配的不確定性:
本質上說,高斯混合模型與k-means非常相似:它使用期望-最大化的方式,定性地執行以下操作:
有了這個,我們可以看看四成分的GMM為我們的初始數據提供了什麼:
同樣,我們可以使用GMM方法來擬合我們的拉伸數據集;允許full的協方差,該模型甚至可以適應非常橢圓形,伸展的聚類模式:
這清楚地表明GMM解決了以前遇到的k-means的兩個主要實際問題。
如果看了之前擬合的細節,你將看到covariance_type選項在每個中都設置不同。該超參數控制每個類簇的形狀的自由度;對於任意給定的問題,必須仔細設置。默認值為covariance_type =「diag」,這意味著可以獨立設置沿每個維度的類蔟大小,並將得到的橢圓約束為與軸對齊。一個稍微簡單和快速的模型是covariance_type =「spherical」,它約束了類簇的形狀,使得所有維度都相等。盡管它並不完全等效,其產生的聚類將具有與k均值相似的特徵。更復雜且計算量更大的模型(特別是隨著維數的增長)是使用covariance_type =「full」,這允許將每個簇建模為具有任意方向的橢圓。
對於一個類蔟,下圖我們可以看到這三個選項的可視化表示:
盡管GMM通常被歸類為聚類演算法,但從根本上說它是一種密度估算演算法。也就是說,GMM適合某些數據的結果在技術上不是聚類模型,而是描述數據分布的生成概率模型。
例如,考慮一下Scikit-Learn的make_moons函數生成的一些數據:
如果我們嘗試用視為聚類模型的雙成分的GMM模擬數據,則結果不是特別有用:
但是如果我們使用更多成分的GMM模型,並忽視聚類的類別,我們會發現更接近輸入數據的擬合:
這里,16個高斯分布的混合不是為了找到分離的數據簇,而是為了對輸入數據的整體分布進行建模。這是分布的一個生成模型,這意味著GMM為我們提供了生成與我們的輸入類似分布的新隨機數據的方法。例如,以下是從這個16分量GMM擬合到我們原始數據的400個新點:
GMM非常方便,可以靈活地建模任意多維數據分布。
GMM是一種生成模型這一事實為我們提供了一種確定給定數據集的最佳組件數的自然方法。生成模型本質上是數據集的概率分布,因此我們可以簡單地評估模型下數據的可能性,使用交叉驗證來避免過度擬合。校正過度擬合的另一種方法是使用一些分析標准來調整模型可能性,例如 Akaike information criterion (AIC) 或 Bayesian information criterion (BIC) 。Scikit-Learn的GMM估計器實際上包含計算這兩者的內置方法,因此在這種方法上操作非常容易。
讓我們看看在moon數據集中,使用AIC和BIC函數確定GMM組件數量:
最佳的聚類數目是使得AIC或BIC最小化的值,具體取決於我們希望使用的近似值。 AIC告訴我們,我們上面選擇的16個組件可能太多了:大約8-12個組件可能是更好的選擇。與此類問題一樣,BIC建議使用更簡單的模型。
注意重點:這個組件數量的選擇衡量GMM作為密度估算器的效果,而不是它作為聚類演算法的效果。我鼓勵您將GMM主要視為密度估算器,並且只有在簡單數據集中保證時才將其用於聚類。
我們剛剛看到了一個使用GMM作為數據生成模型的簡單示例,以便根據輸入數據定義的分布創建新樣本。在這里,我們將運行這個想法,並從我們以前使用過的標准數字語料庫中生成新的手寫數字。
首先,讓我們使用Scikit-Learn的數據工具載入數字數據:
接下來讓我們繪制前100個,以准確回憶我們正在看的內容:
我們有64個維度的近1,800位數字,我們可以在這些位置上構建GMM以產生更多。 GMM可能難以在如此高維空間中收斂,因此我們將從數據上的可逆維數減少演算法開始。在這里,我們將使用一個簡單的PCA,要求它保留99%的預測數據方差:
結果是41個維度,減少了近1/3,幾乎沒有信息丟失。根據這些預測數據,讓我們使用AIC來計算我們應該使用的GMM組件的數量:
似乎大約110個components最小化了AIC;我們將使用這個模型。我們迅速將其與數據擬合並確保它已收斂合:
現在我們可以使用GMM作為生成模型在這個41維投影空間內繪制100個新點的樣本:
最後,我們可以使用PCA對象的逆變換來構造新的數字:
大部分結果看起來像數據集中合理的數字!
考慮一下我們在這里做了什麼:給定一個手寫數字的樣本,我們已經模擬了數據的分布,這樣我們就可以從數據中生成全新的數字樣本:這些是「手寫數字」,不是單獨的出現在原始數據集中,而是捕獲混合模型建模的輸入數據的一般特徵。這種數字生成模型可以證明作為貝葉斯生成分類器的一個組成部分非常有用,我們將在下一節中看到。
Ⅶ 如何用python對文本進行聚類
實現原理:
首先從Tourist_spots_5A_BD.txt中讀取景點信息,然後通過調用無界面瀏覽器PhantomJS(Firefox可替代)訪問網路鏈接"http://ke..com/",通過Selenium獲取輸入對話框ID,輸入關鍵詞如"故宮",再訪問該網路頁面。最後通過分析DOM樹結構獲取摘要的ID並獲取其值。核心代碼如下:
driver.find_elements_by_xpath("//div[@class='lemma-summary']/div")
PS:Selenium更多應用於自動化測試,推薦Python爬蟲使用scrapy等開源工具。
# coding=utf-8
"""
Created on 2015-09-04 @author: Eastmount
"""
import time
import re
import os
import sys
import codecs
import shutil
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import selenium.webdriver.support.ui as ui
from selenium.webdriver.common.action_chains import ActionChains
#Open PhantomJS
driver = webdriver.PhantomJS(executable_path="G:\phantomjs-1.9.1-windows\phantomjs.exe")
#driver = webdriver.Firefox()
wait = ui.WebDriverWait(driver,10)
#Get the Content of 5A tourist spots
def getInfobox(entityName, fileName):
try:
#create paths and txt files
print u'文件名稱: ', fileName
info = codecs.open(fileName, 'w', 'utf-8')
#locate input notice: 1.visit url by unicode 2.write files
#Error: Message: Element not found in the cache -
# Perhaps the page has changed since it was looked up
#解決方法: 使用Selenium和Phantomjs
print u'實體名稱: ', entityName.rstrip('\n')
driver.get("http://ke..com/")
elem_inp = driver.find_element_by_xpath("//form[@id='searchForm']/input")
elem_inp.send_keys(entityName)
elem_inp.send_keys(Keys.RETURN)
info.write(entityName.rstrip('\n')+'\r\n') #codecs不支持'\n'換行
time.sleep(2)
#load content 摘要
elem_value = driver.find_elements_by_xpath("//div[@class='lemma-summary']/div")
for value in elem_value:
print value.text
info.writelines(value.text + '\r\n')
time.sleep(2)
except Exception,e: #'utf8' codec can't decode byte
print "Error: ",e
finally:
print '\n'
info.close()
#Main function
def main():
#By function get information
path = "BaiSpider\\"
if os.path.isdir(path):
shutil.rmtree(path, True)
os.makedirs(path)
source = open("Tourist_spots_5A_BD.txt", 'r')
num = 1
for entityName in source:
entityName = unicode(entityName, "utf-8")
if u'故宮' in entityName: #else add a '?'
entityName = u'北京故宮'
name = "%04d" % num
fileName = path + str(name) + ".txt"
getInfobox(entityName, fileName)
num = num + 1
print 'End Read Files!'
source.close()
driver.close()
if __name__ == '__main__':
main()
Ⅷ 如何用Python對人員軌跡聚類
把你的 xy 變換成 onehot編碼 ,這樣的話 聚類演算法就都可以兼容了,
KMeans, DBScan, 層次聚類,等等都是可以的
Ⅸ pythonr型聚類和q型聚類圖怎麼看
pythonr型聚類和q型聚類圖要從數據挖掘的悉旁備則角度看。pythonr型聚類和q型聚類是一種定量方法,可以從數據挖掘的角度來看。q型聚類是對樣本進行定量分析的多元統計方法,可以分為劃分聚類、層次聚類、基於密度睜滾橡的聚類、基於網格的聚類。