騷氣的Python之k means演算法

2021-08-11 05:25:02 字數 2684 閱讀 4054

####1.回顧

上次對驗證碼進行了去噪和灰度化,這次對它進一步地分類處理,這裡用顏色區分,顯然是分成4個類

####2.**

關於演算法原理我就不多說,下面看**

#encoding=utf-8

from pil import image

import math

import copy

import random

class pixel(object):

def __init__(self,x,y):

self.x = x

self.y = y

self.child = # 儲存歸屬該類的xy值

def getdistance(self,p): # 獲取距離

return math.sqrt(((self.x - p.x)**2 +(self.y - p.y)**2))

@property

def xy(self): # 獲取xy

return (self.x,self.y)

@property

def minx(self): # 獲取屬於該類的最小x值

return min([i[0] for i in self.child])

@property

def maxx(self):

return max([i[0] for i in self.child])+1

@property

def miny(self):

return min([i[1] for i in self.child])

@property

def maxy(self):

return max([i[1] for i in self.child])+1

@property

def shape(self): # 獲取該類方形分布,左上角,右下角

return (self.minx,self.miny,self.maxx,self.maxy)

# 獲取有用畫素點

def getpixelarr(img):

pixelarr =

for x in range(img.size[0]):

for y in range(img.size[1]):

rgb = img.getpixel((x,y))

if rgb == (0,0,0):

return pixelarr

# 對點分類

def divideclass(img,n):

pixelarr = getpixelarr(img)

minx = min([i.x for i in pixelarr])

maxx = max([i.x for i in pixelarr])

c = (maxx - minx)/n

y = img.size[1]/2.0

k =

for i in range(n):

showk(k)

for *** in range(10): #進行10輪計算

print ***

for i in pixelarr:

dis = 1000

p = k[0]

for j in k:

if i.getdistance(j)=7:

return k

k = calck(k)

return k

def showk(k):

print 'k:'

for i in k:

print i.xy

# 重新計算k

def calck(k):

arr =

for i in k:

d = reduce(lambda a,b:(a[0]+b[0],a[1]+b[1]),i.child)

n = len(i.child)

return arr

def main():

img = image.open("c:/fafu/tif2/19.tif").convert('rgb') # 請新增一張tif格式的

classarr = divideclass(img,4) # 分類

c = [(255,0,0),(255,0,255),(0,0,255),(0,0,0),(199,97,20)] # rgb陣列

for n,i in enumerate(classarr):

for xy in i.child:

img.putpixel(xy,c[n%5])

img.show()

if __name__=="__main__":

main()

###3.總結

本來一開始我用的是層次聚類自頂向下,後來發現效果並不好,有時會聚成3個類,有時5個,不知道是我原理弄錯了,還是特殊情況.k-means聚類呢,效率高適合處理有明顯的分界線的資料,但是對球面資料就無可奈何了.另外附一張圖檢驗實驗成果

騷氣的Python之heapq的使用

官網文件 heapq.heapify x 把 list 堆排序 下文中引數裡的 heap 都是由這一步得到的 list,如果未先 heapify 會出現錯誤 import heapq a 2,4,1,5,6,3 heapq.heapify a print a 1,4,2,5,6,3 heapq.im...

騷氣的Python之大頂堆演算法

大頂堆是一種結合二叉樹的排序演算法,平均時間複雜度為 nlogn 不清楚該演算法的可以先看詳細的介紹 coding utf 8 class heaptree object leftchild none rightchild none value none 排好順序的節點設定不可訪問 visitabl...

機器學習實戰之KMean

kmeans演算法步驟 1.確定聚類個數k 2.隨機選擇k個質心 3.對於所有樣本點 根據樣本點到質心的距離分類 4.分類完成後,如果所有樣本點的類別沒有變化,演算法結束 如果有變化,重新計算質心 當前類中樣本的平均值 回到步驟3 幾個問題 1.聚類個數k的確定 2.初始時質心的選取 3.容易出現區...