Object subclass: #DhbAbstractDataServer instanceVariableNames: '' classVariableNames: '' poolDictionaries: ''! DhbAbstractDataServer subclass: #DhbMemoryBasedDataServer instanceVariableNames: 'data position ' classVariableNames: '' poolDictionaries: ''! Object subclass: #DhbCluster instanceVariableNames: 'accumulator previousSampleSize ' classVariableNames: '' poolDictionaries: ''! DhbCluster subclass: #DhbCovarianceCluster instanceVariableNames: 'center ' classVariableNames: '' poolDictionaries: ''! DhbCluster subclass: #DhbEuclideanCluster instanceVariableNames: 'center ' classVariableNames: '' poolDictionaries: ''! DhbIterativeProcess subclass: #DhbClusterFinder instanceVariableNames: 'dataServer dataSetSize minimumRelativeClusterSize ' classVariableNames: '' poolDictionaries: ''! Object subclass: #DhbMahalanobisCenter instanceVariableNames: 'center inverseCovariance accumulator ' classVariableNames: '' poolDictionaries: ''! Object subclass: #DhbVectorAccumulator instanceVariableNames: 'count average ' classVariableNames: '' poolDictionaries: ''! DhbVectorAccumulator subclass: #DhbCovarianceAccumulator instanceVariableNames: 'covariance ' classVariableNames: '' poolDictionaries: ''! SubApplication subclass: #DhbDataMining instanceVariableNames: '' classVariableNames: '' poolDictionaries: ''! !DhbAbstractDataServer publicMethods ! atEnd "Answers true if there is no more data element. (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 " self subclassResponsibility! close "Close the data stream (must be implemented by subclass). (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 "! next "Answers the next element on the stream. (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 " self subclassResponsibility! open "Open the data stream (must be implemented by subclass). (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 " self subclassResponsibility! reset "Reset the position of the data stream to the beginning. (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 " self subclassResponsibility! ! !DhbCluster class publicMethods ! new "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " ^super new initialize! ! !DhbCluster publicMethods ! accumulate: aVector "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " accumulator accumulate: aVector.! centerOn: aVector "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " self subclassResponsibility! changes "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " ^(self sampleSize - previousSampleSize) abs! distanceTo: aVector "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " ^self subclassResponsibility! isInsignificantIn: aClusterFinder "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/17/00 " ^self sampleSize <= aClusterFinder minimumClusterSize! isUndefined "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " ^self subclassResponsibility! reset "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " previousSampleSize := self sampleSize. self collectAccumulatorResults. accumulator reset! sampleSize "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " ^accumulator count! ! !DhbCluster privateMethods ! initialize "Private - (c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " previousSampleSize := 0. ^self! ! !DhbClusterFinder class publicMethods ! new: anInteger server: aClusterDataServer type: aClusterClass "(c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 " ^super new initialize: anInteger server: aClusterDataServer type: aClusterClass! ! !DhbClusterFinder publicMethods ! clusters: aCollectionOfClusters "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/18/00 " result := aCollectionOfClusters.! dataServer: aClusterDataServer "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/18/00 " dataServer := aClusterDataServer. ! evaluateIteration "Perform an accumulation of the data from the server. (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 " dataServer reset. dataSetSize := 0. [ dataServer atEnd] whileFalse:[ self accumulate: dataServer next. dataSetSize := dataSetSize + 1. ]. ^self collectChangesAndResetClusters ! finalizeIterations "Close the data server. (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 " dataServer close! initializeIterations "(c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 " dataServer open. result do: [:each | each isUndefined ifTrue: [each centerOn: dataServer next]]! minimumClusterSize ^(minimumRelativeClusterSize * dataSetSize) rounded! minimumRelativeClusterSize: aNumber "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " minimumRelativeClusterSize := aNumber max: 0.! printOn: aStream "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " aStream nextPutAll: 'Iterations: '. iterations printOn: aStream. result do: [ :each | aStream cr. each printOn: aStream].! ! !DhbClusterFinder privateMethods ! accumulate: aVector "Private - Accumulate aVector into the nearest cluster. (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 " ( result at: ( self indexOfNearestCluster: aVector)) accumulate: aVector.! collectChangesAndResetClusters "Private - (c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " | hasEmptyClusters changes | changes := 0. hasEmptyClusters := false. result do: [:each | changes := each changes + changes. ( each isInsignificantIn: self) ifTrue: [each centerOn: nil. hasEmptyClusters := true] ifFalse: [each reset]. ]. hasEmptyClusters ifTrue: [result := result reject: [:each | each isUndefined]]. ^changes / 2! indexOfNearestCluster: aVector "Private - Answers the index of the cluster nearest to aVector. (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 " | distance index | index := 1. distance := ( result at: 1) distanceTo: aVector. 2 to: result size do: [ :n | | x | x := ( result at: n) distanceTo: aVector. x < distance ifTrue: [ distance := x. index := n. ]. ]. ^index! initialize: anInteger server: aClusterDataServer type: aClusterClass "Private - (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 " self dataServer: aClusterDataServer. self clusters: ( (1 to: anInteger) collect: [ :n | aClusterClass new]). minimumRelativeClusterSize := 0. ^self! ! !DhbCovarianceAccumulator publicMethods ! accumulate: anArray "Accumulate anArray into the receiver. (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 8/3/99 " | delta count1 r| count1 := count. delta := super accumulate: anArray. r := count1 / count. 1 to: delta size do: [ :n | 1 to: n do: [ :m | ( covariance at: n) at: m put: ( count1 * ( delta at: n) * ( delta at: m) + ( r * ( ( covariance at: n) at: m))). ]. ].! covarianceMatrix "Answer a matrix containing the covariance of the accumulated data. (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 8/3/99 " | rows n | n := 0. rows := covariance collect: [ :row | n := n + 1. row, ( ( ( n + 1) to: covariance size) collect: [ :m | ( covariance at: m) at: n ])]. ^DhbSymmetricMatrix rows: rows! reset "Set all accumulators to zero. (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 8/3/99 " super reset. covariance do: [ :each | each atAllPut: 0].! ! !DhbCovarianceAccumulator privateMethods ! initialize: anInteger "Private - Initialize the receiver to accumulate vectors of dimension anInteger. (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 8/3/99 " covariance := ( ( 1 to: anInteger) collect: [ :n | DhbVector new: n]) asVector. ^super initialize: anInteger! ! !DhbCovarianceCluster publicMethods ! centerOn: aVector "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " accumulator := aVector ifNotNil: [ :v | DhbMahalanobisCenter onVector: v].! distanceTo: aVector "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " ^accumulator distanceTo: aVector! isUndefined "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " ^accumulator isNil! printOn: aStream "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " accumulator printOn: aStream.! ! !DhbCovarianceCluster privateMethods ! collectAccumulatorResults "Private - (c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " accumulator computeParameters.! ! !DhbEuclideanCluster publicMethods ! centerOn: aVector "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " center := aVector. accumulator := DhbVectorAccumulator new: aVector size.! distanceTo: aVector "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " ^( aVector - center) norm! isUndefined "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " ^center isNil! printOn: aStream "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " accumulator count printOn: aStream. aStream nextPutAll: ': '. center printOn: aStream.! ! !DhbEuclideanCluster privateMethods ! collectAccumulatorResults "Private - (c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " center := accumulator average copy.! ! !DhbMahalanobisCenter class publicMethods ! new: anInteger "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " ^self new initialize: anInteger! onVector: aVector "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " ^self new center: aVector! ! !DhbMahalanobisCenter publicMethods ! accumulate: aVector "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " accumulator accumulate: aVector.! computeParameters "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " center := accumulator average copy. inverseCovariance := accumulator covarianceMatrix inverse.! count "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " ^accumulator count! distanceTo: aVector "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " | delta | delta := aVector - center. ^delta * inverseCovariance * delta! printOn: aStream "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " accumulator count printOn: aStream. aStream nextPutAll: ': '. center printOn: aStream.! reset "Leave center and inverse covariant matrix untouched (c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " accumulator reset.! ! !DhbMahalanobisCenter privateMethods ! center: aVector "Private - (c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " accumulator := DhbCovarianceAccumulator new: aVector size. center := aVector. inverseCovariance := DhbSymmetricMatrix identity: aVector size. ^self! initialize: anInteger "Private - (c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " accumulator := DhbCovarianceAccumulator new: anInteger. ^self! ! !DhbMemoryBasedDataServer publicMethods ! atEnd "Answers true if there is no more data element. (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 " ^data size < position! data: anOrderedCollection "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " data := anOrderedCollection. self reset.! dimension "Answers the dimension of the vectors catered by the receiver. (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 " ^data first size! next "Answers the next element on the stream. (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 " | answer | answer := data at: position. position := position + 1. ^answer! open "Open the data stream (must be implemented by subclass). (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 " self reset! reset "Reset the position of the data stream to the beginning. (c) Copyrights Didier BESSET, 1999, all rights reserved. Initial code: 9/3/99 " position := 1.! ! !DhbVectorAccumulator class publicMethods ! new: anInteger "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " ^self new initialize: anInteger! ! !DhbVectorAccumulator publicMethods ! accumulate: aVectorOrArray "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " | delta | count := count + 1. delta := average - aVectorOrArray asVector scaleBy: 1 / count. average accumulateNegated: delta. ^delta! average "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " ^average! count "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " ^count! printOn: aStream "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " super printOn: aStream. aStream space. count printOn: aStream. aStream space. average printOn: aStream. ! reset "(c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " count := 0. average atAllPut: 0.! ! !DhbVectorAccumulator privateMethods ! initialize: anInteger "Private - (c) Copyrights Didier BESSET, 2000, all rights reserved. Initial code: 2/16/00 " average := DhbVector new: anInteger. self reset. ^self! ! DhbAbstractDataServer initializeAfterLoad! DhbMemoryBasedDataServer initializeAfterLoad! DhbCluster initializeAfterLoad! DhbCovarianceCluster initializeAfterLoad! DhbEuclideanCluster initializeAfterLoad! DhbClusterFinder initializeAfterLoad! DhbMahalanobisCenter initializeAfterLoad! DhbVectorAccumulator initializeAfterLoad! DhbCovarianceAccumulator initializeAfterLoad! DhbDataMining initializeAfterLoad!