8000 added a classification algorithms folder · dingcx/pythonAlgorithms@039ff4a · GitHub
[go: up one dir, main page]

Skip to content

Commit 039ff4a

Browse files
committed
added a classification algorithms folder
1 parent 722817f commit 039ff4a

File tree

2 files changed

+77
-0
lines changed

2 files changed

+77
-0
lines changed

classification/fcm.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
from tools import *
2+
3+
# https://en.wikipedia.org/wiki/Fuzzy_clustering
4+
5+
6+
class FuzzyCMeans:
7+
def __init__(self, n_clusters, initial_centers, data, max_iter=250, m=2, error=1e-5):
8+
assert m > 1
9+
#assert initial_centers.shape[0] == n_clusters
10+
self.U = None
11+
self.centers = initial_centers
12+
self.max_iter = max_iter
13+
self.m = m
14+
self.error = error
15+
self.data = data
16+
17+
def membership(self, data, centers):
18+
U_temp = cdist(data, centers, 'euclidean')
19+
U_temp = numpy.power(U_temp, 2/(self.m - 1))
20+
denominator_ = U_temp.reshape(
21+
(data.shape[0], 1, -1)).repeat(U_temp.shape[-1], axis=1)
22+
denominator_ = U_temp[:, :, numpy.newaxis] / denominator_
23+
return 1 / denominator_.sum(2)
24+
25+
def Centers(self, data, U):
26+
um = U ** self.m
27+
return (data.T @ um / numpy.sum(um, axis=0)).T
28+
29+
def newImage(self, U, centers, im):
30+
best = numpy.argmax(self.U, axis=-1)
31+
# print(best)
32+
# numpy.round()
33+
image = im.astype(int)
34+
for i in range(256):
35+
image = numpy.where(image == float(i), centers[best[i]][0], image)
36+
return image
37+
38+
def compute(self):
39+
self.U = self.membership(self.data, self.centers)
40+
41+
past_U = numpy.copy(self.U)
42+
begin_time = datetime.datetime.now()
43+
for i in range(self.max_iter):
44+
45+
self.centers = self.Centers(self.data, self.U)
46+
self.U = self.membership(self.data, self.centers)
47+
48+
if norm(self.U - past_U) < self.error:
49+
break
50+
past_U = numpy.copy(self.U)
51+
x = datetime.datetime.now() - begin_time
52+
return self.centers, self.U, x
53+
54+
# that's how you run it, data being your data, and the other parameters being the basic FCM parameters such as numbe rof cluseters, degree of fuzziness and so on
55+
# f = FuzzyCMeans(n_clusters=C, initial_centers=Initial_centers,
56+
# data=data m=2, max_iter=1000, error=1e-5)
57+
# centers, U, time = f.compute()

classification/tools.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
from matplotlib.image import imread
2+
import matplotlib.pyplot as plt
3+
from math import sqrt
4+
import math
5+
import random
6+
import numpy
7+
import operator
8+
from scipy.spatial.distance import cdist
9+
from scipy.linalg import norm
10+
import datetime
11+
12+
13+
def Histogram(path):
14+
image = imread(path)
15+
if len(image.shape) != 2:
16+
def gray(rgb): return numpy.dot(rgb[..., :3], [0.2989, 0.5870, 0.1140])
17+
gray = gray(image)
18+
image = gray
19+
hist, bins = numpy.histogram(image.ravel(), 256, [0, 256])
20+
return adapt(hist)

0 commit comments

Comments
 (0)
0